www.mikrocontroller.net

Forum: Compiler & IDEs Wert des an eine Funktion uebergebenen Pointers


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier einige Funktionen, die unterschiedliche Datentypen aus 
einen Puffer extrahieren. Damit ein Folgeaufruf einer solchen Funktion 
an der richtigen Stelle des Puffers ausliest, wird der Pointer um die 
Groesse des Datentyps inkrementiert.
void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
{
    *( (unsigned char*) &(*uwData))      = **ucBuffer;
    (*ucBuffer)++;
    *(((unsigned char*) &(*uwData)) + 1) = **ucBuffer;
    (*ucBuffer)++;
}

unsigned char * pucFlashSeeker;
unsigned int    config;
unsigned long   setup;

BufferReadWord ( &config, &pucFlashSeeker);
BufferReadDWord( &setup,  &pucFlashSeeker);

Das Inkrementieren des Pointers klappt. Leider wird der Wert nicht 
korrekt extrahiert.
*( (unsigned char*) &(*uwData))      = **ucBuffer;

Ich habe bereits diverse Konstruktionen versucht. Wie komme ich an den 
Wert, auf den der an die Funktion uebergebene Pointer zeigt?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal das:
void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
{
  *uwData = (unsigned int *) *ucBuffer;

  (*ucBuffer) += sizeof (unsigned int);
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einer meiner bisherigen Versuche war dieser hier:
*( (unsigned char*) &(*uwData))      = (unsigned char*) *ucBuffer;

Lieferte aber leider nicht das gewuenschte Ergebnis...

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst Du eigentlich machen, mehrere chars in ein int reinstecken?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, da fehlte noch was.

void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
{
  *uwData = *((unsigned int *) *ucBuffer);
 
  (*ucBuffer) += sizeof (unsigned int);
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der char-Puffer kann in beliebiger Reihenfolge verschiedene Typen 
aufnehmen. Dazu werden sie in chars zerlegt und beim Einlesen wieder 
zusammengebaut, damit es keine Probleme mit dem Alignment gibt.

Ein Versuch mit
*( (unsigned char*) &(*uwData))      = *((unsigned char*) *ucBuffer);

liefert das gleiche Ergebnis wie
*( (unsigned char*) &(*uwData))      = (unsigned char*) *ucBuffer;


Im Puffer steht jeweils  0x12 0x12
und gelesen wird         0x02 0x02

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
>liefert das gleiche Ergebnis wie..
kann eigendlich nicht sein! Da die Rechten Ausdrücke verschieden sind.
*((unsigned char*) *ucBuffer);
der Inhalt auf den der emb. Pointer zeigt
und das ist der
(unsigned char*) *ucBuffer;

emb. Pointer selber -> seine Adresse

die Lösung von rufus scheint schon richtig zu sein.
Beitrag "Re: Wert des an eine Funktion uebergebenen Pointers"
Schon getestet???

mfg
Stephan

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wundert mich ebenfalls, dass beide Varianten das selbe Ergebnis liefern.
Vielleicht habe ich sonstwo noch einen Fehler drin...

Trotzdem vielen Dank fuer den Express-Support.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Zusammenhang mit Bytegewurschtel in einem Buffer und extrahieren von 
nicht Byteinformationen daraus
sowie dieser Fehlerbeschreibung
> Leider wird der Wert nicht korrekt extrahiert.

fällt mir sofort ein: Das du die richtige Endianess hast, hast du 
bedacht?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Ganze zuvor per Macro abgewicket und es hat ohne Probleme 
funktioniert. Im Laufe der Zeit ist der Code aber wie ein Hefeteig 
aufgegangen, deswegen jetzt jetzt per Funktion.
Sollte eigentlich auch klappen. Da ich jetz aber Referenzen benoetige, 
glaube ich, dass eben hier der Fehler steckt...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie vermutet hatte ich "sonstwo" noch einen Fehler. Genauer gesagt lag 
das Problem darin, dass zwei verschiedene Speichertypen beteiligt waren. 
Mit einheitlichem Datentyp war dann alles im Butter.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, mit einheitlichem Speichertyp natürlich.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan schrieb:
> der Inhalt auf den der emb. Pointer zeigt

emb.?

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.