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 Codeblockfor(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
