[gelöst] Compiler Warnung trotz übersetzung unverständlich für mich

Hallo liebe Arduino Freunde,

beim compilieren meines Sketches

//----------------------Get Message from Baarkeeper-----------------------
byte getMessage(byte query, uint8_t quantity){
  static uint32_t frqStart = 0;
  byte msg = 0;
#if DEBUG
 byte msgOLD = 1; 
#endif  
  if (millis() - frqStart > 100)
  {
    Wire.beginTransmission(7);    // start transmit to slave arduino (7)
    Wire.write(query);            // sends one byte (cmd) to slave
    Wire.endTransmission();       // stop transmitting
    delay(5);
    Wire.requestFrom(7, quantity);          // request 1 byte from slave arduino (7)
    msg = Wire.read();              //
    delay(5);
    Wire.beginTransmission(7);
    Wire.write(0xC9);
    Wire.endTransmission();

#if DEBUG
if (msgOLD != msg){Serial.print(F("Message  0x")); Serial.println(msg,HEX);}
#endif
    frqStart = millis();
  }
  return msg;
}
//----------------------get mesage from barkeeper end---------------------

bekomme ich folgende Warnung, in bezug auf die Variable uint8_t quantity :

In file included from C:\Users\desit\Documents\Arduino\Sketchbook\CoctailMaker_v4_RFID-COINKasse_TEST1\CoctailMaker_v4_RFID-COINKasse_TEST1.ino:111:0:

C:\Users\desit\AppData\Local\Temp\arduino_build_20729\sketch\Functions.h: In function 'byte getMessage(byte, uint8_t)':

C:\Users\desit\AppData\Local\Temp\arduino_build_20729\sketch\Functions.h:152:33: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

     Wire.requestFrom(7, quantity);          // request 1 byte from slave arduino (7)

                                 ^

In file included from C:\Users\desit\Documents\Arduino\Sketchbook\CoctailMaker_v4_RFID-COINKasse_TEST1\CoctailMaker_v4_RFID-COINKasse_TEST1.ino:3:0:

C:\Users\desit\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src/Wire.h:64:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)

     uint8_t requestFrom(int, int);

             ^~~~~~~~~~~

C:\Users\desit\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.1\libraries\Wire\src/Wire.h:61:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)

     uint8_t requestFrom(uint8_t, uint8_t);

             ^~~~~~~~~~~

Laut Wire.h / Wire.cpp scheint Wire aber als 2.es Argument einen uint8_t zu erwarten.
biete ich aber diesen an, bekomme ich die Warnung. Setze ich für quantity aber anstelle des uint8_t einen unsigned int oder uint16_t ein, bleibt die Warnung aus.

Jetzt frage ich mich, und euch, warum?

Ich arbeite mit der IDE version 1.8.10

LG Stefan

Die 7 ist ein Int

Also so:
Wire.requestFrom(uint8_t(7), quantity);

Oder so:
Wire.requestFrom(7, int(quantity));

Hallo combie,

ja, Du hast Recht, laut Wire erwartet Wire.request sowohl für die Adresse als auch für die Anzahl zu lesender Bytes einen uint8_t.

Die Warnung ist auch erst aufgetreten, nachdem ich die fixe Anzahl (1) zu lesender Bytes durch eine Variable ersetzt habe.
Anscheinend ergab sich dadurch eine Diskrepanz in den Typen der beiden Argumente von Wire.request .
Kam wohl daher, dass ich dann den Typ des Adress-Arguments eben nicht spezifiziert habe.

Hab es jetzt so gefixt, dass ich die Adresse am Anfang der Funktion als 'uint8_t adr' deklariere , und überal wo die Adresse gebraucht wird, die 7 durch 'adr' ersetzt habe, damit ist der Compiler jetzt zufrieden.

Danke combie, für den Stups in die richtige Richtung. Wieder was gelernt.

LG Stefan

laut Wire erwartet Wire.request sowohl für die Adresse als auch für die Anzahl zu lesender Bytes einen uint8_t.

Die Meldung spricht deutlich von zwei Kandidaten, welche zur Wahl stehen!

uint8_t requestFrom(int, int);
uint8_t requestFrom(uint8_t, uint8_t);
Die solltest du auch beide in der Library wieder finden.

Ansonsten:
Gerne doch!

Ach sooo!
Jetzt verstehe ich erst richtig, danke combie. :slight_smile:
Kommt halt davon, wenn man gar kein englisch kann, so wie ich. (hatte ich nie unterrichtet darin bekommen), zudem hab ichs nicht so mit Sprachen. Hab schon mit Hochdeutsch/Schriftdeutsch (wie das in meiner Schule genannt wurde) so meine Probleme.

LG Stefan

Google Translator
Deepl
Helfen dir solche Meldungen trotzdem zu verstehen.

Wobei Deepl in meinen Augen wesentlich besser ist. Ist aus dem Lingue-Projekt in Köln entstanden.

Gruß Tommy

Hallo combie,
oh, ich hab google-translator benutzt, nur schien es diesmal wohl weniger an der Übersetzung selbst, als eher an meiner Fehlinterpretation derer gelegen zu haben (schäm).

LG Stefan

Hab es jetzt so gefixt, dass ich die Adresse am Anfang der Funktion als 'uint8_t adr' deklariere , und überal wo die Adresse gebraucht wird, die 7 durch 'adr' ersetzt habe, damit ist der Compiler jetzt zufrieden.

So verleitet einen der Compiler dazu, ein guter Mensch zu werden :slight_smile:

Da die Slave Adresse mehrfach gebraucht wird und fest ist, würde sich ein

const byte SLAVEADR = 7;

oder so was ähnliches irgendwo am Code-Anfang geradezu anbieten. (Damit kann der Compiler prima arbeiten: Er kennt den Datentyp und kann optimalen Code mit der festen ((uint8_t)7) generieren.

Und als Mensch fragt man sich nicht nach der Bedeutung dieser 7.

Ja michael_x, const ist natürlich noch besser. Hab ich auch so deklariert.

Die Bedeutung der 7 hatte ich jedoch im Zeilenkommentar erwähnt, so dass dies auch später noch klar ersichtlich ist.

LG Stefan