print Rückgabewert unklar

Hallo,

weil ich auch gerade an einer Formatierungsfunktion arbeite, fiel mir auf, dass der print Rückgabewert irgendwie nicht nachvollziehbar ist. Arduino print und Tommys printHex geben für eine 32Bit Variable 8 Bytes zurück. Kann aber nicht sein, wenn 32Bit nur 4 Bytes hat. Es wird immer der doppelte Wert zurückgegeben. Stimmt der Rückgabewert nicht oder habe ich einen Denkfehler?

In der print Beschreibung steht, dass die Anzahl der geschriebenen Bytes zurückgegeben wird. Was versteht man unter "geschrieben"? Selbst wenn ich noch den Nullterminator und LF dazuzähle komme ich auf 4+2 = 6 Bytes die geschrieben werden. Ich verstehe es aktuell nicht. Nutzt überhaupt jemand diesen Rückgabewert für irgendwas?

// https://forum.arduino.cc/index.php?topic=709714.0
// Printerweiterung führende 0 für Hexzahlen > 0

template <class T>
size_t formatHex(Stream &out, const T &value, const bool isLF = false)
{
  size_t count = 0;
  uint8_t len = sizeof(value) * 2;
  uint8_t nibble;
  T aktVal;
  char puffer[17]; // max. longlong = 8 * 2 + '\0'
  memset(puffer,0,sizeof(puffer));
  // keine negativen Zahlen und max. 8 Byte groß
  if (value < 0 || len > 16) {
    count =  out.print("Error");
    if (isLF) count += out.println();
    return count;
  }
  aktVal = value;
 
  for(int8_t i=len-1;i>=0;i--) {
    nibble = aktVal % 16;
    aktVal = aktVal / 16;
    puffer[i] = (nibble > 9) ? nibble-10+'A' : nibble+'0';
  }
  count = out.print(puffer);
  if (isLF) count += out.println();
  return count;
}

unsigned long a = 0xBBFFFFFF;
unsigned int b = 54321;
byte c = 128;

void setup()
{
  Serial.begin(250000);
  Serial.println(F("\nStart #### ####"));
  size_t bytes {0};
  
  Serial.print(a); Serial.print('\t');
  bytes = formatHex(Serial, a); Serial.print("  Bytes: "); Serial.print(bytes); Serial.print('\t');
  bytes = Serial.print(a, HEX); Serial.print("  Bytes: "); Serial.println(bytes);

  Serial.print(b); Serial.print('\t');
  bytes = formatHex(Serial, b); Serial.print("  Bytes: "); Serial.print(bytes); Serial.print('\t');
  bytes = Serial.print(b, HEX); Serial.print("  Bytes: "); Serial.println(bytes);

  Serial.print(c); Serial.print('\t');
  bytes = formatHex(Serial, c); Serial.print("  Bytes: "); Serial.print(bytes); Serial.print('\t');
  bytes = Serial.print(c, HEX); Serial.print("  Bytes: "); Serial.println(bytes);
}

void loop()
{}

Wenn Du die 4 Bytes in Hex ausgibst, wird aber jedes Byte in 2 Zeichen ausgegeben, also insgesamt 8.
Es wird die Anzahl der ausgegebenen Zeichen zurückgegeben, nicht die Größe des Datentypes.

Gruß Tommy

Doc_Arduino:
In der print Beschreibung steht, dass die Anzahl der geschriebenen Bytes zurückgegeben wird. Was versteht man unter "geschrieben"?

Es fehlt das verwertete 0x

Was da überhaupt nicht ausgegeben wurde.

Gruß Tommy

Stimmt der Rückgabewert nicht oder habe ich einen Denkfehler?

Denkfehler!

Dir wird die Anzahl char zurückgegeben.

Um einen 4 Byte Wert hexadezimal auszugeben bedarf es 8 char.

Doc_Arduino:
Stimmt der Rückgabewert

Nachdem heute wieder der Tag des Bash ist:

8bit: 11111111 - HEX: FF
16bit: 11111111 11111111 - HEX: FF FF
24bit: 11111111 11111111 11111111 - HEX: FF FF FF
32bit: 11111111 11111111 11111111 11111111 - HEX: FF FF FF FF

Bei der Zusammenstellung wird auf die Leerstelle verzichtet.
FF -2
FFFF -4
FFFFFF -6
FFFFFFFF -8

my_xy_projekt:
Nachdem heute wieder der Tag des Bash ist:

Nö, der Deiner falschen Aussagen, die Du wieder als richtig durchprügeln willst und zu diesem Zweck nicht mehr darauf ein gehst sondern etwas völlig anderes schreibst.

Gruß Tommy

Hallo,

okay, die Anzahl der zu "druckenden" Zeichen, nicht die Anzahl der Datentyp Bytes. Alles klar.
Vielen Dank Leute.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.