INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
sprintf invalid operands of types
07.12.2014, 11:46 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 11:51 von HaWe.)
Beitrag #9
RE: sprintf invalid operands of types
sprintf formatiert keine Zahlenwerte ineinander um sondern verwandelt Zahlenwerte zu strings, die man dann z.B. mit anderen strings verketten oder auf dem Display anzeigen lassen kann.

Wenn als Ausgangszahlenwert eine float-Zahl steht musst du sie in sprintf als float formatieren, ansonsten gibt es Murks.

Wills du eine Floatzahl als Ganzzahl umwandeln, musst du es erst durch typecasting machen
int i = (int) FLOATWERT.
Du erhältst so die Nachkommastellen abgeschnitten. (Mathematisch richtig runden ist ein ganz klein wenig komplizierter.)

Dann musst du den int Wert in sprintf als int formatieren und erhältst dann einen String, der diesen Int-Wert darstellt.

ps, edit:
Ich weiß jetzt nicht, ob schon darauf hingewiesen wurde:
sprintf kann in Sketch sehr wohl auch mit floats umgehen, du musst nur dazu deine Sketch-Libs patchen.
Ist ein bisschen vorsintflutlich, aber es geht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 11:52 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 11:53 von Thorsten Pferdekämper.)
Beitrag #10
RE: sprintf invalid operands of types
(07.12.2014 11:34)sepp01 schrieb:  wenn ich enen Datentyp float habe und den auch benötige und ihn umwandeln soll in eine Integer damit sprintf damit umgehen kann, so würde doch normal dann eine Ganzzahl dabei rumkommen oder?
Hi,
ja, aber das ist doch genau das, was Du willst, oder?
Gruß,
Thorsten

(07.12.2014 11:46)HaWe schrieb:  sprintf kann in Sketch sehr wohl auch mit floats umgehen, du musst nur dazu deine Sketch-Libs patchen.
Ist ein bisschen vorsintflutlich, aber es geht.
Hi,
das würde ich nicht machen, da es meistens Overkill ist. Außerdem ist der Programmspeicher meistens schon knapp genug.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 12:09 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 12:11 von sepp01.)
Beitrag #11
RE: sprintf invalid operands of types
Hallo,
nein, ich will/brauch eigentlich keine Ganzzahl, ich benötige ja Temperaturwerte mit einer Nachkommastelle die dann in die DB geschrieben wird.
wenn ich den float-Datentyp in eine Integer umwandle so schneidet er mir ja die Nachkommastelle ab und das brauch ich nicht.

So wie ich das in dem beispielscript (DHT22, #include <DHT22.h>) des mysql_connectors gesehen habe, haben die extra für den DHT22 eine eigene lib die nicht mit floats arbeitet sondern mit INT. Die fügen dann diese INT-Werte wieder zusammen. so dass dann in die DB tatsächlich der Temperaturwert mit Nachkommastelle geschrieben wird.

Hier sieht man wie sie die Werte einzeln (Vor dem Komma und nach dem Komma) aus der lib bekommen.

sprintf(buf, "INSERT INTO dht22_test.temp_humid VALUES (NULL, %hi.%01hi, %i.%01i, %f.%01f)",
myDHT22.getTemperatureCInt()/10,
abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10,
myDHT22.getHumidityInt()%10),
int sensors.getTempCByIndex(0)/10, (den Mist habe ich gebaut)
int sensors.getTempCByIndex(0)%10; (den Mist habe ich gebaut)

mit %hi.%01hi, wird sie dann wieder zusammengesetzt.

Da ich aber meist durch meine anderen Sensoren wie den DS18B20 somit auch deren Libs verwende bekomme ich meist float-Datentypen zurück und anscheinend kann sprintf nicht so einfach damit umgehen.

Sorry, vielleicht bin ich jetzt auch total daneben, ich bin noch ganz am Anfang und versuche mich gerade da reinzuwühlen.

Bitte um Verständnis, will hier keinen ärgern.

Grüße Sepp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 12:31
Beitrag #12
RE: sprintf invalid operands of types
Hallo Sepp,

ich habe jetzt auch keine Lösung für das Problem aber vielleicht eine Möglichkeit das Problem zu "umschiffen".

Wenn du die "float" Messwerte der Sensoren mit 100 oder 1000 multiplizierst kommst du in Bereiche die ohne Informationsverlust als Ganzzahl, "int" oder "long", übertragen werden können.

Aus 123,456°C wird dann 12345 oder 123456.
Zur richtigen Anzeige müssen die Werte dann halt durch 100 oder 1000 dividiert werden.

Gruß
Arne

(07.12.2014 12:09)sepp01 schrieb:  ...
Da ich aber meist durch meine anderen Sensoren wie den DS18B20 somit auch deren Libs verwende bekomme ich meist float-Datentypen zurück und anscheinend kann sprintf nicht so einfach damit umgehen.
...

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 12:36 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2014 12:47 von sepp01.)
Beitrag #13
RE: sprintf invalid operands of types
Hallo
(07.12.2014 11:23)rkuehle schrieb:  Moin sepp,

