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
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?
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.
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.
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.
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.
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
intBIT_Zeit(intLOW_Zeit)
2
{
3
switch(LOW_Zeit)
4
{
5
case851...950:return0;
6
case750...850:return1;
7
case0...350:BIT--;return0x0100;
8
default:returnLOW_Zeit;
9
}
10
}
P.S.:
Das Knausern mit Zeilen und Leerzeichen ist aber sowas von out. Niemand schreibt noch Programme auf 25x80 Terminals.
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.