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





  • 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 compiler

    Soweit ich das verstanden habe
    schien es mir auch logischer das 2 element in der schleife zu haben
    aber dadurch crashte das programm noch frueher

    Hab` 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 mode

    der 5.5er borland
    bcc32 -6 -N D:\Programme\BC55\programs\array.c
    crashed noch bevor er die erste zeile ausgibt

    der 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 gealten

    for (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 dies

    char array[2][3]={"ab\0","de\0"};
    printf("[%s] [%s]",array[0], array[1]);
    

    von **ptr
    ganz zu schweigen


Anmelden zum Antworten