Zum Inhalt springen

Brauche hilfe bei Mehrdimensionalen dynamischen Arrays


Empfohlene Beiträge

Geschrieben

Hi,

man kann ja einen Zeiger deklarieren und ihm zur Laufzeit ein Array zuweisen, also ungefähr so:


int *i;

main()
{
i = new int[29];
}
[/PHP]

Ich versuche jetzt aber in der Art ein mehrdimensionales Array anzulegen, also ungefähr so:

[PHP]

int **i;

main()
{
i = new int[19][29];
}

Das Problem ist, dass es so nicht funktioniert. Ich habe auch noch ein paar andere Möglichkeiten ausprobiert aber nichts klappt.

Wäre nett wenn mir einer von euch dabei helfen könnte.

Gruß

wasweißich

Geschrieben

Denkanstoss: Wie wird denn ein mehrdimensionales Array im Speicher abgelegt bzw. darauf zugegriffen?

int **i;

main()

{

i = new int[19][29];

}

Das Reservieren des Arrays sollte nicht das Problem darstellen:


int **i;


main()

{

    int iDim1 = 19;

    int iDim2 = 29;


    i = new int[ iDim1 * iDim2 ];


    ...

}

Aber der Compiler kann aber hierbei nicht wissen, wie groß die erste Dimension des Arrays ist. Daher kann man NICHT schreiben:

int iTest = i[1][1];

Also müsste man bei jedem Zugriff anhand der Zeile und Spalte die Position im eindimensionalen Array bestimmen.

!!!Vorsicht beim verändern der Array-Größe!!!

Und das Freigeben des Speichers nicht vergessen.

Alternative : Eine Klasse, die das Array kapselt und den [] - operator überschreibt. Vielleicht gibt es die schon irgendwo?

Geschrieben

Danke für den Link Goos aber die einzige für mich brauchbare Lösung die dort gefunden wurde:


int** i;

main()
{

i = (int**)malloc(sizeof(int[10]));
i[10] = (int*)malloc(sizeof(int[20]));
i[1][1] = 5;
printf ("%i",i[1][1]);
return 0;
}
[/PHP]

verursacht bei mir immer einen Programmabsturz.

Ansonsten konnte ich im Forum auch nichts finden was mir weiterhilft.

Vielleicht hilft es euch ja mir zu helfen wenn ich sage wofür ich das brauche.

Also, ich will eine Tabelle darstellen die sich der Anzahl der Werte anpasst (d.h. bei 6 Rubriken

und 40 Datensätzen hat die Tabelle 6 Spalten und 40 Zeilen). Hirfür wollte ich

halt ein mehrdimensionales Array des Datentypes [i]HWND[/i] dynamisch anlegen.

Die Alternative von Olli_Master: [i]Eine Klasse, die das Array kapselt und den [] - operator überschreibt. Vielleicht gibt es die schon irgendwo?[/i] hab ich nicht so ganz verstanden vielleicht kann mir das noch jemand erklären.

Geschrieben

Hier ist der ganze Code(der dient nur zum Testen):


#include <stdio.h>
#include <malloc.h>

int** i;

main()
{

i = (int**)malloc(sizeof(int[10]));
i[10] = (int*)malloc(sizeof(int[20]));
i[1][1] = 5;
printf ("%i",i[1][1]);
return 0;
}
[/PHP]

Beim Ausführen bekomme ich in der Zeile [i]i[1][1] = 5; [/i] eine Access Violation.

Geschrieben

Is mir schon klar, dass das nicht funktioniert...du hast dir wohl genau das falsche Stueck Code rausgesucht :)

Versuchs in dem Fall lieber mal mit

main()
{
int** i;
i = (int**)malloc(sizeof(int*));
i[0] = (int*)malloc(20 * sizeof(int));
i[0][0] = 5;
i[0][19] = 19;
printf ("%i",i[0][0]);
printf ("%i",i[0][19]);[/PHP]

Falls du noch weitere Erklaerungen brauchst, dann frag einfach danach :)

Goos

Geschrieben

Cool, jetzt klappts. Danke Goos! :)

Aber warum klappt das nicht?:confused:


#include <stdio.h>
#include <malloc.h>

int** i;

main()
{
i = (int**)malloc(sizeof(int*));
for (int h=0; h<20; h++)
i[h] = (int*)malloc(20 * sizeof(int));
i[0][0] = 5;
printf ("%i",i[0][0]);
return 0;
}
[/PHP]

Macht keinen Fehler und gibt nichts aus.

Wie sieht das Feld nach der Schleife aus? i[20][?]

Geschrieben

Du braeuchtest dazu die Zeile:

i = (int**)malloc(20 * sizeof(int*));

anstelle von

i = (int**)malloc(sizeof(int*));

...wodurch das ganze aber dann nicht mehr sonderlich dynamisch ist *g*

.......wenns doch noch dynamisch sein soll, dann musst mit realloc arbeiten.

Goos

Geschrieben

Na das ist nicht mehr so dynamisch, weil du ja gleich festlegst, dass es 20 mal 20 gross ist, also aenderst daran ja nix mehr.....also ists auch nimmer so dynamisch :)

....und noch viel Spass dabei

Goos

Geschrieben

STL wäre was. vector zum Beispiel.

Vorschlag

#include <string>

#include <vector>

#include <iostream>

using std::string;

using std::vector;

using std::cout;

using std::endl;

typedef vector<int> INTVEC;

typedef vector<INTVEC> MATRIX;

const INTVEC ROW(10,0); // 10 Zellen mit 0 init

void ShowMatrix(MATRIX& m)

{

int i,j;

for(i=0;i<m.size();i++)

{

for(j=0;j<m[0].size();j++)

{

cout<<m[j]<<",";

}

cout<<endl;

}

}

int main(int argc, char* argv[])

{

MATRIX m;

m.resize(10,ROW); // Größe ändern

m.push_back(ROW); //Neue Reihe

//Vorsicht mit unterschiedlich großen Rows

//Funzt aber der Zugriff

//eigentlich eine eigene Matrix Klasse bauen

m[0][0]=34;

m[4][4]=67;

printf("Hallo Welt!\n");

ShowMatrix(m);

getchar();

return 0;

}

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...