Damit klar wird was du eigentlich erreichen möchtest, solltest du vielleicht Fragen beantworten:
- wie sieht deine SQL-Tabelle aus? Welche Spalten mit welchen Formaten?
Mein Tabelle in der DB besitzt die Datentypen float
ich habe eigentlich zum Testen nur die Beispieltabelle von C.Bell mit einem Feld (Datentyp Float) erweitert .
(07.12.2014 11:23)rkuehle schrieb:  - warum benutzt du für das INSERT nicht einfach einen vordefinierten String, der den immer wiederkehrenden Teil enthält, und erweiterst diesen um die jeweiligen Wertangaben? Da sparst du dir das sprintf.
das ist ja genau was ich dachte gelesen zu haben, dass der mysql_connector von C.Bell nur Strings erarbeiten kann die mit sprintf aufbereitet wurden

(07.12.2014 11:23)rkuehle schrieb:  - Warum willst du auf float überhaupt Modulo anwenden?
Bitte nicht lachen, aber ganz ehrlich?
Keine Ahnung, ich versuchte es einfach so zu machen wie im Beispielscript von C.Bell

(07.12.2014 11:23)rkuehle schrieb:  Der DHTxx bringt nun mal float Werte raus. Auf float Werte kann der Arduino (und auch jede andere Mathematik?) nun mal Modulo nicht anwenden.
Die meisten Libs ja, jedoch die DHT22.h bringt wohl Integer heraus die man dann zusammensetzen muss.
oder habe ich da was falsch gelesen/verstanden?

Grüße Sepp

werde mich mal in dem Thread von Dir umsehen

ps. den Thread kannte ich schon.
Dort verweist Du ja genau auf das beispielscript was mir gerade kopfzerbrechen bereitet.
zumindest wenn ich meine float-datentypen verwende (meine DB und die dortige Spalte hat den Wert float), aber so weit komme ich gar nicht
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 12:38
Beitrag #14
RE: sprintf invalid operands of types
(07.12.2014 12:09)sepp01 schrieb:  nein, ich will/brauch eigentlich keine Ganzzahl, ich benötige ja Temperaturwerte mit einer Nachkommastelle die dann in die DB geschrieben wird.
wenn ich den float-Datentyp in eine Integer umwandle so schneidet er mir ja die Nachkommastelle ab und das brauch ich nicht.
Dann multipliziere es halt vorher mit 10.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 12:42
Beitrag #15
RE: sprintf invalid operands of types
(07.12.2014 12:31)ardu_arne schrieb:  Hallo Sepp,

Aus 123,456°C wird dann 12345 oder 123456.
Zur richtigen Anzeige müssen die Werte dann halt durch 100 oder 1000 dividiert werden.

Hallo,
genau so in der Art scheint es C.Bell in seinem Beispielscript zu machen.

Ich glaube irgendwo gelesen zu haben das sprintf eben nicht mit float umgehen kann.
Vielleicht habe ich da aber auch was falsch verstanden

C.Bell verwendet ja in seinem Beispielscript explizit die lib von
https://github.com/nethoncho/Arduino-DHT22

um wahrscheinlich so im sprintf einfacher mit integer arbeiten zu können. Das vermute ich nur.

Für mich als Newbie ist das jedoch extrem da ich Standardlibs von anderen Sensoren verwenden möchte wie dem DS18b20 und die arbeiten alle mit float.

Grüße Sepp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2014, 13:27
Beitrag #16
RE: sprintf invalid operands of types
Hallo sepp,
versuche mal bitte
Code:
sprintf(buf, "INSERT INTO dht22_test.temp_humid VALUES (NULL, %hi.%01hi, %i.%01i, %f.%01f)",
myDHT22.getTemperatureCInt()/10,
abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10,
myDHT22.getHumidityInt()%10),
sensors.getTempCByIndex(0)/10,
sensors.getTempCByIndex(0)%10;
mit folgendem Code zu ersetzen (Beispiel):
Code:
// Wir nehmen mal an, dass der float Wert für die Temperatur fünf Zeichen hat 12.34
char temp_val[6];
// Der Wert wird gezogen, umgewandelt und in das char Array temp_val geschrieben
dtostrf(sensors.getTempCByIndex(0), 5, 2,temp_val);
// gesamter String in buf wird aufgebaut
// 1. gleichbleibender Text
// 2. temp_val
// 3. humidity (braucht nicht umgewandelt werden)
// 4. die schließende Klammer
char buf[128];
sprintf(buf,"INSERT INTO dht22_test.temp_humid VALUES (NULL,%s,%i)",temp_val,myDHT22.getHumidityInt());
}
So sollte in buf dann das komplette Insert-Statement mit den float von temp und dem integer von humidity stehen.
Hope it helps!
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Probleme mit sprintf() und dtostrf() GMBU 11 817 22.06.2016 10:52
Letzter Beitrag: GMBU
  invalid conversion from 'const char*' to 'char' toto1975 8 882 31.03.2016 12:49
Letzter Beitrag: hotsystems
  sprintf() plus scanf() : ständig Fehler, warum? HaWe 15 1.828 28.02.2015 15:31
Letzter Beitrag: HaWe
  Funktion ähnlich variabel definieren wie sprintf HaWe 21 1.800 24.02.2015 11:12
Letzter Beitrag: HaWe
  sprintf formatiert völlig falsch ! HaWe 15 1.591 13.12.2014 10:04
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste