Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Brauche hilfe bei Mehrdimensionalen dynamischen Arrays

Empfohlene Antworten

Veröffentlicht

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

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?

  • Autor

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.

Hmmm.....was fuer nen Programmabsturz verursachts denn?

...und in welcher Art und Weise bindest du das ein?

.....vielleicht postest mal n Stueckl von deinem Quellcode.

Goos

  • Autor

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.

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

  • Autor

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][?]

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

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

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;

}

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.