Forum: PC-Programmierung 2D Arrays und Zugriff über Pointer?


von Frank Sotter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hab mal ne Frage zur Verwendung von Pointer im Zusammenhang mit 
2D-Arrays!
Ich hab da ein bißchen im angefügten C-file geschrieben!
Ich möchte quasi:

  if (d1 == &d1_buf2[len_max_short]) {
    mach' was;
  }

in das hier überführen:

  if (d1 == &d1_buf[2][len_max_short]) {
    mach' was;
  }

wobei "len_max_short die maximale Länge vom 2ten Element von "d1_buf" 
ist!

von Daniel (Gast)


Lesenswert?

Was ist denn jetzt die Frage?  :-D

von Karl H. (kbuchegg)


Lesenswert?

Vielleicht gehts nur mir so.
Aber ich hab nicht den leisesten Schimmer einer Ahnung, was du 
eigentlich willst und warum der ordinäre Adress Of Operator nicht gut 
genug ist.

von Frank Sotter (Gast)


Lesenswert?

Daniel schrieb:
> Was ist denn jetzt die Frage?  :-D

Ähm oh man ging das nicht hervor!
Hmmmh also kurz gesagt:

Ich brauche ein 2D Array aus
z.B.
array[8][] und der zweite Parameter hat unterschiedliche Längen!
also
achso hier ist der erste Index wirklich der Index ;)
und der zweite die jeweils gewünschte Länge?
array[0][2]
array[1][4]
array[2][8]
array[3][16]
array[4][32]
array[5][64]
array[6][128]
array[7][256]

geht so was steh gerad auf Schlauch?

von Michael W. (mt1)


Lesenswert?

Das geht nicht.
Du willst das dein Array so aussieht

  m
n x - x - x - x - x - x - x - x
  x - x - x - x - x - x - x - x
  x - x - x - x - x - x - x - x
  x - x -   - x - x - x - x - x
  x - x -   - x - x -   - x - x
    - x -   - x - x -   - x - x
    - x -   - x - x -   - x - x
    - x -   -   - x -   - x - x
    - x -   -   - x -   - x - x
    - x -   -   -   -   - x - x

Aber bei der Deklaration legst du schon fest dass dein Array eine n x m 
Matrix aufweist.

Bsp.:
<type> <name>[n][m];
int array1[8][4];
  m
n x - x - x - x - x - x - x - x
  x - x - x - x - x - x - x - x
  x - x - x - x - x - x - x - x
  x - x - x - x - x - x - x - x

von 2D (Gast)


Lesenswert?

1
char arr1[2];
2
char arr2[33];
3
char arr3[111];
4
char arr4[44];
5
6
char* arrArr[] = {arr1, arr2, arr3, arr4};
7
8
char foo (void) {
9
  return (arrArr[2][22];
10
}

mal was zum Zerreissen ;-)

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Im Endeffekt Pointer-Array welches Pointer auf z.B. vordefinierte Arrays 
hat.

#define BUF4 2

short d1_buf4[BUF4*2]={1,2}, d2_buf4[BUF4*2]={2,3},
      d3_buf4[BUF4*2]={4,5}, d4_buf4[BUF4*2]={6,7},
      d5_buf4[BUF4*2]={8,9}, d6_buf4[BUF4*2]={10,11},
      d7_buf4[BUF4*2]={12,13},
      d8_buf4[BUF4*13]={14,15,16,17,18,19,20,21,22,23,24,25,26};

short* buf4[]={ d1_buf4,d2_buf4,d3_buf4,d4_buf4,
                d5_buf4,d6_buf4,d7_buf4,d8_buf4};

int main()
{
    printf("%i",buf4[2][1]);
    return 0;
}

von Klaus W. (mfgkw)


Lesenswert?

Ja, wenn ich die (etwas wirre) Frage richtig verstanden habe, sieht so 
etwa die Antwort aus.

Aber:

Frank Sotter schrieb:
> if (d1 == &d1_buf[2][len_max_short]) {
>     mach' was;
>   }
>
> wobei "len_max_short die maximale Länge vom 2ten Element von "d1_buf"
> ist!

Wenn das Feld in der ersten Dimension 2 Elemente hat, und in der zweiten 
len_max_short, dann darf der Index nur bis 2-1 bzw. len_max_short-1 
gehen! Es fängt ja jeweils bei 0 an zu zählen.
d1_buf[2][len_max_short] ist also eine Feldgrenzenüberschreitung.

von Frank Sotter (Gast)


Angehängte Dateien:

Lesenswert?

Ok ich hab jetzt mal nen neuen Versuch gemacht!

