Hallo Gemeinde, ich versuche, einen Code zur Anzeige der DCF77-Zeit (Code in beigefügter Datei) auf meinen ESP32 hochzuladen. Jedesmal kommt die Fehlermeldung: invalid conversion from 'const char*' to 'int' [-fpermissive]. Die komplette Fehlermeldung ist ebenfalls in der angehängten Datei enthalten. Was ich nicht verstehe, ist die Tatsache, dass zu Beginn die Variable BIT als int deklariert wird und dann in Zeile 70 die obige Meldung ausgelöst wird. Auch verstehe ich nicht, was die Info Anzeige Info zu BIT: macro BIT ______________________________________ #define BIT(nr) (1UL << (nr)) bedeutet Kann mir jemand helfen? Im Voraus vielen Dank!
Du deklarierst die Funktion wie folgt:
1 | int BIT_Zeit (int LOW_Zeit) |
(also Rückgabewert "int") Hast aber in der besagten Zeile ein
1 | return ""; |
drin, und das wird nun mal als "const char *" interpretiert. Was willst du in der besagten Zeile wirklich zurückgeben?
Dominik G. schrieb: > Du deklarierst die Funktion wie folgt:int BIT_Zeit (int LOW_Zeit) > (also Rückgabewert "int") > > Hast aber in der besagten Zeile einreturn ""; > drin, und das wird nun mal als "const char *" interpretiert. > > Was willst du in der besagten Zeile wirklich zurückgeben? Sorry, ich habe den Sketch so übernommen und mir sind die Zusammenhänge nicht klar. int BIT_Zeit (int LOW_Zeit) Wenn ich das richtig verstehe, ist BIT_Zeit eine int-Variable, richtig? Dann folgt weiter unten if (LOW_Zeit <= 350) {BIT-=1;return "";} Dazu habe ich keine Erklärung im Web gefunden. Wenn ich richtig verstehe, dann ist doch Bit ein Makro, durch das bestimmte Bits verändert werden, ist das richtig? Allerdings verstehe ich dann nicht den Zusammenhang mit der Variablen BIT_Zeit. Vielleicht kannst Du mir helfen?
Hat er doch schon. Das Problem steht hinter dem return, nicht in dem Makro. Oliver
Ulrich K. schrieb: > Dazu habe ich keine Erklärung im Web gefunden. Der Code ist fehlerhaft, funktioniert aber angeblich mit Arduino: Beitrag "Arduino und Atmega8"
Es ist schon erschreckend, was für ein Stuß da veröffentlicht wurde. Es wird ein Pointer auf einen lokalen String zurück gegeben, der danach also ungültig ist. Und ist keine Bedingung erfüllt, wird nichts zurück gegeben. Beides ist falsch. Schaut sich denn niemand den Code an, der veröffentlicht wird? Da sollte ja wenigstens eine Warnung groß drüberstehen. Wo wurde er überhaupt veröffentlicht, poste mal den Link auf die Quelle.
Ulrich K. schrieb: > Anzeige Info zu BIT: > macro BIT > ______________________________________ > #define BIT(nr) (1UL << (nr)) Nö:
1 | int BIT = -1; |
Peter D. schrieb: > Wo wurde er überhaupt veröffentlicht, poste mal den Link auf die Quelle. Unter folgendem Link wurde der Sketch veröffentlicht: https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/todo_florian_alles-hat-eine-genaue-zeit-dcf77-mit-dem-arduino
:
Bearbeitet durch User
Dominik G. schrieb: > Du deklarierst die Funktion wie folgt:int BIT_Zeit (int LOW_Zeit) > (also Rückgabewert "int") > > Hast aber in der besagten Zeile einreturn ""; > drin, und das wird nun mal als "const char *" interpretiert. > > Was willst du in der besagten Zeile wirklich zurückgeben? Merkwürdigerweise habe ich jetzt mal den Code für einen Arduino kompilieren lassen, da ist er ohne Probleme durchgelaufen. Weiterhin habe ich dann in die entsprechende Zeile return "2" eingegeben, auch das funktioniert nicht, wobei die darüber stehenden Zeilen nicht als Fehler markiert werden.
Peter D. schrieb: > Es ist schon erschreckend, was für ein Stuß da veröffentlicht wurde. > > Es wird ein Pointer auf einen lokalen String zurück gegeben, der danach > also ungültig ist. Nein, es wird die Adresse eines Stringliterals zurückgegeben. Stringliterals werden immer statisch gespeichert. Allerdings ist es wenig sinnvoll, den als int zurückzuliefern.
Ulrich K. schrieb: > Merkwürdigerweise habe ich jetzt mal den Code für einen Arduino > kompilieren lassen, da ist er ohne Probleme durchgelaufen. Also bei mir gibts mit ATMega328 zwei Warnungen die auf potentielle Probleme hinweisen: In function 'int BIT_Zeit(int)': a) warning: invalid conversion from 'const char*' to 'int' [-fpermissive] if (LOW_Zeit <= 350) {BIT-=1;return "";} b) warning: control reaches end of non-void function [-Wreturn-type] a) tritt auf wenn LOW_Zeit <= 350 b) tritt auf wenn LOW_Zeit > 950 Beide Male ist ziemlich undefiniert was genau passiert.
:
Bearbeitet durch User
Helmut H. schrieb: > Also bei mir gibts mit ATMega328 zwei Warnungen die auf potentielle > Probleme hinweisen: Das Problem bei Arduino ist, dass per Default alle Warnungen versteckt werden, weil das wohl als zu kompliziert für die Zielgruppe gesehen wird…
Rolf M. schrieb: > weil das wohl als zu kompliziert für die Zielgruppe gesehen > wird… Ich nenne das: Einen niederschwelligen Einstieg. Da ist dieser Punkt, nur einer von vielen.
:
Bearbeitet durch User
Rolf M. schrieb: > Nein, es wird die Adresse eines Stringliterals zurückgegeben. Stimmt, ich hab diese Funktion mal compiliert. Bei mir wird 0x0100 zurück gegeben (= SRAM Start). Laufen alle Vergleiche durch, bleibt R25:24 unverändert und es wird das erste Argument zurück gegeben. Funktionsidentisch ist dieser Code, nur ohne Warnungen:
1 | int BIT_Zeit (int LOW_Zeit) |
2 | {
|
3 | switch( LOW_Zeit ) |
4 | {
|
5 | case 851 ... 950: return 0; |
6 | case 750 ... 850: return 1; |
7 | case 0 ... 350: BIT--; return 0x0100; |
8 | default: return LOW_Zeit; |
9 | }
|
10 | }
|
P.S.: Das Knausern mit Zeilen und Leerzeichen ist aber sowas von out. Niemand schreibt noch Programme auf 25x80 Terminals.
:
Bearbeitet durch User
Eine (void *) konversion voranstellen?
:
Bearbeitet durch User
Arduino F. schrieb: > Rolf M. schrieb: >> weil das wohl als zu kompliziert für die Zielgruppe gesehen >> wird… > > Ich nenne das: Einen niederschwelligen Einstieg. Naja, da kann man verschiedener Meinung dazu sein. Wenn das Ding nicht tut, und man bekommt keinen Hinweis darauf, warum, obwohl es eigentlich dazu eine Warnung gib, dann finde ich das nicht so niederschwellig. Normalerweise sagt man jedem Anfänger erst mal, dass er alle Warnungen anmachen soll, und Arduino macht genau das Gegenteil davon.
:
Bearbeitet durch User
Rolf M. schrieb: > Wenn das Ding nicht > tut, und man bekommt keinen Hinweis darauf, warum, dann sucht man sich halt im Netz dem nächsten Sketch, und probiert damit weiter. Plug and Pray halt. Da stören Warnungen doch nur. Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.