bmg4ever Geschrieben 16. März 2005 Geschrieben 16. März 2005 also ich habe folgende funktion: bool addspace(char ***array, int length, int elcount) //gibt im Erfolgsfall 1 zurück //im Fehlerfall wird -1 zurückgegeben. { if (*array == NULL) //init array { *array = (char **)malloc(1 * sizeof(char*)); if (*array == NULL) return 0; *array[0] = (char *)malloc(length + sizeof(char)); if (*array[0] == NULL) return 0; return 1; } else //add to existing array { *array = (char **)realloc(*array, 1 * sizeof(char*)); if (*array == NULL) return 0; *array[elcount] = (char *)malloc(length + sizeof(char)); if (*array[elcount] == NULL) return 0; return 1; } } [/PHP] und nun mein Problem. in elcount wird die anzahl der bisherigen elemente übergeben. in length die länge des string, den man bruacht und natürlich eine referenz auf das lokale array names (hier also char ***array) damit auch nach der Funktion schön alle änderungen übernommen sind. So nun klappt das initialisieren einwandfrei und das erste Element wird danach in der main-funktion auch wunderbar eingelesen. allerdings schmiert dioe Funktion immer in der Zeile ---------------------------------------------------------- *array[elcount] = (char *)malloc(length + sizeof(char)); ---------------------------------------------------------- mit der Meldung einer acess-violation ab. elcount ist laut debugger auf 1 (also es soll jetzt das zweite element hinzugefügt werden). aber anscheinend läuft was mit realloc schief, obwohl der Rückgabewert nicht NULL ist.... also ich versteh das nicht mehr. vielleicht kann mir einer von euch helfen und spart euch bitte solche antworten, wie "warum du nicht strings...". Zitieren
Biese Geschrieben 16. März 2005 Geschrieben 16. März 2005 Hi, ich hoffe, den Code richtig verstanden zu haben. Auch wenn ich kein PHP kann, sieht C sehr ähnlich. Bei Malloc gibst Du also freizugebenden Speicherplatz an malloc(length + sizeof(char)); Der Sinn sollte denke ich sein, dass du (length * sizeof(char)) angibst. Denn dann wird tatsächlich die n-fache Länge eines char freigegeben, und nicht n-Byte (also length) plus einmal der Platz eines chars. Hoffe, das das richtig war ;-) Zitieren
Klotzkopp Geschrieben 16. März 2005 Geschrieben 16. März 2005 *array = (char **)realloc(*array, 1 * sizeof(char*)); Hier solltest du noch elcount berücksichtigen. So, wie es jetzt ist, setzt du dein Array immer auf die Größe eines char*. Zitieren
bmg4ever Geschrieben 16. März 2005 Autor Geschrieben 16. März 2005 @biese: ist ja auch C, ich nutz nur immer die php-funktion des Forums, da das schöner aussieht aber schonmal danke. das war je selten dämlich von mir mit dem mal, obwohl das ja bei char in dem fall nicht der eigentliche grund war. @klotzkopp: hmmm.. da hab ich wohl mal wieder zu schnell über die funktionsbeschreibung hinweg gelesen. parameter size ist die neue größe und nicht die hinzuzufügende. danke, ABER.... es geht immernoch nicht: [EDIT]immernoch der gleiche absturz[/EDIT] hier mal mit main-funktion //includes.... #define leer while(getchar() != '\n') bool addspace(char ***array, int length, int elcount) //gibt im Erfolgsfall 1 zurück //im Fehlerfall wird 0 zurückgegeben. { if (*array == NULL) //init array { *array = (char **)malloc(1 * sizeof(char*)); if (*array == NULL) return 0; *array[0] = (char *)malloc(length * sizeof(char)); if (*array[0] == NULL) return 0; return 1; } else //add to existing array { *array = (char **)realloc(*array, (elcount+1) * sizeof(char*)); if (*array == NULL) return 0; *array[elcount] = (char *)malloc(length * sizeof(char)); if (*array[elcount] == NULL) return 0; return 1; } } int main() { int laenge, counter, i; //counter zählt die Anzahl der Namen char menu; char **names = NULL; laenge = 80; //max. Laenge der Namen printf("Dieses Programm hilft Ihnen eine unbestimmte Anzahl Namen einzulesen\n\n"); counter = 0; do { printf ("Menue:\n"); printf ("-1- Neuen Namen hinzufügen\n"); printf ("-2- Programm beenden und alle eingelesenen Namen ausgeben\n"); printf ("\nAuswahl: "); scanf("%c", &menu); leer; if (menu == '1') { if (addspace(&names, laenge, counter) == false) // Fehlerfall { system("cls"); printf ("Es ist ein Fehler aufgetreten!!!\nBeginnen Sie bitte von vorn."); continue; } counter++; printf("\n\nDer Name lautet: "); fgets(names[counter-1], 80, stdin); system("cls"); } else if (menu == '2') { printf("\n\nDie von Ihnen eingegebenen Namen: "); for (i=0; i<counter; i++) printf("\n%s", names[i]); printf ("\n\n\nAuf Wiedersehen. Beenden mit ENTER"); while (getchar() != 13);//aufs ENTER warten } else { system("cls"); printf("Ungueltige Auswahl!\n\n\n"); } } while(menu != '2'); return 1; } [/PHP] Zitieren
Klotzkopp Geschrieben 16. März 2005 Geschrieben 16. März 2005 *array[elcount] = (char *)malloc(length * sizeof(char)); if (*array[elcount] == NULL) return 0;[/PHP]Hier ist das Problem. Der Arrayoperator [] bindet stärker als der Dereferenzierungsoperator *. Hier wird also zuerst array[elcount] ermittelt, und das dann dereferenziert. Es muss aber genau andersherum sein. Also musst du klammern: [CODE][B]([/B]*array[B])[/B][elcount] = (char *)malloc(length * sizeof(char)); if ([B]([/B]*array[B])[/B][elcount] == NULL) return 0;[/CODE] Übrigens: Im Thread steht zwar C, aber du benutzt offenbar doch zumindest einen C++-Compiler. Warum quälst du dich dann mit malloc und realloc? Mit vector und string wäre das alles erheblich einfacher. Zitieren
bmg4ever Geschrieben 16. März 2005 Autor Geschrieben 16. März 2005 ah ok danke klotzkopp jetzt gehts. man das muss man auch erstmal wissen. Übrigens: Im Thread steht zwar C, aber du benutzt offenbar doch zumindest einen C++-Compiler. Warum quälst du dich dann mit malloc und realloc? Mit vector und string wäre das alles erheblich einfacher. nenn es eine eigenart oder wie auch immer du willst, aber eigentlich will ich versuchen mich an den ANSI-C standard zu halten. desweiteren müsste ich mich in C++ dann erst entsprechend einlesen, da wir in der BS selbst strings noch nicht gemacht haben. das ich MS Visual C++ benutze und daher einen "mixed"-compiler ist daher eigentlich irrelevant. Zitieren
Biese Geschrieben 16. März 2005 Geschrieben 16. März 2005 ok, mein Posting hat sich grad erledigt *gg* Zitieren
Wurstpate Geschrieben 16. März 2005 Geschrieben 16. März 2005 Mahlzeid Wenn du im Ansi-C-Standard programmieren willst, dann darfst du meines Wissens nach kein bool als Datentyp verwenden, weil es den Datentyp in C nicht gibt. Wurstpate Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.