pointer 2 dimensionales array



  • meine aufgabenstellung:
    funktion identity() welche ein 2dim array bekommt (bzw. ich denke ein array mit zeigern auf die jeweiligen zeilen).
    die funktion initialisiert das array mit lauter nullen, nur in der diagonale 1en.
    gefordert ist die funktion darf als variablen nur den parameter und jeweils einen pointer pro for schleife haben. und es soll in 2fors geloest werden mit nur einem zuweisungs operation.

    als tipp steht pointer arethmetik verwenden, ich denke wird dann irgend etwas sein, wenn das ergebnis aus spalten pointer weniger zeilen pointer null ist bedeutet das ich hab ein element der diagonale...
    aber wie gesagt hab probleme mit den for's 😞 (du verwendest ja zwei variablen)

    danke!!



  • AbsoluterBeginner schrieb:

    meine aufgabenstellung:
    funktion identity() welche ein 2dim array bekommt (bzw. ich denke ein array mit zeigern auf die jeweiligen zeilen).
    die funktion initialisiert das array mit lauter nullen, nur in der diagonale 1en.
    gefordert ist die funktion darf als variablen nur den parameter und jeweils einen pointer pro for schleife haben. und es soll in 2fors geloest werden mit nur einem zuweisungs operation.

    als tipp steht pointer arethmetik verwenden, ich denke wird dann irgend etwas sein, wenn das ergebnis aus spalten pointer weniger zeilen pointer null ist bedeutet das ich hab ein element der diagonale...
    aber wie gesagt hab probleme mit den for's 😞 (du verwendest ja zwei variablen)

    danke!!

    Wieder so eine blödsinnige Aufgabe ohne wirklichen Sinn.
    Zeig mal alles, was Du dazu bis jetzt so gemacht hast.



  • hehe, nicht meine schuld 😃
    danke fuer die hilfe also hier mein code:

    #include <iostream>
    using namespace std;
    
    void identity(int *row); //ich dachte es funktioniert mit einem normalen pointer
    //tut es aber nicht, gibt es ne andere moeglichkeit als den typ (*row)[10] zu verwenden?
    
    int main()
    {
     int square[10][10]; //das array
     int (*row)[10] = square; //adressen jeder zeile
    
      //show the addresses of each row 
      for(int i = 0; i < 10; ++i)
     	cout << *(row+i) << endl; 
      //distance is exactly 28hex (40dec) 
      //which is 10times a int per row
    
      //das funktioniert in meinen vorherigen post wollte ich eben nur das problem der fors machen aber ok machen wir es gleich mit funktion
    
       identity(row);
    
    void identity((*row)[10])
    {
     for(...)
       for(...)
    
    }
    

    soweit die struktur, hier schon fehler?
    die erste for sollte doch nur reihe fuer reiher durchgehen, also den parameter durchgehen. aber wie?!
    oben in meiner testausgabe der werte des arrays sehe ich dass ich mit

    (row+i)
    

    die adressen bekommen, aber wie mache ich es nur mit pointern?

    danke fuer deine hilfe!



  • update da ich gerade versuche das array bzw seine adressen zu uebergeben.
    ueber main definiert:

    void identity(int (*row)[10]);
    

    kein problem, implementiere ich die funktion

    ich fuege unter main folgendes hinzu:

    void identity(int (*row)[10] row)
    {
     cout << "in identity\n";
    }
    

    lauter errors, warum?!

    ex39.cc:30: error: variable or field identity' declared void ex39.cc:30: error:int identity' redeclared as different kind of symbol
    ex39.cc:8: error: previous declaration of void identity(int (*)[10])' ex39.cc:30: error: declaration ofint identity'
    ex39.cc:8: error: conflicts with previous declaration void identity(int (*)[10])' ex39.cc:30: error:row' was not declared in this scope
    ex39.cc:31: error: expected ,' or;' before '{' token

    ich sehe wenn ich das row entferne beim inmplementieren der funktion unter main kein error mehr aber ich muss ja in der funktion den parameter ansprechen koennen, ich dachte das ist der typ fuck ich kenn mich echt nimmer aus...



  • Du hast in der Deklaration den Namen des Parameters ("row") bereits drin. In der Implementierung dann zweimal, das muss krachen.



  • hallo ja sorry hab vorherigen post editiert, verzweifle echt langsam...
    was is dann jez der typ fuer die funktion?
    wenn ich es mit

    void identity(int *[10]);
    

    ueber main definiere klappt es, ist das richtig? kann ich das sagen dass es ein array mit 10 plaetzen fuer int zeiger ist?



  • ALLES NEU 🙂

    habe es jetzt geschafft 😉

    void identity(int (*)[10]); //muss ich das so definieren? geht mir nicht ganz ein, wie wird das gelesen? array von 10 elementen welche pointer auf ints sind?
    
    int main()
    {
     int square[10][10];
     int (*row)[10] = square;
    
      //show the addresses of each row 
      for(int i = 0; i < 10; ++i)
     	cout << *(row+i) << endl; 
      //distance is exactly 28hex (40dec) 
      //which is 10times a int per row
    
     identity(row);
    
     cout << endl;
     return 0;
    }
    
    void identity(int (*tst)[10]) //es war das prob dass ich die klammern rund um den pointer vergessen habe, warum brauche ich die klammern? also auch hier wieder die frage wie es interpretiert wird. ???
    {
     cout << "in identity\n" << *tst;
    
    }
    


  • zusatz, habe jetz auf verschiedenste arten versucht das array zu initialisieren - klaglos gescheitert 😡
    also falls jemand hier neu liest, es geht um obigen code, hier moechte ich in der funktion das array initialisieren, verwendet werden duerfen nur pointer (definiert in zwei vorschleifen)

    mein idee:

    for(int *x = *row; x != *(row+9); x += sizeof(int)*10)
    

    ich mache einen int pointer (fuer zeile) welchen ich so lange um 10 ints inkrementiere (10 da jede zeile 10 ints hat) und das ganze so lang bis der pointer die adresse des letzen array elemntes bekommt.
    nur funktioniert es nich 😃

    will das endlich verstehen...



  • Was soll deine Funktion jetzt genau machen? Das ist mir in diesem Thread nicht ganz klar geworden...

    Falls es nur darum geht, ein 2D-Array mit Nullen zu füllen, kannst du Folgendes tun. Ich würde es zuerst mal mit operator[] versuchen, das ist einleuchtender. Wenn du das wirklich verstanden hast, kannst du immer noch direkte Zeigerarithmetik verwenden.

    // (1): statisches Array mit Initialisierungsliste
    int Array[w][h] = {};
    
    // (2): statisches Array mit For-Schleife
    int Array[w][h];
    for (unsigned int x = 0; x < w; ++x)
    {
        for (unsigned int y = 0; y < h; ++y)
        {
            Array[x][y] = 0;
        }
    }
    
    // (3): dynamisches Array
    int** Array = new int*[w];
    for (unsigned int x = 0; x < w; ++x)
    {
        Array[x] = new int[h];
        for (unsigned int y = 0; y < h; ++y)
        {
            Array[x][y] = 0;
        }
    }
    // beim dynamischen Array wieder in umgekehrter Reihenfolge delete[] anwenden.
    


  • hallo nexus, danke fuer die antwort!
    das ist mir alles klar, ich habe das problem mit den pointern..
    nohcmals genaue aufgabnestllung:

    arry der groeße [10][10] diese wird in main definiert, in main wird ein pointer gemacht der auf die diversen zeilen zeigt. also p[0] = adresse erste zeiel ... p[9] = adresse letzt zeile

    dieser pointer wird an ne funktion uebergeben. diese fuellt das array mit lauter nullen, außer in der diagonale, da sind es einsen! [0][0],[1][1] usw....

    dazu folgende bestimmungen:
    2 for schleifen
    eine zuweisungszeile
    in der fkt darf nur der parameter + 2 pointer der for schleifen verwendet werden.

    hoert sich nicht so schwer an, ist es aber ^^



  • Sowas?

    void identity(int *p){
      for(int y = 0; y < 10; y++)
        for(int x = 0; x < 10; x++)
          p[y*10+x] = x == y;
    }
    


  • nein noch ein mal, es duerfen nur pointer verwendet werden!
    und das array wir in main initialisiert mitterls:

    int square[10][10];
    

    und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)

    danke...



  • AbsoluterBeginner schrieb:

    nein noch ein mal, es duerfen nur pointer verwendet werden!

    Ich denke, du meinst nicht Zeiger selber, sondern Zeigerarithmetik. Zudem ist Array[i] äquivalent mit *(Array+i) , aber du darfst natürlich gerne den komplizierteren Weg einschlagen. Wenn du wirklich der Ansicht bist, man dürfe den operator[] nicht verwenden (was eine ziemlich blöde Aufgabenstellung wäre), würde ich ihn trotzdem zuerst benutzen und anschliessend seine Vorkommen nach obiger Regel durch operator* und operator+ ersetzen.

    AbsoluterBeginner schrieb:

    und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)

    Arrays können nicht übergeben werden, es sind immer nur Zeiger.



  • Sowas?

    void identity(int *p){
      for(int *y = p; y-p < 100; y++)
        *y = !((y-p)%11);
    }
    

    entweder mit identity(&square[0][0]) aufrufen oder entsprechend anpassen.



  • als hinweis ist gestanden an soll pointer aritmetik veerwenden (nicht nur um zu prüfen ob ein element in der diagonalen ist)
    was meinst du denn damit?

    @fellhuhn, danke, aber ich habe es nicht geschafft das 2dim array mit einem pointer zu uebergeben, aber ich denke auch ich soll ein 1dim array mit den adressen der zeilen uebergeben...
    aber dien code sieht schon mal gut aus (da eben pointer verwendet werden)
    aber ich glaube du hast es schon zu kompakt gemacht 😃
    ich verstehe die zuweisung nicht ganz, waere es nicht auch einfacher mit 2 forschleifen?
    so sollte ich es naemlich loesen...

    danke euch!!



  • Also, ganz ehrlich, wenn gefordert ist, dass eine zweidimensionale Matrix übergeben werden soll, dann würde ich das auch ganz stumpf so machen. Ich würde das dann irgendwie so machen (nicht getestet):

    const size_t dim = 10;
    
    typedef int ElementType;
    typedef ElementType MatrixType[dim][dim];
    
    void identity(MatrixType mat)
    {
        for(ElementType (*row)[dim] = mat; row != (mat + dim); ++row)
        {
            for(ElementType *col = *row; col != (*row + dim); ++col)
            {
                if(row - mat == col - *row)
                {
                    *col = 1;
                }
                else
                {
                    *col = 0;
                }
            }
        }
    }
    
    //Test:
    MatrixType matrix;
    identity(matrix);
    //vielleicht noch ausgeben
    


  • Hier habe ich das mal ein wenig näher beschrieben, was du für möglichkeiten hast:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html



  • hallo, nochmals vielen dank an alle, heute war abgabe und ich habe es nicht geschafft, was solls 🙂
    will das problem aber trotzdem verstehen und habe mit hierzu ein weiteres programm gebastelt.
    da es aber nichts mit diesem thread zu tun hat habe ich einen neun aufgemacht, wenn wer lust hat zu helfen keine scheu 😃

    hier der link: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1607316.html#1607316

    danke euch!


Anmelden zum Antworten