Arduino: invalid conversion from 'const char*' to 'int' [-fpermissive]

OP #7360335
Lesenswert?

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!

Angehängte Dateien:
OP #7360506
Lesenswert?

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?

#7360792
Lesenswert?

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.

OP #7360948
Lesenswert?

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.

#7360962
Lesenswert?

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.

#7360974
Lesenswert?

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.

#7361045
Lesenswert?

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.

#7361177
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren