ne frage zwischen dem unterschied zwischen diesen arrays



  • dgrat schrieb:

    wie bekomm ich das dann funktionierend?

    float **b;
        float a[] = {0, 1, 3, 6, 9}; 
        b[3][3] = {{1, 2, 3}, {1, 2, 3}};
    

    Z.B. indem du ein Array auf dem Heap anlegst

    float **b = new float*[2];
    for(unsigned int i = 0; i < 2; ++i)
         b[i] = new float[3];
    
    // jetzt hast du für ein array b[2][3] Speicher auf dem Heap reserviert.
    // Du kannst jetzt wie gewohnt damit arbeiten.
    
    // am Ende musst du nur den Speicher, den du reserviert hast, wieder freigeben.
    for(unsigned int i = 0; i < 2; ++i)
          delete[] b[i];
    delete[] b;
    


  • danke!
    ich komm irgendwie mit den zeigern immer durcheinander? aber wenn ichs sehe dann versteh ich meistens wie es funktioniert!

    wenn man gleich

    b[3][3] = {{1, 2, 3}, {1, 2, 3}};
    

    macht wird theoretisch dann gleich speicher im heap allokiert, das ist dann bloß nicht mehr dynamisch oder?



  • ne der speicher is dann vom stack.
    (typ b[2][3]={...}; ist wohl angebrachter)



  • hier eure schwule abruchbedingung: 😃

    alpha::alpha(float **b, int z, int s)
    {
    b = new float*[z];
    for(unsigned int i = 0; i < z; ++i)
         b[i] = new float[s];
    //
    
    for(int i = 0; i < z; i++)
    {
            for(int i = 0; i < s; i++)
            {
                    b[z][s] = zdarray[z][s];
            }
    }
    
    //
    for(unsigned int i = 0; i < 2; ++i)
          delete[] b[i];
    delete[] b;
    }
    

    ich wollte das so dynamisch wie möglich halten, nur funzt das hier nur mit dem bekanntsein der größe des arrays 😞
    kann mir da einer helfen 😕



  • exigoner schrieb:

    hier eure schwule abruchbedingung: 😃

    alpha::alpha(float **b, int z, int s)
    {
    b = new float*[z];
    for(unsigned int i = 0; i < z; ++i)
         b[i] = new float[s];
    //
    
    for(int i = 0; i < z; i++)
    {
            for(int i = 0; i < s; i++)
            {
                    b[z][s] = zdarray[z][s];
            }
    }
    
    //
    for(unsigned int i = 0; i < 2; ++i)
          delete[] b[i];
    delete[] b;
    }
    

    ich wollte das so dynamisch wie möglich halten, nur funzt das hier nur mit dem bekanntsein der größe des arrays 😞
    kann mir da einer helfen 😕

    Ich fürchte du hast dich im Thread verirrt... Zu dem Code kann ich deshalb nicht allzuviel sagen bis auf die Tatsache, dass du auch beim Speicher freigeben auf die Variable z zurückgreifen und keine Konstante verwenden solltest ;).

    /edit:
    Desweiteren sollte dieser Codeblock

    for(int i = 0; i < z; i++)
    {
            for(int i = 0; i < s; i++)
            {
                    b[z][s] = zdarray[z][s];
            }
    }
    

    Wohl eher so aussehen:

    for(unsigned int i = 0; i < z; ++i)
    {
           for(unsigned int j = 0; j < s; ++j)
                   b[i][j] = zdarray[i][j];
    }
    


  • stimmt hab den falschen 🤡



  • da stimmt das mit der konst. hab ich übersehen.



  • ich hab noch ein bisschen herumprobiert könnte mir jemand dieses sonderbbare verhalten erläutern?

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int *p = new int[5];
        p[0] = 32;
        p[1] = 7;
        int **q = new int*[5];
    
        q[0] = p;  //zeigt auf anfang von p
        cout << **q << endl;
        q[0] = &p[1]; //zeigt auf adresse des anfangs von p
        cout << **q << endl;
        *q[0] = p[1]; //absturz! wenn oberes weg ist aber '7' ???
        cout << **q << endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • @dgrat: Komisch. Bin zwar ebenfalls noch Anfänger, kann diesen Fehler aber absolut nicht nachvollziehen, da der Code - abgesehen von der fehlenden Speicherfreigabe von p und q - soweit ich das beurteilen kann korrekt ist.
    Auch beim Compilieren und darauf folgendem Ausführen ist mir nichts 'suspektes' aufgefallen...

    Caipi



  • echt, bei mir schließt sich das fenster wenn ich

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int *p = new int[5];
        p[0] = 32;
        p[1] = 7;
        int **q = new int*[5];
    
        //q[0] = p;
        //cout << **q << endl;
        //q[0] = &p[1]; //warum '&'
        //cout << **q << endl;
        *q[0] = p[1]; //absturz wenn oberes weg ist sonst '7' ??
        cout << **q << endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    mache;

    gut das man als anfänger nicht allein ist 🙂


Anmelden zum Antworten