Forum: Compiler & IDEs Array - Zeiger erst ab 2ten Element


von Julian W. (julian-w) Benutzerseite


Lesenswert?

Hallo,
ich hab ein Array, dass z.B. 40 Elemente hat. Nun möchte ich einen 
Zeiger auf dieses Array machen, jedoch soll dieser Zeiger erst ab dem 10 
Element "anfangen". Hier mal ein kleines Code-Beispiel, wie ich es 
meine:
1
volatile char puffer[40];
2
3
[...]
4
5
puffer[9] = 0xFF;
6
7
// Hier das funktioniert natürlich nicht
8
uint8_t (*tmp)[30] = puffer[]+10;
9
10
if(tmp[0] == 0xFF)
11
{
12
   // DAS SOLLTE JETZT RICHTIG SEIN
13
}
14
15
[...]

Ich hoffe, ihr versteht, wie ich es meine. Grund dafür ist, dass mich 
die ersten 10 Bytes nicht interessieren (zumindest vorerst nicht), ich 
jedoch öfters Befehle wie memcpy ausführe, welche ich lieber benutze, 
als das mit "langsamen" for-Schleifen zu machen.

Hoffe, ihr könnt mir helfen!

MfG
Julian

von Stefan (Gast)


Lesenswert?

uint8_t *tmp = puffer + 10*sizeof(puffer[0]);

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Stefan schrieb:
> uint8_t *tmp = puffer + 10*sizeof(puffer[0]);

Mensch, das ging aber schnell!

Danke, werde das morgen mal ausprobieren...

von Peter (Gast)


Lesenswert?

> uint8_t *tmp = puffer + 10*sizeof(puffer[0]);
das kann der compieler schon selber.

uint8_t *tmp = puffer + 10

von Thomas (Gast)


Lesenswert?

Oder:
uint8_t *tmp = &puffer[10];

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Peter schrieb:
>> uint8_t *tmp = puffer + 10*sizeof(puffer[0]);
> das kann der compieler schon selber.
>
> uint8_t *tmp = puffer + 10

Also bei mir gibt das ne Warnung vom Compiler:

warning: initialization discards qualifiers from pointer target type

von Peter (Gast)


Lesenswert?

> warning: initialization discards qualifiers from pointer target type
ja weil dein array ein char ist und die dann ein zeigen auf ein uint8_t 
haben willst. - Dast wird später mal bei unicode schwer

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Stimmt, gar nicht gemerkt (ist ja auch schon spät ;)

von Klaus W. (mfgkw)


Lesenswert?

mit "discards qualifier" wird der Compiler das volatile meinen.

Ich bin dafür:
1
  volatile uint8_t  puffer[40];
2
  puffer[9] = 0xFF;
3
4
  volatile uint8_t *tmp = puffer+10; // beachte: volatile
5
6
  if(tmp[0] == 0xFF)
7
  {
8
    // DAS SOLLTE JETZT RICHTIG SEIN
9
  }

von Klaus W. (mfgkw)


Lesenswert?

ach so: wenn du auf so ein Feld dann mit anderen Funktionen
losgehen willst (memcpy etc.), kennen die nichts von volatile.
Zur Übergabe müsste man entsprechend casten, und läuft dann
Gefahr, daß in der Funktion Dinge passieren, die man eigentlich
mit volatile ausschließen will.

Deshalb müsste man sich eigentlich von den Funktionen eigene
bauen, die das volatile beachten.
Oder hoffen...

von Sven P. (Gast)


Lesenswert?

Julian W. schrieb:
> Stefan schrieb:
>> uint8_t *tmp = puffer + 10*sizeof(puffer[0]);
>
> Mensch, das ging aber schnell!
Ist aber leider falsch. Der Teil mit sizeof muss weg; der kann nicht 
weg, sondern der muss weg. Spätestens bei größeren Datentypen geht das 
sonst schief.

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> ach so: wenn du auf so ein Feld dann mit anderen Funktionen
> losgehen willst (memcpy etc.), kennen die nichts von volatile.
> Zur Übergabe müsste man entsprechend casten, und läuft dann
> Gefahr, daß in der Funktion Dinge passieren, die man eigentlich
> mit volatile ausschließen will.
>
> Deshalb müsste man sich eigentlich von den Funktionen eigene
> bauen, die das volatile beachten.
> Oder hoffen...

Achso, d.h. mit memcpy würde es Probleme wegen dem volatile geben. 
Nunja, gerade das ist hier ziemlich wichtig, da viel mit Interrupts 
gearbeitet wird, und alle Interrupts dieses Array brauchen.

Gut, dann werde ich mir für diesen Zweck wohl doch eine eigene Lösung 
basteln müssen :(
Aber später werd ich dies sicherlich wieder brauchen können :)

von Sven P. (Gast)


Lesenswert?

Wobei das im Fall von memcpy wohl weniger tragisch ist: Der GCC wird 
wohl kaum den Inhalt eines ganzen Vektors in irgendwelchen Registern 
zwischenspeichern oder so...

Will sagen: Innerhalb von memcpy ist diese Optimierungsbedingung ja 
nicht mehr gegeben.

von Julian W. (julian-w) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Wobei das im Fall von memcpy wohl weniger tragisch ist: Der GCC wird
> wohl kaum den Inhalt eines ganzen Vektors in irgendwelchen Registern
> zwischenspeichern oder so...
>
> Will sagen: Innerhalb von memcpy ist diese Optimierungsbedingung ja
> nicht mehr gegeben.

Werde es trotzdem vorerst mal so umschreiben (dürfte ja keine Probleme 
machen, oder?):
1
for(tmp = 0;tmp<=29;tmp++)
2
{
3
     Data1[1][tmp] = puffer[tmp + 10];
4
}

Momentan ist der Rest der Software noch ziemlich verbuggt und in Arbeit, 
daher lasse ich memcpy mal sicherheitshalber weg.

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.