Zweidimensionales Array erstellen (mit malloc)



  • Ihr meintet dies Funktioniert nur für rechteckige Arrays, heißt das ich kann statt

    int *Array1;
    Array1 = (int*) malloc(5*5*sizeof(int));
    

    nicht

    int *Array1;
    Array1 = (int*) malloc(100*20*sizeof(int));
    

    benutzen?



  • ein Quadrat ist auch rechteckig,
    vergiss den irreführenden Ausdruck
    es geht sowohl

    Array1 = (int*) malloc(5*5*sizeof(int));
    

    als auch:

    Array1 = (int*) malloc(100*20*sizeof(int));
    

    Gruß Frank



  • Ich habe nun solch ein Array erstellt, scheitere aber leider am beschreiben, mein Code sieht so aus:

    char Bezeichnung[100][20];
    int laenge;
    laenge=0;
    
    do
    {
        error = fscanf(data1,"%s",&Bezeichnung[laenge]); //Daten werden dynamisch eingelesen
        laenge++;    //um die Anzahl der Datensätze zu zählen    //laenge ist hierbei 10
    }
    while (error != EOF);    //Bis die Datei am Ende ist
    
    int main(void)
    {
    ...
    char *Bezeichnung2;
    Bezeichnung2 = (char*) malloc(laenge*20*sizeof(char));
        for(i=0;i<laenge;i++){  
            strcpy(&Bezeichnung2[i],Bezeichnung[i]);    //hier wird die Datei beschrieben
        }
    
    for(i=0;i<laenge;i++){
        printf("%s\n",&Bezeichnung2[i]);
    }
    

    Dabei wiederholt sich bei der Ausgabe nun der erste Buchstabe des erst Wortes 9 mal, so das dort z.b. "NNNNNNNNNummer" steht, beim zweiten mal 8 mal, dann 7...
    Kann sich das jemand erklären? Ich bin dankbar für jede Hilfe!

    Gruß!
    Metalmind


  • Mod

    Mach dir mal Gedanken darüber, was Bezeichnung2 ist und wie sich Bezeichnung2[i] und Bezeichnung2[i+1] zueinander verhalten. Dann dürftest du relativ flott drauf kommen.



  • Mit den Zeigeroperationen bin ich noch am lernen, ich bin mir relativ sicher dass der Fehler in Zeile 18 sitzt, aber nicht wo genau, kann mir jemand vielleicht einen Tipp geben?
    Gruß
    Metalmind



  • Metalmind schrieb:

    ich bin mir relativ sicher dass der Fehler in Zeile 18 sitzt

    Das kommt darauf an wie du dich entschieden hast, dein Array zu erzeugen und die Elemente darin zu adressieren.
    Die Adressierung der Elemente kann prinzipiell so

    array[zeile][spalte]
    

    oder so

    array[y*spaltenbreite+x];
    

    aussehen.



  • Du machst ne Art Mischung beider Varianten, das geht so nicht.



  • Du beziehst dich jetzt auf diese Zeile:

    Bezeichnung2 = (char*) malloc(laenge*20*sizeof(char));
    

    richtig?



  • Nein, auf Zeile 18.



  • Big Brother schrieb:

    Metalmind schrieb:

    ich bin mir relativ sicher dass der Fehler in Zeile 18 sitzt

    Das kommt darauf an wie du dich entschieden hast, dein Array zu erzeugen und die Elemente darin zu adressieren.
    Die Adressierung der Elemente kann prinzipiell so

    array[zeile][spalte]
    

    oder so

    array[y*spaltenbreite+x];
    

    aussehen.

    Ich hatte das jetzt so verstanden, dass in Zeile 18
    Bezeichnung[100][20];
    und
    Bezeichnung2 = (char*) malloc(laenge*20*sizeof(char));
    verglichen werden, die nach anderem Schema erzeugt werden, was nicht funktioniert.
    Habe ich mich da geirrt?


  • Mod

    Verglichen? Nein, da wird das eine in das andere kopiert.

    Dein Problem ist, dass du Bezeichner und Bezeichner2 auf unterschiedliche Weise erzeugt hast. Na gut, eigentlich ist das kein Problem. Aber du benutzt sie beide gleich. Bei Bezeichner hast du dem Compiler mit [100][20] gesagt, dass du 100 mal 20 Elemente haben willst. Bei Bezeichner2 hast du gesagt, dass du einmal 2000 Elemente haben willst. Daher bezieht sich Bezeichner[i] auf das insgesamt i*20-te Element. Bezeichner2[i] hingegen ist wirklich nur das i-te Element, weil der Compiler keine Ahnung hat, dass du dir die 2000 Elemente als 100*20 vorstellst. Das musst du ihm schon irgendwie klarmachen, dass du mit Bezeichner2[i] eigentlich das i*20-te Element meinst.

    P.S.: Kleiner Tipp: Die Lösung ist nicht schwer, ich hab's quasi schon hingeschrieben. Ich will nur, dass du nochmal drüber nachdenkst, damit du es beim nächsten Mal auch alleine hinbekommst.

    :hoppschwiiz:



  • Ich doktore dadran jetzt einige Zeit rum und habe (glaube ich) zwei Lösungen gefunden:
    entweder erzeuge ich das Array auf dieselbe Art, auf die mein "Grundarray" erstellt wurde, wie vorher zuwähnt:

    Für int[5][3]
    int **myPtr = malloc(5*sizeof(int*)); // erste Dimension
    myPtr[0] = malloc(3sizeof(int));
    myPtr[1] = malloc(3
    sizeof(int));
    myPtr[2] = malloc(3sizeof(int));
    myPtr[3] = malloc(3
    sizeof(int));
    myPtr[4] = malloc(3*sizeof(int));

    Oder ich finde einen Weg das 2000er Feld in 100*20er Felder aufzuteilen.
    Soweit richtig?



  • Ja.
    Etwas eleganter wäre noch
    int **myPtr = calloc(5,sizeof(int*));



  • Wäre das dann:

    char **Bezeichnung2 = calloc(laenge,sizeof(char*));
    for(i=0;i<laenge;i++)
    {
    Bezeichnung2[laenge] = malloc(20*sizeof(char));
    }
    

    Um 100 Elemente mit 20 Zeichen als Ersatz für

    Bezeichnung2 = (char*) malloc(laenge*20*sizeof(char));
    

    zu erstellen?



  • bzw laenge Elemente



  • Scheinbar mache ich noch irgendwas verkehrt, ich habe nun meinen Code durch:

    char **Bezeichnung2 = calloc(laenge,sizeof(char*));
    for(i=0;i<laenge;i++)
    {
    Bezeichnung2[laenge] = malloc(20*sizeof(char));
    }
    for(i=0;i<laenge;i++){  
        strcpy(Bezeichnung2[i],Bezeichnung[i]);
    }
    

    ersetzt, nun stürzt das Programm bei der Ausgabe ab



  • Wutz schrieb:

    Ja.
    Etwas eleganter wäre noch
    int **myPtr = calloc(5,sizeof(int*));

    Dem kann ich keine Eleganz abgewinnen, bestenfalls Überfluss, denn die Zeiger werden anschließend sofort zugewiesen. Wozu also unnötigerweise doppelte Initialisierung?

    Metalmind01 schrieb:

    Scheinbar mache ich noch irgendwas verkehrt

    Schreib doch mal Bezeichnung2[i] anstatt Bezeichnung2[laenge].



  • Okay, sorry, das war einfach dumm...

    Nun sieht das ganze so aus:

    char **Bezeichnung2 = malloc(laenge*sizeof(char*)); 
    for(i=0;i<laenge;i++)
        {
            Bezeichnung2[i] = malloc(100*sizeof(char));
        }
    for(i=0;i<laenge;i++){  
        strcpy(Bezeichnung2[i],Bezeichnung[i]);
    }
    


  • Nun kommt bei der Ausgabe etwas merkwürdiges raus, zwei komische, immer unterschiedliche Zeichen gefolgt von ")".
    Was haltet ihr denn nun von meinem Code?



  • Metalmind01 schrieb:

    Nun kommt bei der Ausgabe etwas merkwürdiges raus, zwei komische, immer unterschiedliche Zeichen gefolgt von ")".
    Was haltet ihr denn nun von meinem Code?

    das da nen error driennen ist noch irgenwo


Anmelden zum Antworten