Go Down

Topic: Fehlermeldung in Vers. 1.8.10 (Read 139 times) previous topic - next topic

Zuse99

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?

Serenifly

#1
Oct 20, 2019, 12:22 am Last Edit: Oct 20, 2019, 12:24 am by Serenifly
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

ElEspanol

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.

Zuse99

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
Code: [Select]
boolean* ok
ein Zeiger auf den Speicherplatz von der Variablen ok, richtig?
Wenn ich also die Programmzeile durch
Code: [Select]
boolean ok ersetze müsste doch alles wieder laufen, oder?

postmaster-ino

Hi

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*
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Serenifly

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:
Code: [Select]

*ok = false;

So ändern man das worauf der Zeiger zeigt. Und nicht den Zeiger selbst

2.) Man macht eine Referenz daraus:
Code: [Select]

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

Zuse99

Hallo,

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) {


combie

#7
Oct 20, 2019, 06:28 pm Last Edit: Oct 20, 2019, 06:29 pm by combie
Mach den Code wieder original und ersetze in der Funktion parseHex das
Code: [Select]
ok = false;
//durch
*ok = false;

Das ist nur eine Schnellreparatur!
Der ganze Code ist etwas "lala".

Quote
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.
Code: [Select]
hash = parseHex(s, 0, 4, &result);
response = s.charAt(5) != ' ';
command = parseHex(s, 7, 9, &result);
length = parseHex(s, 10, 11, &result);

So richtig toll finde ich das auch nicht .....
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Zuse99

Danke an alle, jetzt funktioniert es mit *ok=false und originaler Zeile.
Auch wenn offensichtlich der Code mit heißer Nadel gestrickt wurde.

Beste Grüsse

Go Up