Forum: Compiler & IDEs pointer auf daten im flash


von ben (Gast)


Lesenswert?

hi ich habe daten im flash des avr:
1
const uint8_t daten1[128] PROGMEM = {....};
2
const uint8_t daten2[128] PROGMEM = {....};

in einer funktion möchte ich nun dynamisch darauf zugreifen können
1
void tuWas(const uint8_t * d)
2
{
3
    pgm_read_byte(d[0]);
4
}
5
6
...
7
8
tuWas(&daten1);

leider bekomme ih folgendes warning. werde daraus nicht schlau:
1
note: expected 'const uint8_t *' but argument is of type 'const uint8_t (*)[128]'|

wie macht man soetwas korrekt ?

danke

von Rolf M. (rmagnus)


Lesenswert?

ben schrieb:
> leider bekomme ih folgendes warning. werde daraus nicht schlau:
> note: expected 'const uint8_t *' but argument is of type 'const uint8_t
> (*)[128]'|

Die ist doch eigentlich recht klar:

> void tuWas(const uint8_t * d)

Deine Funktion erwartet also einen Zeiger auf einen uint8_t.

> tuWas(&daten1);

daten1 ist ein Array aus uint8_t, also ist &daten1 ein Zeiger auf ein 
Array.
Versuch's mal mit &daten1[0].

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Vielleicht wäre es an der Zeit, PROGMEM in der Vergangenheit ruhen zu 
lassen und auf __flash umzuschwenken? Also
  const __flash uint8_t daten1[128] = {....};
und
  void tuWas(const __flash uint8_t * d)
  {
    ... d[0];
  }

von Mitlesa (Gast)


Lesenswert?

A. K. schrieb:
> Vielleicht wäre es an der Zeit, PROGMEM in der Vergangenheit ruhen zu
> lassen

Das geht aber bei den älteren GCCs (AVR Studio) noch nicht .....

von Falk B. (falk)


Lesenswert?

@ A. K. (prx)

>Vielleicht wäre es an der Zeit, PROGMEM in der Vergangenheit ruhen zu
>lassen und auf __flash umzuschwenken? Also
>  const __flash uint8_t daten1[128] = {....};
>und
>  void tuWas(const __flash uint8_t * d)
>  {
>    ... d[0];
>  }

Dann müsste man dennoch die Funktion so aufrufen.

tuWas(&d[0]);

;-)

von ben (Gast)


Lesenswert?

alles klar, danke

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> @ A. K. (prx)
>
>>  const __flash uint8_t daten1[128] = {....};
>>
>>  void tuWas (const __flash uint8_t *d)
>>  {
>>    ... d[0];
>>  }
>
> Dann müsste man dennoch die Funktion so aufrufen.
>
> tuWas (&d[0]);

Und warum sollte man das "müssen"?

von Falk B. (falk)


Lesenswert?

@ Johann L. (gjlayde) Benutzerseite

>> Dann müsste man dennoch die Funktion so aufrufen.
>>
>> tuWas (&d[0]);

>Und warum sollte man das "müssen"?

Ja, hast ja Recht, war auch nur ein kleiner Spaß. Sobald aber der Index 
ungleich null ist, muss man wieder.

von SF6 (Gast)


Lesenswert?

Falk Brunner schrieb:
> Sobald aber der Index
> ungleich null ist, muss man wieder.
Wieso müssen?
1
tuWas(d + index);

von Rolf M. (rmagnus)


Lesenswert?

Johann L. schrieb:
> Und warum sollte man das "müssen"?

Weil die Art, wie der TE es übergibt, damit immer noch falsch ist. Siehe 
Beitrag "Re: pointer auf daten im flash"

SF6 schrieb:
> Falk Brunner schrieb:
>> Sobald aber der Index
>> ungleich null ist, muss man wieder.
> Wieso müssen?tuWas(d + index);

Das ist doch nur ein andere Schreibweise für die selbe Sache.

von Falk B. (falk)


Lesenswert?

@ Rolf Magnus (rmagnus)

>Weil die Art, wie der TE es übergibt, damit immer noch falsch ist. Siehe
>Beitrag "Re: pointer auf daten im flash"

Nein.

&daten1[0] == daten1

Der Name eines Arrays ist ein Pointer auf diesen selbst und damit das 
Element mit dem Index 0. Will man einen Pointer auf ein anderes Element, 
braucht man entweder den Adressoperator oder muss es als Pointer 
schreiben. Willkommen in der C-Welt.

&daten1[5] == daten1 +5;

von Rolf M. (rmagnus)


Lesenswert?

Falk Brunner schrieb:
> @ Rolf Magnus (rmagnus)
>
>>Weil die Art, wie der TE es übergibt, damit immer noch falsch ist. Siehe
>>Beitrag "Re: pointer auf daten im flash"
>
> Nein.
>
> &daten1[0] == daten1

Er hat aber nicht daten1, sondern &daten1 geschrieben.

> Der Name eines Arrays ist ein Pointer auf diesen selbst und damit das
> Element mit dem Index 0.

Ein Pointer auf das Array und einer auf dessen erstes Element enthalten 
zwar die gleiche Adresse, sind aber von verschiedenen Typen. Und genau 
deshalb kam die Warnung des Compilers.

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.