Array - Zeiger erst ab 2ten Element

OP Persönliche Seite #1306327
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
Gast #1306342
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
#1306437
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...
Gast #1306455
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.
OP Persönliche Seite #1306513
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 :)
Gast #1306515
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.
OP Persönliche Seite #1306516
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.

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