Forum: Compiler & IDEs Zeiger auf zwei dimensionale Array


von Louis (Gast)


Lesenswert?

hi,
ich habe das folgende kleines Programm geschrieben.Beim compilieren 
bekomme ich Fehler
Error  2 expected 'uint8_t *' but argument is of type 'uint8_t (*)[5]'
Error  3 subscripted value is neither array nor pointer
Was los ist weib ich nicht. Ich brauche Hilfe


#define LINE    5
#define COLUMN  5
int main()
{
 uint8_t u8MyArray[LINE][COLUMN];
 vInitArray(u8MyArray);
}
void vInitArray(uint8_t *Array)
//void vInitArray(uint8_t (*Array)[LINE][COLUMN]);
{

     uint8_t u8i=0;
     uint8_t u8j=0;

    for(u8j=0 ; u8j<LINE ; u8j++)
    {
        for(u8i=0 ; u8i<COLUMN ; u8i++)

        {

      Array[u8i][u8j] = ((u8i)*(u8j));

        }
    }
}

von Karl H. (kbuchegg)


Lesenswert?

Louis schrieb:

> Was los ist weib ich nicht. Ich brauche Hilfe

Du hast das schon richtig identifiziert.

Du brauchst einen Pointer auf ein 2D Array.
ein banaler uint8_t Pointer kann das aber nicht. In ihm steckt nicht 
drinnen, wie groß die 'Zeilenlänge' ist. Die braucht der Compiler aber, 
damit er hier

   Array[u8i][u8j] = .....

auch das richtige Element adressieren kann.

Schreibs so

  void vInitArray(uint8_t Array[LINE][COLUMN])


ungeachtet der Schreibweise ist Array immer noch ein Pointer und kein 
Array. Aber er hat den richtigen Datentyp.

von Louis (Gast)


Lesenswert?

Hi Karl,
soll ich immer die Funktion so vInitArray(u8MyArray); aufrufen
ich habe geändert und bekomme kein mehr Fehler

von Louis (Gast)


Lesenswert?

im Debbuger my array ist ein 1 Dim Array

von Louis (Gast)


Lesenswert?

Bitte dumme Frage

von Ralf G. (ralg)


Lesenswert?

oder statt ...
Louis schrieb:
> Array[u8i][u8j] = ((u8i)*(u8j));
... in der ursprünglichen Funktion, müsste auch sowas gehen:
1
*(Array + u8j * COLUMN + u8i) = u8i * u8j;

von Karl H. (kbuchegg)


Lesenswert?

Louis schrieb:
> Hi Karl,
> soll ich immer die Funktion so vInitArray(u8MyArray); aufrufen
> ich habe geändert und bekomme kein mehr Fehler

Passt doch.

Die Funktion will einen Pointer auf ein 2D Array. Du gibst ihm einen.

von Karl H. (kbuchegg)


Lesenswert?

Louis schrieb:
> im Debbuger my array ist ein 1 Dim Array

Der Debugger ist an dieser Stelle uninteressant. Letztenendes ist im 
Speicher alles eine Abfolge von Bytes.

von Louis (Gast)


Lesenswert?

wie gebe ich ihm doch ein Pointer auf  2D

von Nico S. (nico22)


Lesenswert?

Ja, aber dein Speicher ist nunmal nur eindimensional. Was passiert, ist, 
dass einfach alle Zeilen hintereinander weg geschrieben werden, also aus

-----------------
| 1 | 2 | 3 | 4 |
-----------------
| 5 | 6 | 7 | 8 |
-----------------
| 9 | 10| 11| 12|
-----------------

wird im Arbeitsspeicher des Computers einfach

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12|

Es ist vom Debugger nicht falsch, es dir so anzuzeigen.

von Karl H. (kbuchegg)


Lesenswert?

Louis schrieb:
> wie gebe ich ihm doch ein Pointer auf  2D

Ausnahmslos jedes Array wird an eine Funktion übergeben, indem die 
Startadresse des Arrays übergeben wird. Das ist immer so und nicht davon 
abhängig, wieviele Dimensionen das Array hat. Aber auch diese 
Startadresse hat einen Datentyp.

In der Funktion wird diese Adresse an eine Pointervariablen gebunden und 
erst da ist dann die spannende Frage: stimmen die Dimensionen (und deren 
Dimensionierung) überein.


D.h. es reicht nicht, einfach nur zu sagen

   vInitArray( myArray );     // hier wird eine Adresse übergeben

und

void vInitArray( int* Array )  // und hier wird die Adresse gespeichert
                               // -> passt schon

sondern myArray (also die Startadresse), die hat einen Datentyp, der 
davon abhängt, wie das Array definiert wurde (wieviele Dimensionen und 
wie gross sind sie). Die empfangende Funktion muss in ihrem Argument zu 
diesem Datentyp passen.

von Louis (Gast)


Lesenswert?

bitte ein Beispiel wäre hilfreich

von Louis (Gast)


Lesenswert?

habe ich geändert,
ist das richtig?
void vInitArray(uint8_t (*pu8Array)[LINE][COLUMN])

{

   uint8_t u8i=0;
     uint8_t u8j=0;

    for(u8j=0 ; u8j<LINE ; u8j++)
    {
        for(u8i=0 ; u8i<COLUMN ; u8i++)

        {

      *pu8Array[u8i][u8j] = ((u8i)*(u8j));

        }
    }
}

von DirkB (Gast)


Lesenswert?

Entweder * oder [].

Du nimmst die []. Darum muss der * weg.

Kapitel Arrays und Pointer nochmal (mehrmals) durcharbeiten.

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.