mikrocontroller.net

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


Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
volatile char puffer[40];

[...]

puffer[9] = 0xFF;

// Hier das funktioniert natürlich nicht
uint8_t (*tmp)[30] = puffer[]+10;

if(tmp[0] == 0xFF)
{
   // DAS SOLLTE JETZT RICHTIG SEIN
}

[...]

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

Autor: Stefan (Gast)
Datum:

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

Autor: Julian W. (julian-w) Benutzerseite
Datum:

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

Mensch, das ging aber schnell!

Danke, werde das morgen mal ausprobieren...

Autor: Peter (Gast)
Datum:

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

uint8_t *tmp = puffer + 10

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder:
uint8_t *tmp = &puffer[10];

Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Julian W. (julian-w) Benutzerseite
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit "discards qualifier" wird der Compiler das volatile meinen.

Ich bin dafür:
  volatile uint8_t  puffer[40];
  puffer[9] = 0xFF;

  volatile uint8_t *tmp = puffer+10; // beachte: volatile

  if(tmp[0] == 0xFF)
  {
    // DAS SOLLTE JETZT RICHTIG SEIN
  }

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?):
for(tmp = 0;tmp<=29;tmp++)
{
     Data1[1][tmp] = puffer[tmp + 10];
}

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.