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


von Peter (Gast)


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.
1
void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
2
{
3
    *( (unsigned char*) &(*uwData))      = **ucBuffer;
4
    (*ucBuffer)++;
5
    *(((unsigned char*) &(*uwData)) + 1) = **ucBuffer;
6
    (*ucBuffer)++;
7
}
8
9
unsigned char * pucFlashSeeker;
10
unsigned int    config;
11
unsigned long   setup;
12
13
BufferReadWord ( &config, &pucFlashSeeker);
14
BufferReadDWord( &setup,  &pucFlashSeeker);

Das Inkrementieren des Pointers klappt. Leider wird der Wert nicht 
korrekt extrahiert.
1
*( (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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Probier mal das:
1
void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
2
{
3
  *uwData = (unsigned int *) *ucBuffer;
4
5
  (*ucBuffer) += sizeof (unsigned int);
6
}

von Peter (Gast)


Lesenswert?

Einer meiner bisherigen Versuche war dieser hier:
1
*( (unsigned char*) &(*uwData))      = (unsigned char*) *ucBuffer;

Lieferte aber leider nicht das gewuenschte Ergebnis...

von Mark B. (markbrandis)


Lesenswert?

Was willst Du eigentlich machen, mehrere chars in ein int reinstecken?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ah, da fehlte noch was.

1
void BufferReadWord(unsigned int *uwData, unsigned char **ucBuffer)
2
{
3
  *uwData = *((unsigned int *) *ucBuffer);
4
 
5
  (*ucBuffer) += sizeof (unsigned int);
6
}

von Peter (Gast)


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
1
*( (unsigned char*) &(*uwData))      = *((unsigned char*) *ucBuffer);

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


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

von Stephan (Gast)


Lesenswert?

Hi
>liefert das gleiche Ergebnis wie..
kann eigendlich nicht sein! Da die Rechten Ausdrücke verschieden sind.
1
*((unsigned char*) *ucBuffer);
der Inhalt auf den der emb. Pointer zeigt
und das ist der
1
(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

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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?

von Peter (Gast)


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...

von Peter (Gast)


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.

von Peter (Gast)


Lesenswert?

Sorry, mit einheitlichem Speichertyp natürlich.

von Simon K. (simon) Benutzerseite


Lesenswert?

Stephan schrieb:
> der Inhalt auf den der emb. Pointer zeigt

emb.?

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.