Forum: Compiler & IDEs mit stdarg.h unsigned char mit variabler Anzahl übergeben


von Philipp C. (ba4_philipp)


Lesenswert?

Hallo,

ich würde gern eine Sendefunktion basteln, die über den UART ein paar 
Bytes versendet. Dazu gehören immer Startbytes, Endbytes eine Checksumme 
usw, darum soll sich die Senderoutine kümmern, ich möchte lediglich die 
eigentlichen Daten übergeben.

stdarg.h gefällt mir, weil ich gerne einige feste Datenblöcke mit 
defines definieren möchte. Es soll so in der Art aussehen:

#define FUNKTION_X 3, 0x23, 0x56
#define TASTE1 0x34

sende(FUNKTION_X, TASTE1);

Es soll dann folglich (3, 0x23, 0x56, 0x34) übergeben werden. Das lezte 
Byte ist hierbei nicht immer fest sondern wird teilweise berechnet 
wohingegen der vordere Teil fest bleibt.

Folgendes habe ich versucht:
1
void send (unsigned char length, ...) {
2
  unsigned char bcc;
3
  va_list pointer;
4
  unsigned char data;
5
  unsigned char i;
6
  
7
  va_start(pointer, length);
8
  
9
  ...
10
  
11
  for(i=1; i<=length; i++) {
12
            data = va_arg(pointer, unsigned char);
13
            UARTSendChar(data);
14
            ....
15
         };
16
  
17
         ...
18
  
19
  va_end(pointer);
20
};


Das ergibt dann beim Übersetzen leider folgende Ausgabe:

107: warning: 'unsigned char' is promoted to 'int' when passed through 
'...'
107: warning: (so you should pass 'int' not 'unsigned char' to 'va_arg')
107: note: if this code is reached, the program will abort

Ist es nicht möglich unsigned chars mit diesem Mechanismus zu übergeben?

Vielen Dank schonmal
Gruß Philipp

von Rolf Magnus (Gast)


Lesenswert?

> Ist es nicht möglich unsigned chars mit diesem Mechanismus zu
> übergeben?

Nein. Alle Integer-Typen, die kleiner als int sind, werden vor der 
Übergabe automatisch nach int konvertiert ("integer promotion").
Also wird nie ein Wert vom Typ 'unsigned char' in deiner va_list 
ankommen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du wirst weniger Überraschungen erleben, wenn du unsigned als Typ
nimmst, dann musst du aber jedes unsigned-char-Argument auch nach
unsigned casten.

von Philipp C. (ba4_philipp)


Lesenswert?

Ok Vielen Dank.

Dann muss ich es wohl doch anders machen

von G. L. (sprintersb)


Lesenswert?

Da 8-Bit-Werte zu 16-Bit promoted werden, müssen die Werte als 16-Bit 
abgeholt werden:
1
for (i=1; i<=length; i++) 
2
{
3
    UARTSendChar ((char) va_arg (pointer, int));
4
}

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.