Matrix mit Feldern UND Zeigern???



  • Du hast ganz einfach den zweiten * bei deiner funktion vergessen 😉



  • Kurze Frage, wenn ich zwei * angebe, dann erreiche ich damit doch nur die hintere dimension vom array oder???



  • AJ schrieb:

    Du hast ganz einfach den zweiten * bei deiner funktion vergessen 😉

    Da kann ich dir jetzt auch mal wiedersprechen. Er hat ein statisches Array angelegt, welches er folgendermassen an eine Funktion übergeben müsste:

    void funktion(int (* array)[3]);
    oder besser
    void funktion(int array[][3]);
    

    Schmank schrieb:

    Kurze Frage, wenn ich zwei * angebe, dann erreiche ich damit doch nur die hintere dimension vom array oder???

    Auch falsch. Sieh dir die Beispiele die ich gepostet habe einfach nochmal an. Dort wird das Array einmal mit **m übergeben, und dort ist das Array auch dementsprechned aufgebaut. So wie du es angelegt hast müsstest du es wie oben übergeben.

    So:

    void funktion(int* array)
    

    kannst du nur ein eindimensionales Array übergeben.

    Mein Vorschlag steht, schaue dir den Aufbau von Arrays nochmal genauer an.

    Gruß
    Entyl Sa



  • Beim 2 Pointer setzt du einen Pointer auf die Elemente...Der erste Pointer ist nur für die Variable also Variablenadresse.Es ist etwas schwierig dir das rüberzubringen...Stelle dir eine leere Schublade vor.Der Bezeichner der Schublade ist nicht sein Wert oder Name sondern die Speicheradresse der Speicherzelle in deinem Hauptspeicher. greets
    Ciro



  • Warum schreibstn das matrix mit dem * in eine klammer???
    und warum lässt du bei der anderen variante die klammer [] leer?



  • Schmank schrieb:

    Warum schreibstn das matrix mit dem * in eine klammer???

    Weil es da einen unterschied gibt.

    void f1(int (*m)[3]){}  //== void f1(int m[][3]);
    void f2(int *m[]){}
    
    main()
    {
    	int m1[3][3]; //statisches 2 dimensionalse Array
    	f1(m1);
    
    	int *m2[3];  //1 dimensionales Array von int Zeigern
    	f2(m2);
    
    	return 0;
    
    }
    

    Schmank schrieb:

    und warum lässt du bei der anderen variante die klammer [] leer?

    Bei einem eindimensionalen Array muß ich die größe nicht angeben, da ist der Benutzer selbst dafür verantwortlich das er die Arraygrenzen nicht überschreitet.
    Bei einem zweidimensionalen statischen Array muß ich die zweite dimension angeben, damit er inerhalb der Funktion die Indexberechnung durchführen kann.

    So, von mir bekommst du hier jetzt nur noch weitergeholfen wenn du ausdrücklich erwähnst das du dich über den Aufbau von Arrays informiert hast.

    Gruß
    Entyl Sa



  • Hab ich!! Es war nur folgendes:
    Mein Lehrer hat mir erklärt, wenn ich die Adresse übergebe an eine Funktion, dann muss ich Parameter von dort praktisch mit einem * darauf zeigen...
    also

    funktion(*zeiger)
    {
    ...;
    }
    
    main()
    {
    int variable;
    funtion(&variable);
    return 0;
    }
    

    und jetz dachte ich, das ich bei arrays zwar den & zwar weglassen kann, aber ich kann deshalb doch nicht einfach auch den * weglassen oder? denn schließlich übergebe ich ein adresse... oder etwa nicht?



  • Schmank schrieb:

    und jetz dachte ich, das ich bei arrays zwar den & zwar weglassen kann, aber ich kann deshalb doch nicht einfach auch den * weglassen oder? denn schließlich übergebe ich ein adresse... oder etwa nicht?

    Du kannst den Stern natürlich nicht weglassen, siehe oben eindimensionales Array. AUSSER du schreibest es so:

    void funktion(int array[] )
    

    Das ist vom Typ her das gleiche, was du aber meitlerweile hoffentlich weist.



  • @Entyl_Sa
    Warum sollten zwei * nicht auch funktionieren? Mit deiner Angabe bestimmst du ja eigentlich nur, dass ein Element des Arrays genau 3 Integer enthalten muss und die Anzahl der Elemente beliebig ist.



  • AJ schrieb:

    @Entyl_Sa
    Warum sollten zwei * nicht auch funktionieren? Mit deiner Angabe bestimmst du ja eigentlich nur, dass ein Element des Arrays genau 3 Integer enthalten muss und die Anzahl der Elemente beliebig ist.

    Weil du bei einem statischen zweidimensionalen Array keiner Zeiger auf einen Zeiger hast. Das wird etwas anders angelegt, dort werden die einzelnen Zeilen einfach hintereinander gelegt und die richtige Stelle wird dann immer mit Indexberechnung herausgesucht. Für **m brauchst du ein Array von Zeigern, wie du es dir in einem meiner Beispiele angucken kannst, oder wie man halt ein dynamischen zweidimensionales Array aufbaut.
    Glaubs mir oder probiers aus 😉

    Gruß
    Entyl SA



  • du hast ja so

    void funktion(int (* array)[3]);
    

    praktisch mit auch eine zeiger da drin. aber ich verstehe nicht, warum du zum einen das in eine klammer setzt, und dahinter dann die erste/zweite dimension extra... ich hätte einfach funktion(*array[3][3]){} angegeben. warum hast du das mit der klammer dort gemacht. ich kann gar nix darüber finden 😞



  • du hast ja so

    void funktion(int (* array)[3]);
    

    praktisch mit auch eine zeiger da drin. aber ich verstehe nicht, warum du zum einen das in eine klammer setzt, und dahinter dann die erste/zweite dimension extra... ich hätte einfach funktion(*array[3][3]){} angegeben. warum hast du das mit der klammer dort gemacht. ich kann gar nix darüber finden 😞



  • Schmank schrieb:

    du hast ja so

    void funktion(int (* array)[3]);
    

    praktisch mit auch eine zeiger da drin. aber ich verstehe nicht, warum du zum einen das in eine klammer setzt, und dahinter dann die erste/zweite dimension extra... ich hätte einfach *funktion(array[3][3]){} angegeben. warum hast du das mit der klammer dort gemacht. ich kann gar nix darüber finden 😞

    Die Variante da oben habe ich ja ursprünglich nur benutzt weil du umbedingt Sternchen sehen wolltest. Am besten du guckst nochmal in meinen Vorangegangenen Posts nach was ich gesagt habe wie man es besser schreiben würde.

    Dann würde ich gerne mal von dir wissen wie du darauf kommst das Array so wie oben von dir angegeben zu übergeben. Probier das doch einfach mal aus und versuche die Fehlermeldung deines Kompilers zu verstehen.

    Frag doch auch mal deinen Lehrer zu der Problematik. Was benutzt du eigentlich sonst zum lernen von C ? Ich kenne sie zwar selber nicht, aber hast du dir mal die Tutorials hier angesehen?

    Gruß
    Entyl Sa



  • Ich hab das BUch C in 21 tagen. aber da stehts ja nicht so drin das ich alles verstehe 😉

    frage. ich hab den text jetz geschrieben:

    #include <stdio.h>
    
    int einlesen (int matrix[3][3]);
    int erhoehen (int matrix[3][3]);
    int ausgeben (int matrix[3][3]);
    
    int einlesen (int matrix[3][3]){
    
        int i,I;
        printf("Bitte gib nun nachfolgend die einzelnen Matrix-Werte ein:\n\n");
        for(I=0;I<3;I++){
            for(i=0;i<3;i++){
            scanf("%d", &matrix[I][i]);
            }
            printf("---\n");
        }
    
    }
    
    int erhoehen (int matrix[3][3]){
    
        int i,I;
        for(I=0;I<3;I++){
            for(i=0;i<3;i++){
            matrix[i][I]=matrix[i][I]+2;
            }
        }
    
    }
    
    int ausgeben (int matrix[3][3]){
    
        int i,I;
        printf("---\n\n");
        for(I=0;I<3;I++){
            for(i=0;i<3;i++){
            printf("%dff\t", matrix[i][I]);
            }
            printf("%d\n");
        }
    
    }
    
    int main()
    {
        int matrix[3][3];
        einlesen(matrix);
        erhoehen(matrix);
        ausgeben(matrix);
        printf("\n");
        system("PAUSE");
        return 0;
    }
    

    das problem ist, das die dritte reihe zwei mal (?) ausgegeben wird.

    also wenn ich 111,222,333 eingebe kommt raus:
    3 4 5 5
    3 4 5 5
    3 4 5 5

    was gehtn?



  • Ich kenne noch eine Variante wo man auch viele Sternchen sieht...Die tut aber etwas weh 😃
    greets
    Ciro



  • @schmank du hast ein buch das c in 21 tagen heißt?????

    Das bedeutet wohl das du 21 Tage benötigst um das Buch zu ende zu lesen und danach
    genauso viel weißt wie vorher.Außer ein paar gelernten Begriffe🙄

    Ich sag nur soviel,ich kenne niemanden der C in 21 Tagen gelernt hat.Da braucht man schon ein paar Tage mehr...greets
    Ciro



  • Schmank schrieb:

    [cpp]int ausgeben (int matrix[3][3]){

    int i,I;
    printf("---\n\n");
    for(I=0;I<3;I++){
    for(i=0;i<3;i++){
    printf("%dff\t", matrix[i][I]);
    }
    printf("%d\n");
    }

    }[/cpp]

    Das ff da oben macht für mich keinen Sinn, aber das hast du ja wohl auch in deiner Version nicht drin.

    Warum der dir noch eine weitere Spalte ausgibt dürfte wohl an dem %d liegen, was du da absolut überflüssigerweise rein gemogelt hast.

    Gruß
    Entyl Sa



  • ahhhhhhhhhh.

    danke 🙂

    @special-Agent00: das buch ist gut! klar kann man in 21 tagen nicht alles lernen. aber das buch ist trotzdem echt gut. hab es mir ja wegen den guten sachen die ich darüber gehört habe gekauft.


Anmelden zum Antworten