Array - Zeiger erst ab 2ten Element

OP Persönliche Seite #1306327
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
> 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
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
  }
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.