Forum: Mikrocontroller und Digitale Elektronik Arduino: invalid conversion from 'const char*' to 'int' [-fpermissive]


von Ulrich K. (ukr)


Angehängte Dateien:

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!

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Sebastian W. schrieb:
> Sorry, .docx-Dateien in Foren öffne ich nicht.

Ich stimme zu!

von Dominik G. (domeg)


Lesenswert?

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?

von Ulrich K. (ukr)


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?

von Oliver S. (oliverso)


Lesenswert?

Hat er doch schon. Das Problem steht hinter dem return, nicht in dem 
Makro.

Oliver

von Georg M. (g_m)


Lesenswert?

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"

von Peter D. (peda)


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.

von Peter D. (peda)


Lesenswert?

Ulrich K. schrieb:
> Anzeige Info zu BIT:
> macro BIT
> ______________________________________
> #define BIT(nr) (1UL << (nr))

Nö:
1
int BIT = -1;

von Ulrich K. (ukr)


Lesenswert?

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
von Ulrich K. (ukr)


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.

von Rolf M. (rmagnus)


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.

von Helmut H. (helmuth)


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.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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…

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

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
von Peter D. (peda)


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.

: Bearbeitet durch User
von Neumann (mralfred)


Lesenswert?

Eine (void *) konversion voranstellen?

: Bearbeitet durch User
von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

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
Noch kein Account? Hier anmelden.