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));
}
}
}
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.
Hi Karl, soll ich immer die Funktion so vInitArray(u8MyArray); aufrufen ich habe geändert und bekomme kein mehr Fehler
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; |
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.
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.
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.
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.
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));
}
}
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.