Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Array in C++

Chakhi / 6 Antworten / Baumansicht Nickles

hallo Leute,
ich möchte ein Array erstellen damit ich einen Raster darstellen kann! und das mache ich wie folgt:

float grenzen[6];
float xkoord, ykoord;
int xdim,ydim;
int xmin ,xmax ,ymin ,ymax;



// geometrische Grenzen in x und y Richtung auslesen

polydata->GetBounds(grenzen); //(xmin,xmax,ymin,ymax, zmin,zmax).
xmin = grenzen[0] - 20;
xmax = grenzen[1] + 20;
ymin = grenzen[2] - 20;
ymax = grenzen[3] + 20;

// Akkumulator mit Raster 1mm für x-y Ebene einrichten
xdim = xmax - xmin;
ydim = ymax - ymin;
int akkumulator[xdim][ydim];

aber beim Kompilieren kommt immer die Fehlermeldung, dass für akkumulator[][] "konstante Ausdruck erwartet" ist und "error C2466: Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich"

wie könnte ich das realisieren! warum werden xdim und ydim, die ich oben berechne nicht angenohmen!??

ich bedanke mich im Voraus....

Chrakhan

bei Antwort benachrichtigen
thomas woelfer Chakhi „Array in C++“
Optionen

man kann in c++ keine arrays statisch allozieren wenn die dimensionsangabe variabel ist. du musst den speicher dynamisch allozieren. int* pAkkumulator = new int[ xdim * ydim * sizeof(int) ];

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
Dreamforger Chakhi „Array in C++“
Optionen

Wie bereits gesagt, kommst du bei einem anständigen Compiler nicht um eine dynamische Allokation rum (auch wenn ich schon C compiler gesehen hab die sowas fressen)

erstmal die Korrektur:
Da du ein Array vom typ int anlegst musst du nicht angeben wie groß die einzelnen Felder sind. So schlau ist der Compiler grad noch

int* pAkkum = new int[ xdim * ydim ];

bei malloc, bzw folgendem Konstrukt ist die Angabe nötig:

int* pAkkum = (int*)((void*) new char[ xdim * ydim *sizeof(int) ]);
int* pAkkum2 = (int*) malloc( xdim * ydim * sizeof(int) );


Jetzt noch zu mehrdimensionalen Arrays:

int **ppAkkum = new *int[xdim];
for ( int i = 0; i


Auf jeden Fall darfst du nicht vergessen die Arrays zu initialisieren!
Nachteile der mehrdimensionalen Arrays:
mehr Aufwand beim erstellen,
mehr Aufwand beim Löschen,
einfacher langsameren Code zu schreiben :-)

Vorteile
bequem und einfach zu benutzen sobald allokiert.
Lesbarer Code

bei Antwort benachrichtigen
mr.escape Dreamforger „Mehrdimensionales Array in C++ und kleine Korrektur“
Optionen

Oder als zwischenschritt, wenn alle vektoren gleich groß sind (ydim):
int **ppAkkum = new *int[xdim];
int *pData = new int[xdim*ydim];
for ( int i = 0; i
und zum löschen:
delete[] ppAkkum;
und
delete[] pData;
statt
for ( int i = 0; i
Zugriff in beiden fällen über
ppAkkum[x_index][y_index]
mit
0
wie im originalposting angedacht.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Chakhi mr.escape „Mehrdimensionales Array in C++ und kleine Korrektur“
Optionen

Hi..
ich habe jetzt so wie ich Euch verstanden habe, Eure Vorschläge in meine Funktion wie folgt eingebaut:

{
float grenzen[6];
int xdim,ydim;
int xmin ,xmax ,ymin ,ymax;



// geometrische Grenzen in x und y Richtung auslesen

polydata->GetBounds(grenzen); //(xmin,xmax, ymin,ymax, zmin,zmax).
xmin = grenzen[0] - 20;
xmax = grenzen[1] + 20;
ymin = grenzen[2] - 20;
ymax = grenzen[3] + 20;

// Akkumulator mit Raster 1mm für x-y Ebene einrichten
xdim = xmax - xmin;
ydim = ymax - ymin;


int *pAkkum = new int[xdim];
int **ppAkkum = &pAkkum;
int *pData = new int[xdim*ydim];
for ( int i = 0; i

//akkumulator auf 0 initialisieren
for (int x_index = 0; x_index {
for (int y_index = 0; y_index {
ppAkkum[x_index][y_index]=0;

}

}

delete[] pAkkum;
delete[] ppAkkum;
delete[] pData;


}

und jetzt wenn zum Funktionaufruf kommt, wird das Ausführen abgebrochen und kommt die Meldung:
"Benutzerdefinierter Haltepunkt aus der Quellcode aufgerufen bei 77f7f570"
und dann wird das Fenster mit dem Überschrift: " [Anhalten]-[Disassemblierung]" angezeigt.

was soll das alles! was soll ich da überprüfen?

Chakhi

bei Antwort benachrichtigen
Chakhi Dreamforger „Mehrdimensionales Array in C++ und kleine Korrektur“
Optionen

Danke, das mit dem Integer hat mich schon geholfen, aber würdet Ihr mir auch das erläutern:
int **ppAkkum = new *int[xdim];
for ( int i = 0; i
was macht das genau?
Also, ich will erst mal eine Matrix erstellen, mit alle Elemente = 0
so was:

0 0.. 0
0......0
........
0......0
und dann später möchte ich die Werte erhöhen und die Größe (Dimentionen) meine Matrix sind nicht bekannt (das ist von dem Größe der Bilder abhängig die ich jeweils als Input hochlade!)

Bitte sagt mir, ob ich auch hier Eure Lösung benutzen kann! und wenn nicht, wie soll ich denn die Array initialisieren?

Ich bedanke mich

Chakhi

bei Antwort benachrichtigen
Dreamforger Chakhi „Mehrdimensionales Array in C++ und kleine Korrektur“
Optionen

Mal zur Theorie:
TYPE* var = new TYPE[n];
legt eine Liste von 'n' Variablen vom Typ 'TYPE' an und speichert die erste Adresse in 'var'.
Du kennst das bereits als mit TYPE === int
int* var = new int[n];
Jetzt erstellen wir zur abwechslung mal nicht ein Feld von Ints sondern von Pointern auf Int: TYPE === int*
int** var = new *int[n];
beim 'new' wandert der '*' auf die andere Seite, weil.... abwechlsung gut tut. Keine Ahnung warum.

Der obige Code erstellt also erst ein Array von Pointern auf Int und in jedem dieser Pointer dann ein Array von Ints.

mr.escape Version agiert sehr ähnlich. Er legt zuerst das ganze Array an, wie ganz am Anfang von TW besprochen. Um den Zugriff zu erleichtern legt er in der nächsten Zeile auch ein Array von Pointern an die dann auf bestimmte Positionen im ganzen Array zeigen.

bei Antwort benachrichtigen