Problem mit Unterprogrammen
-
Hallo,
ich brauch unbedingt eure Hilfe..
ich komme einfach nicht mit Unterprogrammen klar..
ich habe main und da werden eig nur 3 Funktionen aufgerufen..
es wird zuvor ein buchstabe eingegeben womit entschieden wird welches unterprogramm aufgerufen wird..
ich weiss jetzt nur folgendes:void funktion1 (was soll hier hin kommen?)
bei dem programm geht es darum das ein text kodiert, dekodiert werden soll..
hier das programm hat allerdings noch fehler wegen dem 2-dimensionalen array und der funktionen..ich glaube wenn ich das mit den funktionen hinbekomm klappts:)
vielen danke für eure hilfe im vorraus:)
// ZeichenCodierung.cpp: Hauptprojektdatei. #include "stdafx.h" #include <stdio.h> #include "vsconio.h" #include "codechar.h" #include "string.h" void kodieren(void); void dekodieren(void); void testdekodieren(char text); int main(void) { char dummy[81]; int task; do { clrscr(); printf("Top Secret --- Private Note Dekoder --- Top Secret J.S. & J.W.\n" "==================================================\n\n" "Task: E-Ende K-Kodieren D-Dekodieren T-Testdekodierung" "(nach K) ->"); gets(task); gets(dummy); switch(task) { case'k' : case'K': kodieren (void); break; case'd' : case'D': dekodieren (void); break; case't' : case'T': testdekodieren (char text); break; } }while(task != 'e' || task != 'E'); return 0; } //------------------------------------------------------------------- //Kodieren: void kodieren(void) { char text[81]; int schieben; int laenge; int i, z, s; char code[81]; int spalten, zeilen; char dummy[81]; char tabelle[81][81]; printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n" "->"); gets(text); printf("\nKodierstufe 1: Zeichen um 0..89 Positionen Modulo verschieben\n" "Eingabe Anzahl der Schiebepositonen -> "); scanf( "%d",&schieben); if(schieben < 0) schieben = 0; if(schieben > 89) schieben = 89; //1. Kodierstufe: laenge = strlen[text]; printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->", laenge); for(i=0; i<laenge; i++) { code[i] = CodeTab[ text[i] ]; code[i] =(CODECHARANZ + code[i] + spalten)%CODECHARANZ; code[i] = DecodeTab[ code[i] ]; printf("%c",code[i]); } //2.Kodierstufe: printf("Kodierstufe 2: Zeichen zeilenweise in Feld eintragen und spaltenweise" "ausgeben.\n" "Eingabe der Spaltenzahl (2..15) -> "); scanf ("%d",&spalten); gets(dummy); for(zeilen = 1; (zeilen*spalten < laenge); zeilen++) if(zeilen>15) zeilen=15; if(spalten<2) spalten=2; if(spalten>15) spalten=15; //Vorbelegen mit Füllzeichen: for(s=0;s<15;s++) { for(z=0;z<15;z++) { tabelle[z][s]='~'; } } //Einlesen: for(i = 0, z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; i++, s++) { if(i < laenge) tabelle[z][s] = text[i]; } } printf("Ergebnis Kodierstufe 2: Kodezahl (ShiftZeilenSpalten) : %02d%02d%02d\n" "->",schieben,zeilen,spalten); //Auslesen: for(i = 0, s = 0; s <= spalten; s++) { for(z = 0; z <= zeilen; i++, z++) { if(tabelle[z][s] != '~') { text[i] = tabelle[z][s]; printf("%c", text[i]); } else i= i-1; } } printf("<-\n\n\n[return]"); gets(dummy); } //-------------------------------------------------------- //Dekodieren: void dekodiere(void) { char dummy[81]; int schieben, spalten, zeilen; char text[81]; printf("Dekodierung: Eingabe der Kodezahl (nnnnnn)\n" "->"); scanf ("%02d%02d%02d",&schieben,&zeilen,&spalten); printf("\n\nEingabe des zu kodierenden Textes\n" "->"); scanf ("%c",&text); testdekodieren(char text); gets(dummy); } //-------------------------------------------------------------- //Testdekodieren: void testdekodieren(char text) { int schieben; int laenge; int i, z, s; char code; int spalten, zeilen; char dummy[81]; char tabelle[81][81]; laenge = strlen[text]; printf("\n\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n" "->",laenge); for(z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; s++) { tabelle[z][s]='~'; } } //Belegen mit dummys for(i = 0, z = 0; z < zeilen; z++) { for(s = 0; s < spalten; i++, s++) { if(i < laenge) tabelle[z][s] = '%'; //Eintragen des Codes in die Tabelle for(i = 0, s = 0; s <= spalten; s++) { for(z = 0; z <= zeilen; z++, i++) { if(tabelle[z][s] != '~') tabelle[z][s] = text[i]; else { z = 0; s++; tabelle[z][s] = text[i]; } } } //Auslesen des Codes for(i = 0, z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; s++, i++) { if(i < laenge && tabelle[z][s] != '%') { text[i] = tabelle[z][s]; printf("%c", text[i]); } } } printf("<-\n\n"); //Dekodierungstufe1: printf("Ergebnis Dekodierung Stufe 1:\n" "->"); for(i=0; i<laenge; i++) { code[i] = CodeTab[ text[i] ]; code[i] =(CODECHARANZ + code[i] - spalten)%CODECHARANZ; code[i] = DecodeTab[ code[i] ]; printf("%c",code[i]); } printf("<-\n\n[return]"); gets(dummy); }
-
Tausch mal
testdekodieren(char text); // Funktionsdeklaration testdekodieren(text); // Funktionsaufruf void testdekodieren(char text) // Übergabe eines einzelnen chars { //.. } void testdekodieren(const char* text) // Übergabe eines Arrays, const, da es nicht verändert wird { //.. }
Es könnten noch mehr Fehler drin sein, das ist mir jetzt als erstes aufgefallen.
-
void funktion1 (was soll hier hin kommen?)
Da sollen die Parameterliste hin.
Funktionen bearbeiten/verarbeiten i.A. die ihnen übergebenen Daten.
Also muss die Funktion auch wissen welchen Typ die Parameter haben und wie diese in der Funktion angesprochen werden.Funktionen kann man an den runden Klammern erkennen.
Arrays/Felder/Vektoren erkennt man übrigens an den eckigen Klammern.PS: Da steht alles in deinem C-Buch/Turtorial.
PPS: strlen ist eine Funktion, kein Vektor.
-
Danke für die Tips:)
Ich verstehe einen Fehler im Programm nicht, der immer und immer wieder auftritt:
zB in Zeile 101: Index erfordert ein Array oder einen Zeigertyp
das tritt überall da auf, wo die eckigen Klammer mit dem i sind zb : text[i]..
wo ist der fehler?ich verstehs einfach nicht, text und code1 sind doch als array deklariert..
tut mir leid, dass ich so begriffsstutzig bin:(
-
lizzty schrieb:
Ich verstehe einen Fehler im Programm nicht, der immer und immer wieder auftritt:
zB in Zeile 101: Index erfordert ein Array oder einen Zeigertyp
das tritt überall da auf, wo die eckigen Klammer mit dem i sind zb : text[i]..
Ich denke, gerade in Zeile 101 tritt er nicht auf, denn da passt's.
Aber in Zeile 179 beispielsweise ist text ein einfacher char, kein Array.
Ich rate dir aber dringend, die Fehler der Reihe nach abzuarbeiten. Fang mal mit dem Aufruf von gets mit einem int an. Und dann merk dir, dass man bei Funktionsaufrufen keine Parametertypen hinschreibt.
-
Doch da tritt er gerade auf..er mag das i nicht aber warum?das sind die letzten fehler..
-
lizzty schrieb:
Doch da tritt er gerade auf..er mag das i nicht aber warum?
Meiner mag's.
lizzty schrieb:
das sind die letzten fehler..
Fang mit dem ersten Fehler an. Manchmal kommt der Compiler nach vielen Fehlern durcheinander.
-
Das sind meine ersten Fehler:
.\zeichencode.cpp(29) : error C2664: 'dekodieren': Konvertierung des Parameters 1 von 'char [81]' in 'char' nicht möglich
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist.\zeichencode.cpp(30) : error C2664: 'testdekodieren': Konvertierung des Parameters 1 von 'char [81]' in 'char' nicht möglich
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist.\zeichencode.cpp(63) : error C2664: 'strlen': Konvertierung des Parameters 1 von 'char' in 'const char *' nicht möglich
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformatvoid kodieren(char text); void dekodieren(char text); void testdekodieren(char text); int main(void) { char dummy[81]; int task; char geheimtext[81]; do { clrscr(); printf("Top Secret --- Private Note Dekoder --- Top Secret J.S. & J.W.\n" "==================================================\n\n" "Task: E-Ende K-Kodieren D-Dekodieren T-Testdekodierung" "(nach K) ->"); scanf("%s", &task); gets(dummy); if( task == 'k' || task == 'K' ) kodieren (geheimtext); else if( task == 'd' || task == 'D' ) dekodieren (geheimtext); else if( task == 't' || task == 'T' ) testdekodieren (geheimtext); }while(task != 'e' || task != 'E'); return 0; }
das versteh ich schon nicht..ich komm damit einfach nicht klar-.-
-
lizzty schrieb:
error C2664: 'dekodieren': Konvertierung des Parameters 1 von 'char [81]' in 'char' nicht möglich
Du hast dekodieren deklariert als eine Funktion, die einen char-Parameter hat. Du übergibst ein char-Array. Passt nicht.
lizzty schrieb:
error C2664: 'testdekodieren': Konvertierung des Parameters 1 von 'char [81]' in 'char' nicht möglich
Du hast testdekodieren deklariert als eine Funktion, die einen char-Parameter hat. Du übergibst ein char-Array. Passt nicht.
lizzty schrieb:
error C2664: 'strlen': Konvertierung des Parameters 1 von 'char' in 'const char *' nicht möglich
Da fehlt jetzt der Code dazu. Aber die Fehlermeldung ist eindeutig. Du rufst strlen mit einem char auf, die Funktion erwartet aber einen char-Zeiger.
-
ich bin noch anfänger und programmiere das erste mal mit unterprogrammen und arrays..deswegen weiss ich leider nicht was das heisst
-
Deine Fehlermeldungen beziehen sich auf Zeile 29, 30 und 63.
Die hast du aber gar nicht gepostet. Das Listing aus dem ersten Post ist ja nicht mehr aktuell.Abgesehen davon hast du das elegantere switch durch if then else if ersetzt. (:( Meine Meinung)
-
lizzty schrieb:
ich bin noch anfänger und programmiere das erste mal mit unterprogrammen und arrays..deswegen weiss ich leider nicht was das heisst
Unterprogramme nennt man in C Funktionen. Wenn du Funktionen aufrufst, müssen die Typen der Parameter übereinstimmen oder zumindest umwandelbar sein.
Du hast deine drei Funktion mit dem Parametertypen char deklariert. Ein char entspricht einem einzelnen Zeichen. Du rufst die Funktionen allerdings mit einem char-Array auf, das entspricht in C einer Zeichenkette.
Und da der Compiler nicht weiß, wie er aus einem Array von chars ein einzelnes char machen soll, beklagt er sich.
Vermutlich sollen die Funktionen gar nicht mit einzelnen Zeichen, sondern mit Zeichenketten arbeiten, oder?
-
es gab dadurch nur noch mehr fehlermeldungen:(
// ZeichenCodierung.cpp: Hauptprojektdatei. #include "stdafx.h" #include <stdio.h> #include "vsconio.h" #include "codechar.h" #include "string.h" void kodieren(char text); void dekodieren(char text); void testdekodieren(char text); int main(void) { char dummy[81]; int task; char geheimtext[81]; do { clrscr(); printf("Top Secret --- Private Note Dekoder --- Top Secret J.S. & J.W.\n" "==================================================\n\n" "Task: E-Ende K-Kodieren D-Dekodieren T-Testdekodierung" "(nach K) ->"); scanf("%s", &task); gets(dummy); if( task == 'k' || task == 'K' ) kodieren (geheimtext); else if( task == 'd' || task == 'D' ) dekodieren (geheimtext); else if( task == 't' || task == 'T' ) testdekodieren (geheimtext); }while(task != 'e' || task != 'E'); return 0; } //------------------------------------------------------------------- //Kodieren: void kodieren(char text) { int schieben; int laenge; int i, z, s; int spalten, zeilen; char dummy[81]; char a; char tabelle[81][81]; printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n" "->"); scanf("%s",&text); printf("\nKodierstufe 1: Zeichen um 0..89 Positionen Modulo verschieben\n" "Eingabe Anzahl der Schiebepositonen -> "); scanf( "%d",&schieben); if(schieben < 0) schieben = 0; if(schieben > 89) schieben = 89; //1. Kodierstufe: laenge = strlen(text); printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->", laenge); for(i=0; i<laenge; i++) { a = text[i]; a = CodeTab[ a ]; a =(CODECHARANZ + a + spalten)%CODECHARANZ; a = DecodeTab[ a ]; printf("%c",a); } //2.Kodierstufe: printf("Kodierstufe 2: Zeichen zeilenweise in Feld eintragen und spaltenweise" "ausgeben.\n" "Eingabe der Spaltenzahl (2..15) -> "); scanf ("%d",&spalten); gets(dummy); for(zeilen = 1; (zeilen*spalten < laenge); zeilen++) if(zeilen>15) zeilen=15; if(spalten<2) spalten=2; if(spalten>15) spalten=15; //Vorbelegen mit Füllzeichen: for(s=0;s<15;s++) { for(z=0;z<15;z++) { tabelle[z][s]='~'; } } //Einlesen: for(i = 0, z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; i++, s++) { if(i < laenge) tabelle[z][s] = text[i]; } } printf("Ergebnis Kodierstufe 2: Kodezahl (ShiftZeilenSpalten) : %02d%02d%02d\n" "->",schieben,zeilen,spalten); //Auslesen: for(i = 0, s = 0; s <= spalten; s++) { for(z = 0; z <= zeilen; i++, z++) { if(tabelle[z][s] != '~') { text[i] = tabelle[z][s]; printf("%c", text[i]); } else i= i-1; } } printf("<-\n\n\n[return]"); gets(dummy); } //-------------------------------------------------------- //Dekodieren: void dekodiere(char text) { char dummy[81]; int schieben, spalten, zeilen; printf("Dekodierung: Eingabe der Kodezahl (nnnnnn)\n" "->"); scanf ("%02d%02d%02d",&schieben,&zeilen,&spalten); printf("\n\nEingabe des zu kodierenden Textes\n" "->"); scanf ("%c",&text);gets(dummy); testdekodieren(unsigned char text); gets(dummy); } //-------------------------------------------------------------- //Testdekodieren: void testdekodieren(char text) { int schieben; int laenge; int i, z, s; char code; int spalten, zeilen; char dummy[81]; char tabelle[81][81]; laenge = strlen(text); printf("\n\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n" "->",laenge); for(z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; s++) { tabelle[z][s]='~'; } } //Belegen mit dummys for(i = 0, z = 0; z < zeilen; z++) { for(s = 0; s < spalten; i++, s++) { if(i < laenge) tabelle[z][s] = '%'; //Eintragen des Codes in die Tabelle for(i = 0, s = 0; s <= spalten; s++) { for(z = 0; z <= zeilen; z++, i++) { if(tabelle[z][s] != '~') tabelle[z][s] = text[i]; else { z = 0; s++; tabelle[z][s] = text[i]; } } } //Auslesen des Codes for(i = 0, z = 0; z <= zeilen; z++) { for(s = 0; s <= spalten; s++, i++) { if(i < laenge && tabelle[z][s] != '%') { text[i] = tabelle[z][s]; printf("%c", text[i]); } } } printf("<-\n\n"); //Dekodierungstufe1: printf("Ergebnis Dekodierung Stufe 1:\n" "->"); for(i=0; i<laenge; i++) { text[i] = CodeTab[ text[i] ]; text[i] =(CODECHARANZ + text[i] - spalten)%CODECHARANZ; text[i] = DecodeTab[ text[i] ]; printf("%c",text[i]); } printf("<-\n\n[return]"); gets(dummy); }
-
ja genau aber wie mach ich das? schreib ich kodieren(char text [81]) oder wie?:)
vielen dank für die hilfe:)
-
lizzty schrieb:
ja genau aber wie mach ich das? schreib ich kodieren(char text [81]) oder wie?:)
Da wird's jetzt etwas eklig. Eigentlich gibt es keine Array-Funktionsparameter. In der Funktion kommt immer nur ein Zeiger auf das erste Element an, auch wenn du den Parameter als Array deklarierst. Auch eine Größenangabe ist wirkungslos. Der entscheidende Effekt ist, dass die Größeninformation, die ein Array in sich trägt, damit weg ist. Der Zeiger weiß nicht, wie groß das Array ist, auf das er zeigt.
Das ist nicht weiter tragisch, man muss es nur wissen.
Du kannst deine Funktionen also mit dem Parametertypen char* deklarieren. Aber wenn du irgendwo in den Funktionen die Arraygröße brauchst, musst du sie in einem separaten Parameter übergeben.
-
lizzty schrieb:
... schreib ich kodieren(char text [81]) oder wie?:)
Also char text[81] bedeutet, das du ein Feld mit 81 Elementen vom Typ char hast.
Diese Elemente sind durchnummeriert von 0 bis 80.Das erste Element wird angesprochen mit text[0]
Das 20. Element mit text[19]
Mit dem Namen text sprichst du das ganze Feld an.Das kodieren() den typ char braucht ist schon bei der Definition klar. Das brauchst du beim Aufruf der Funktion nicht mehr mitangeben.
Da in deiner Funktion kodieren von strlen(text) die Rede ist meinst du:
void kodieren(char text[]);
Damit arbeitest du mit dem gesamten Feld.
Zusatzinfo zu dem Post von MFK:
void kodieren(char *text);
bewirkt das gleiche wie mein Vorschlag.
Die Längeninformation bei Strings wird in C durch das Nullzeichen ermittelt.
Z.B.: strlen sucht solange bis ein Zeichen in dem Feld den Wert 0 hat.
-
Ihr habt wirklich super geholfen!!!
Vielen vielen Dank!!!
Es werden keine Fehler mehr angezeigt..jedoch bricht das Programm da ab, wo die Länge eines Arrays berechnet werden soll:char text[81]; .. laenge = strlen(text); //auch schon ausprobiert: laenge = strlen((const char *)text);
wo liegt bloss schon wieder der fehler?:(
-
Passiert denn bei den .. etws mit text?
Oh Moment du machst
scanf("%s",&text);
Da text schon als Zeiger funktioniert ist das & zuviel.
Mach mal
char text[81] = ""; int laenge; .. scanf("%s",text) .. laenge = strlen(text);
In diesem Fall war in text kein 0 Zeichen und strlen hat sich dumm und dusselig gesucht.
(Bei scanf( "%d",&schieben); ist das & aber richtig)
-
Es wird aber nur bis zum ersten Leerzeichen gezählt..
zb bei "Ich lerne C !" gibt er 3 aus..
kann man das ändern?
-
Ja.
-
entschuldigung..
könnte mri eventuell jemand sagen wie man es ändern kann?
Vielen dank:)