Also ich hab in der angefügten Datei versucht ein struct zu erstellen!
Ist das so richtig? bzgl. Indizes etc.?

von Klaus W. (mfgkw)


Lesenswert?

nein, du kannst doch in einem typedef nichts intialisieren.

Das hätte dir dein Compiler auch sagen können.

von Karl H. (kbuchegg)


Lesenswert?

ICh werd das Gefühl nicht los, dass hier versucht wird ein Problem mit 
untauglichen Mítteln zu lösen. Und anstelle das man das Problem 
attackiert, fragt man sich wie man die untauglichen Mitteln dem Compiler 
unterjubeln könnte.

von Frank Sotter (Gast)


Lesenswert?

Ok mir ist jetzt klar was ich brauche:

Und zwar brauche ich ein Array wie folgt:

z.B.

float array[8][8][variable] also

die letzte Dimension des Arrays ist unterschiedlich lang?

also
array[0][0][]={2,3};
array[0][1][]={2,3};
array[0][2][]={2,3};
array[0][3][]={2,3};
array[0][4][]={2,3};
array[0][5][]={2,3};
array[0][6][]={2,3};
array[0][7][]={2,3,4,5,6,7,8,9,10,11,12,13,14};

array[1][0][]={2,3,2,3};
array[1][1][]={2,3,2,3};
array[1][2][]={2,3,2,3};
array[1][3][]={2,3,2,3};
array[1][4][]={2,3,2,3};
array[1][5][]={2,3,2,3};
array[1][6][]={2,3,2,3};
array[1][7][]={2,3,4,5,6,7,8,9,10,11,12,13,14,2,3,4,5,6,7,8,9,10,11,12,1 
3,14};
.
.
.
etc.

wie kann man so was machen ? schließlich möchte ich dann per Index auf 
ein Element zugreifen?

von Karl H. (kbuchegg)


Lesenswert?

Frank Sotter schrieb:
> Ok mir ist jetzt klar was ich brauche:
>
> Und zwar brauche ich ein Array wie folgt:
>
> z.B.
>
> float array[8][8][variable] also
>
> die letzte Dimension des Arrays ist unterschiedlich lang?

Indem du die 'letzte Dimension' nicht als Arrayindex auffasst, sondern 
ein 8*8 Array von Pointern anlegst. An jeden Pointer allokierst du dann 
dynamisch ein float Array mit der gewünschten Größe.

Aufpassen: Das ist Vorstellungsmässig nicht das, was dir vorschwebt, 
aber es implementiert dein gewünschtes Verhalten. Und es unterscheidet 
sich syntaktisch in der Verwendung nicht von einem echten 3D Array .. 
sprich: du greifst nach wie vor mittels Array-Indexierung auch auf die 
letzte Dimension zu.


Am Beispiel 2D-Array, wobei die letzte Dimension variabel sein soll

int* Data[5];

   Data[0] = malloc( 2 * sizeof(**Data));   // Allokiere 2 Elemente
   Data[0][0] = 8;
   Data[0][1] = 3;

   Data[1] = malloc( 4 * sizeof(**Data));   // jetzt 4
   Data[1][0] = 2;
   Data[1][1] = 4;
   Data[1][2] = 5;
   Data[1][3] = 27;

...


Was du in Wirklichkeit damit aufgebaut hast, sieht im Speicher so aus

  Data
  +------+          +---+---+
  |  o------------->| 8 | 3 |
  +------+          +---+---+
  |  o--------+
  +------+    |          +---+---+---+---+
  |      |    +--------->| 2 | 4 | 5 | 27|
  +------+               +---+---+---+---+
  |      |
  +------+
  |      |
  +------+

es ist kein echtes 2D Array, denn bei dem würden die einzelnen Elemente 
im Speicher direkt hintereinander liegen. Das allerdings bedingt wieder, 
dass alle Zeilen gleich lang sind, und das ist nicht das was du 
(anscheinend) haben willst.

von Frank Sotter (Gast)


Angehängte Dateien:

Lesenswert?

Moin ich hab's glaube ich endlich geschafft.

siehe anghängte Datei!

ich kann nun das Array "stage"
über 3 Indizes ansprechen!!
also
stage[0][3[7] z.B.

jetzt kann ich mich an die nächste Aufgabe machen, die ich (in 
kompliziert schon gelöst habe;) !!)

Vielen Dank für die Inspiration allen die hier bis jetzt geschrieben 
haben

von 2D (Gast)


Lesenswert?

warum machst Du es so kompliziert, schau Dir das einemal in Ruhe an:
Beitrag "Re: 2D Arrays und Zugriff über Pointer?"

Das dürfte genau Deinen Bedarf decken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.