Problem mit Unterprogrammen
-
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:)
-
Es gibt mehrere Varianten, mit Standardbibliotheksfunktionen Leerzeichen mit einzulesen:
z.B.if( 1==scanf("%80[^\n]",text) ) { printf("\n==%s==",text); }
oder
if( fgets(text,81,stdin) ) { if( strchr(text,'\n') ) *strchr(text,'\n')=0; printf("\n==%s==",text); }
oder
...
wobei in beiden Beispielen zu beachten ist, dass der Ergebnisstring kein '\n' enthält, was meist auch nicht gewollt, leider oftmals aber diese Sonderbehandlung vergessen wird.
-
sie werden immer noch nicht mitgelesen..es werden eher teile abgeschnitten..
-
Am besten zeigst du nochmal, wie dein Programm jetzt aussieht.
Ohne .. , denn da können ja auch die Fehler sein.Oder probier ein Miniprogramm.
#include <stdio.h> #include <string.h> int main(void) { char text[81] = ""; if( fgets(text,81,stdin) ) { if( strchr(text,'\n') ) *strchr(text,'\n')=0; printf("\n==%s==",text); } printf("\nLänge von <%s> = %lu\n", text, strlen(text)); return 0; }