Hallo,
ich erhalte beim Kompilieren eines Sketches der unter Vers. 1.6.13 tadellos kompiliert wurde folgende Meldung in Vers. 1.8.10:
....\Arduino\libraries\Railuino\Railuino.cpp: In function 'int parseHex(String&, int, int, boolean*)': ...\Arduino\libraries\Railuino\Railuino.cpp:56:15: error: cannot convert 'bool' to 'boolean* {aka bool*}' in assignment
ok = false;*
^~~~~*
wenn ich in Railunino.cpp mir die entsprechende Sequence anschaue:
int parseHex(String &s, int start, int end, boolean *ok) {
int value = 0;*
for (int i = start; i < end; i++) {*
char c = s.charAt(i);*
if (c >= '0' && c <= '9') {*
_ value = 16 * value + c - '0';_
} else if (c >= 'a' && c <= 'f') {*
_ value = 16 * value + 10 + c - 'a';_
} else if (c >= 'A' && c <= 'F') {*
_ value = 16 * value + 10 + c - 'A';_
} else {*
ok = false;*
return -1;*
}*
}*
return value;* }
sehe ich nicht unbedingt einen Fehler. Woran mag es liegen?
Die Fehlermeldung ist doch eindeutig. bool ist was anderes als bool*. Wenn das vorher mal kompiliert hat, heißt das nicht dass es korrekt war. Wenn du einem Zeiger false zuweist ist er 0
Schau dir an wie man Zeiger verwendet. Oder einfacher, verwende statt dessen eine Referenz wie auch bei dem String Objekt
Und verwende Code Tags im Forum, sonst wird der Code verstümmelt
Und da der Fehler in der Lib geworfen wird, wäre der Aufruf und die Definition der entsprechenden Variablen auch hilfreich. Damit hättest du vielleicht sogar den Fehler direkt gesehen.
Danke für die Antworten, jedoch bin ich kein begnadeter Programmierer sondern eher Anwender mit rudimentären Programmierkenntnissen.
Soweit ich mich jetzt eingelesen habe ist
boolean* ok
ein Zeiger auf den Speicherplatz von der Variablen ok, richtig?
Wenn ich also die Programmzeile durch boolean ok ersetze müsste doch alles wieder laufen, oder?
Damit erzeugst Du eine lokale Variable 'ok' vom Typ boolean, Die Nichts mit der äußeren Variable zu tun hat - die Lokale überdeckt die Globald.
Denke, Du wirst eher
boolean & ok;
brauchen - Das sollte eine Referenz auf die bereits bestehende boolean Variable 'ok' darstellen.
Wie Du nun aber wieder da drauf zugreifen kannst ... theoretisch 'ganz normal' mit ok=false;
MfG
PS: Dieser Post entstand jeder Menge Halb-Wissen und sollte deshalb nur mit Vorsicht in Schulbücher übernommen werden gg
Der Fehler scheint in der Library zu liegen. Sowas elementares sollte da eigentlich nicht falsch sein.
Der Zeiger hat da schon seinen Sinn. Man soll auf die Variable von außen zugreifen können um festzustellen was die Funktion gemacht hat. Wenn du das also als Wert übergibst kannst du dir den Parameter gleich sparen. Änderungen innerhalb der Funktion bekommst du außerhalb nicht mit.
Was auch nicht schön ist: ok wird in der Funktion nie auf true gesetzt. Statt dessen verlässt man sich darauf dass der Anwender richtig initialisiert.
Es gibt zwei Wege das auszubessern:
1.) Man dereferenziert den Zeiger korrekt, bevor man was zuweist:
*ok = false;
So ändern man das worauf der Zeiger zeigt. Und nicht den Zeiger selbst
2.) Man macht eine Referenz daraus:
int parseHex(String &s, int start, int end, bool& ok)
Dann muss man nichts dereferenzieren. Und bei der Übergabe muss man nicht explizit die Adresse mit & übergeben
ich habe es mit bool& ok probiert, aber der Kompiler meckert:
...\Arduino\libraries\Railuino\Railuino.cpp:43:5: note: initializing argument 4 of 'int parseHex(String&, int, int, bool&)'
int parseHex(String &s, int start, int end, bool& ok) {
^~~~~~~~
Ich habe mal den kompletten Code der librarie als Attachment.
Die Original Zeile 43 war : int parseHex(String &s, int start, int end, boolean *ok) {