Zeiger auf zwei dimensionale Array

Gast #2570232
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));

        }
    }
}
#2570259
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.
#2570377
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.
#2570378
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.
Gast #2570401
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));

        }
    }
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren