matrix dynamisch erweitern
-
Trotz suche/lesen und herumprobieren
hab` ich es nicht geschafft
ein 2dimensionales char array anzulegen
dass sich in der groesse den gegebenheiten anpasst.Beispiel soll sein
Eine liste aller datein von der HD sollen in ein char array hinein
da ich ja nicht weiss wieviele datein auf der HD sind
kann ich dies nicht zu beginn festlegen.char array[25][512];
koennte ich, wenn ich per realloc platz schaffen wuerde
mit einem eindimensionalen array klappts...bin fuer jede hilfe dankbar
-
Schon mal in die FAQ geschaut?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39489.html
-
Soweit ich mich erinnern kann hab` ich die frage im ANsi C forum gepostet
und dies aus dem grund
da ich dies in C brauche und nicht in c++.
Von daher bringt mir die C++ faq nicht viel!
-
Soweit ich mich erinnern kann hab` ich die frage im ANsi C forum gepostet
Da erinnerst du dich wohl falsch. Ich verschiebe dich aber gerne dort hin.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
danke
war ich wohl etwas zu schnell mit`n klicken
-
Da sich meiner keiner angenommen hat
# include <stdlib.h> # include <stdio.h> int main() { char ** ronny; int x=0; // ronny = (unsigned char **) malloc (x); // ronny[x] = (unsigned char *) malloc (6); ronny = (char **) calloc (x,sizeof(char)); ronny[x] = (char *) calloc (5,sizeof(char)); for (x=0;x<50000;x++) { ronny[x]="hallo\0"; printf("ronny[%i]: %8s\n",x,ronny[x]); } return 0; }
problem ist aber
er bricht bei
ronny[4649]: hallo
mit einem speicherfehler ab (Die anweisung ... verweist auf speicher ....)
-
du musst erstmal 6 zeichen bei calloc allokieren sonst ist daas abschließende null-zeichen nicht am ende des strings ('\0')
# include <stdlib.h> # include <stdio.h> int main() { char ** ronny; ronny = (char **) calloc (0,sizeof(char)); for (int x=0;x<50000;x++) { ronny[x] = (char *) calloc (6,sizeof(char)); ronny[x]="hallo\0"; printf("ronny[%i]: %8s\n",x,ronny[x]); } return 0; }
-
danke
# include <stdlib.h> # include <stdio.h> int main() { char ** ronny; int x; ronny = (char **) calloc (0,sizeof(char)); for (x=0;x<50000;x++) { ronny[x] = (char *) calloc (6,sizeof(char)); ronny[x]="hallo\0"; printf("ronny[%i]: %8s\n",x,ronny[x]); } return 0; }
x muss ich leider ausserhalb der schleife deklarieren
sonnst beschwert sich der compilerSoweit ich das verstanden habe
schien es mir auch logischer das 2 element in der schleife zu haben
aber dadurch crashte das programm noch frueherHab` jetzt mal mit der config durlaufen lassen
und dachte schon es klappt
aber nein:
MSVC 2003 version 7.1.3088
crashed bei
zeile 13355 ohne debuging
zeile 15316 mit debuging
der debugger gibt aber nichts sinnvolles zurueck
oder sollte ich sagen gar nichts!Der VC6 mit sp5
crashed bei
zeile 15913 im release mode
zeile 15893 im debugging modeder 5.5er borland
bcc32 -6 -N D:\Programme\BC55\programs\array.c
crashed noch bevor er die erste zeile ausgibtder 6er von borland
bricht zwar auch zu beginn ab
bemaengelt aber danach die zeile
-
An dem Code ist wieder mal so ziemlich alles falsch.
l00ser schrieb:
int main() { char ** ronny; int x; ronny = (char **) calloc (0,sizeof(char));
Das ist Unsinn. calloc(0, ...), was soll das bringen? Offensichtlich willst Du in ronny auch keine char-Elemente speichern, sondern Elemente vom Typ char*! Und davon willst Du nicht 0 Elemente speichern, sondern 50000. Also "ronny = calloc(50000, sizeof(char*));" Wenn dein Compiler einen Cast erfordert, dann ist das ein C++-Compiler. Für deine Belange ist das aber erst mal egal. Mach dann einfach die Casts wieder rein.
for (x=0;x<50000;x++) { ronny[x] = (char *) calloc (6,sizeof(char)); ronny[x]="hallo\0";
Den von dir allokierten Speicher gibst Du auch mit free nicht wieder frei (wie auch, das meiste davon hast Du überschrieben). Außerdem prüfst Du nicht, ob deine callocs überhaupt erfolgreich sind. Schau dir am besten in deinem Buch das Kapitel über Zeiger noch mal an.
-
Danke fuer die hilfe
# include <stdlib.h> # include <stdio.h> # include <windows.h> int main() { unsigned char ** ronny; unsigned int x,zeilen=50000,spalten=6; ronny = calloc (zeilen,sizeof(unsigned char*)); if (ronny == NULL) { printf("can`t allocate memory"); exit(1); } for (x=0;x<zeilen;x++) { ronny[x] = malloc (spalten); if (ronny[x] != NULL) { strcpy(ronny[x], "hallo"); printf("ronny[%i]: %8s\n",x,ronny[x]); } else { printf("can`t allocate memory"); exit(1); } } for (x=0;x<zeilen;x++) { // printf("destroy ronny[%i]: %8s\n",x); free (ronny[x]); } free (ronny); Sleep(10000); return 0; }
Das ist Unsinn. calloc(0, ...), was soll das bringen? Offensichtlich willst Du in ronny auch keine char-Elemente speichern, sondern Elemente vom Typ char*! Und davon willst Du nicht 0 Elemente speichern, sondern 50000. Also "ronny = calloc(50000, sizeof(char*));"
ja das macht sinn, jetzt
calloc (zeilen,sizeof(unsigned char*));
damit zeige ich dann auf
ronny[x]
und da ich sizeof wissen will
liefert mir die ?funktion?
die grosse in int von ronny[x]
die ich per malloc auf spalten reserviert habe.
Also vereinfacht gesagt
calloc (zeilen,spalten);
richtig?Wenn dein Compiler einen Cast erfordert, dann ist das ein C++-Compiler. Für deine Belange ist das aber erst mal egal. Mach dann einfach die Casts wieder rein.
cast musste ich nachschlagen
http://de.wikipedia.org/wiki/Diskussion:C_(Programmiersprache)Zur nachträglichen Aufklärung: malloc() gibt ein void* zurück und void* kann ohne expliziten Cast in jeden anderen Zeiger verwandelt werden. Einen expliziten Cast zu verlangen wäre bei einem Zeiger auf ein void auch grenzdebil. --Andreas B. 00:22, 27. Feb 2004 (CET)
ronny = calloc (zeilen,sizeof(unsigned char*));
statt
ronny = (unsigned char **) calloc (zeilen,sizeof(unsigned char*));
funktioniert auch!
Hab` mich an http://www.cplusplus.com/ref/cstdlib/calloc.html gealtenfor (x=0;x<50000;x++) { ronny[x] = (char *) calloc (spalten,sizeof(char)); ronny[x]="hallo\0";
Du meinst ich schreibe nicht in feld
ronny[x][0]="h"
sondern in
ronny[x][7]="h"
und wenn ja, wieso?Den von dir allokierten Speicher gibst Du auch mit free nicht wieder frei (wie auch, das meiste davon hast Du überschrieben). Außerdem prüfst Du nicht, ob deine callocs überhaupt erfolgreich sind. Schau dir am besten in deinem Buch das Kapitel über Zeiger noch mal an.
Naja, eins nach dem anderen
pruefen obs reservieren klappt
haette ich gemacht wenn der rest funktioniert haette
oder waere mir durchs pruefen sofort aufgefallen warum es nicht klappt?
Free ebenfalls
aber frage warum kann ich bei free
nicht mit printf ausgeben was ich gerade loesche?
Zum Buch, ja aeh ...
da steht zu Matrix etwa dieschar array[2][3]={"ab\0","de\0"}; printf("[%s] [%s]",array[0], array[1]);
von **ptr
ganz zu schweigen