Forum: Mikrocontroller und Digitale Elektronik Arduino: Problem beim casten


von amateurbastler (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

eines vorweg: Ich bin kein Softwareprofi, deswegen bitte ich um etwas 
Nachsicht, falls meine Probleme Trivial sind.
Es geht um folgendes:
Ich habe mir eine LED-Matrix gebastelt, die auch wunderbar Funktioniert. 
Nun wollte ich die Textausgabe mit den Daten eines RTC-Moduls füttern. 
Die Daten aus dem RTC-Modul liegen als byte vor, meine Textausgabe 
erwartet ein char Array. Wenn ich nun versuche die "gecasteten" Daten 
auszugeben, wird einfach nichts ausgegeben.
Funktioniert:
1
const char text[] = {"hier gebe ich den anzuzeigenden text ein"};
Keine Ausgabe auf Matrix-"Display":
1
const char text[] = {(char)minute};
Fehlermeldung:
ISO C++ forbids casting to an array type 'char []'
1
const char text[] = {(char[])minute};
minute ist zu Testzwecken als
1
byte minute = 12;
 definiert.

Den kompletten Quellcode der Matrix habe ich als Anhang hinzugefügt. 
Wenn die font8x8 Lib auch benötigt wird, reiche ich die natürlich gerne 
nach.

Ich hoffe ihr könnt mir etwas auf die Sprünge helfen und hoffe, dass 
nicht zu viele Arduino-Hasser denken "oh mann, noch so einer...".

Liebe Grüße
ein Amateurbastler

von amateurbastler (Gast)


Angehängte Dateien:

Lesenswert?

Ach, um sicherzugehen schiebe ich die Library lieber gleich hinter her 
:-)
Nicht wundern, dass die Angehängte Library _basic heißt. Unter der 8x8 
Sind mehrere zusammengefasst, ich verwende allerdings nur Zeichen aus 
der basic Lib.

von Falk B. (falk)


Lesenswert?

@ amateurbastler (Gast)

>Quelltext.txt (2,12 KB, 1 Downloads)

Quelltexte hängt man DIREKT als .c Datei an, dann gibt es auch eine 
schöne Vorschau.

>Nun wollte ich die Textausgabe mit den Daten eines RTC-Moduls füttern.

Hmm.

>Die Daten aus dem RTC-Modul liegen als byte vor, meine Textausgabe
>erwartet ein char Array. Wenn ich nun versuche die "gecasteten" Daten
>auszugeben, wird einfach nichts ausgegeben.

Logisch. Casten bringt hier rein gar nichts. Du muss die Zahlen in einen 
String umwandeln.

itoa() ist dein Freund.

itoa(minute, text, 10);

>const char text[] = {"hier gebe ich den anzuzeigenden text ein"};

>Keine Ausgabe auf Matrix-"Display":

>const char text[] = {(char)minute};

>Fehlermeldung:
>ISO C++ forbids casting to an array type 'char []'

Logisch, das ist totaler Unsinn.

von R. B. (dxx255)


Lesenswert?

Wenn du ein Char Array in Form einer Zeichenkette brauchst schau dir 
itoa an!

von amateurbastler (Gast)


Lesenswert?

Vielen Dank für den Tipp! itoa kannte ich bisher nicht, schaue ich mir 
gleich mal an.

Das mit der Vorschau bei .c Anhängen wusste ich nicht, tut mir leid. 
Beim nächsten mal werde ich es besser machen!

Gibt es eine übersicht, welche Typen ich in Typ xyz umwandeln kann/darf?
Ich habe leider keine gefunden. (Das ist vielleicht eine der trivialen 
Fragen von denen ich sprach, vielleicht erübrigt sich diese Frage für 
jeden begabten Programmierer, da er genau weiß, was die Bits im 
Hintergrund machen und "zulassen").

von amateurbastler (Gast)


Lesenswert?

"The function itoa() converts the integer value...."

Funktioniert diese Umwandlung dennoch von byte zu char[]?

von Joachim B. (jar)


Lesenswert?

amateurbastler schrieb:
> Gibt es eine übersicht, welche Typen ich in Typ xyz umwandeln kann/darf?

sprintf wäre auch möglich, ich nutze meist itoa oder utoa oder die long 
Versionen

https://www.proggen.org/doku.php?id=c:lib:stdio:sprintf

da das Standard C ist wissen die meisten was mit printf und sprintf geht

http://www.kriwanek.de/arduino/sprachreferenz/173-sprintf-ausgabeformatierung.html

von amateurbastler (Gast)


Lesenswert?

Hmm, irgendwie komme ich damit nicht weiter.
1
const char text[] = {itoa(minute,mintext,10)};
gibt mir: invalid conversion from 'char' to 'char*' [-fpermissive]

mintext habe ich als char deklariert.

von Joachim B. (jar)


Lesenswert?

amateurbastler schrieb:
> Hmm, irgendwie komme ich damit nicht weiter.const char text[] =
> {itoa(minute,mintext,10)};gibt mir: invalid conversion from 'char' to
> 'char*' [-fpermissive]
>
> mintext habe ich als char deklariert.

ich bin selber nur Hobbyprogger und würde das so machen:
1
char minute_str[3]={0}; // deine Minute wird nie mehr als 2 Zeichen brauchen + Ende 0
2
3
// nun wenn es soweit ist:
4
5
strcpy(minute_str, itoa(minute,minute_str,10));
6
7
//oder
8
9
sprintf(minute_str,"%02d", minute);

von Peter II (Gast)


Lesenswert?

Joachim B. schrieb:
> ich bin selber nur Hobbyprogger und würde das so machen:
> char minute_str[3]={0}; // deine Minute wird nie mehr als 2 Zeichen
> brauchen + Ende 0
>
> // nun wenn es soweit ist:
>
> strcpy(minute_str, itoa(minute,minute_str,10));

warum noch mal kopieren?
1
char minute_str[3]={0}; // deine Minute wird nie mehr als 2 Zeichen 
2
itoa(minute,minute_str,10);

von amateurbastler (Gast)


Lesenswert?

Aber wie würdet ihr das in die Textausgabe
1
const char text[] = {"Hier schreibe ich text rein"};

einbinden?

1
const char text[] = {itoa(minute,minute_str,10)};

ergibt nur:
invalid conversion from 'char*' to 'char' [-fpermissive]

von Joachim B. (jar)


Lesenswert?

Peter II schrieb:
> warum noch mal kopieren?

gute Frage, weil ich strcpy, gerne nehme, weil das einfach logischer 
scheint und bei c&p leichter (verständlicher) aussieht?

amateurbastler schrieb:
> Aber wie würdet ihr das in die Textausgabeconst char text[] = {"Hier
> schreibe ich text rein

du hast die Antwort und bei der Deklarierung und Initialisierung gehört 
das nun mal nicht rein,

erkenne den Unterschied zwischen Deklarierung und Initialisierung!

von amateurbastler (Gast)


Lesenswert?

Wenn ich
itoa(minute,minute_str,10) "alleine" aufrufen möchte um dann nur 
minute_str
an meine Textausgabe übergebe
(will heißen: const char text[] = {minute_str[3]};   )

dann erhalte ich die Fehlermeldung:
expected constructor, destructor, or type conversion before '(' token

von Joachim B. (jar)


Lesenswert?

amateurbastler schrieb:
> const char text[] = {"Hier schreibe ich text rein"};

das ist die Deklarierung und Initialisierung für Konstanten!

Deine Minuten werden sich aber ändern sind aber keine Konstanten, ergo 
reservierst du nur Puffer für die Zeichen und kopierst zur Laufzeit.

itoa ist eine Funktion und die kann der Preprozessor nun mal nicht 
ausführen, das kann er nur wenn vor der Kompilierung das Ergebnis "hier 
ist ein Text" bekannt ist.

amateurbastler schrieb:
> (will heißen: const char text[] = {minute_str[3]};   )

das geht nur mit Funktionen a la strcpy das = stammt von Basic und funzt 
nicht auf Strings.

: Bearbeitet durch User
von amateurbastler (Gast)


Lesenswert?

Uff....

jetzt erkenne ich das Problem. Habe vorher garnicht darüber nachgedacht, 
dass die neuen Werte für die Minuten "außerhalb" der void loop() sind 
:-/

hmm, auf meinen speziallen Fall angewandt: Wie würdet ihr das lösen?

Vielen vielen Dank nochmal! Ich weiß es wirklich sehr zu schätzen, dass 
du deine persönliche Freizeit für mich opferst.

von amateurbastler (Gast)


Lesenswert?

Selbst wenn ich
1
  const char text[] = {itoa(minute,minute_str,10)};

in der loop() Funktion habe, erhalte ich:
invalid conversion from 'char*' to 'char' [-fpermissive]

von Rudolph R. (rudolph)


Lesenswert?

Kommt aus einer RTC nicht "normalerweise" BCD raus?
Dann wäre itoa() oder sprintf() jetzt nicht so ganz passend.
Eher die nibble trennen und 0x30 dazu.

von Joachim B. (jar)


Lesenswert?

amateurbastler schrieb:
> const char text[] = {itoa(minute,minute_str,10)};

das ist eine Deklarierung und die gehört nicht in die loop!!!!!!!!


wie oft den noch?

const char text[3]={0}; // Leerstring für 2 Zeichendeklarierung!

void loop(void)
{

//hier wird dem Leerstring text[3] ein sinnvoller Inhalt verpasst
itoa(minute,text,10);
// er wird mit Minute gefüllt!

}

von amateurbastler (Gast)


Lesenswert?

Das tut es "unausgewertet" tatsächlich, allerdings Wandle ich das um und 
habe "am Ende" je ein byte für Sekunde, Minute, ....

von Joachim B. (jar)


Lesenswert?

@amateurbastler

bist du auch amateurwortschöpfer?

ich verstehe deinen Text nicht:

amateurbastler schrieb:
> Das tut es "unausgewertet" tatsächlich, allerdings Wandle ich das um und
> habe "am Ende" je ein byte für Sekunde, Minute, ....

ich nutze ja die RTC auch, ich habe am Anfang Bytes für Stunde Minute 
Sekunde

und erst am Ende Text.

von amateurbastler (Gast)


Lesenswert?

@ jar:

leider erhalte ich auch in deiner vorgeschlagenen Version den Fehler:
invalid conversion from 'const char*' to 'char*' [-fpermissive]

von Rudolph R. (rudolph)


Lesenswert?

amateurbastler schrieb:
> Das tut es "unausgewertet" tatsächlich,

Na denn, nimm doch die Rohwerte und mache da kurz von Hand zwei Zeichen 
draus, das ist etwas effizienter als itoa() oder gar sprintf().

Da ein LCD sowieso eher was statisches ist kann man die Zeichen auch 
direkt an die passende Stelle im String schreiben.

lcd_zeile2[6] = (minute_rtc >> 4) + '0';
lcd_zeile2[7] = (minute_rtc & 0x0f) + 0x30;

von amateurbastler (Gast)


Lesenswert?

Ähm, ich benutze kein LCD sondern eine 8x8 LED Matrix, die ich mir 
gebastelt habe. Ich steuer sie über 16 Leitungen an und möchte daher an 
meinem bestehenden Programm nicht so viel ändern (wenn es irgendwie 
geht). Es war schon nicht sehr einfach überhaupt Text dadrauf zum laufen 
zu bringen. Ich hatte jetzt nur die Hoffnung diesen statischen Text 
regelmäßig mit neuen Daten zu füttern.

von Joachim B. (jar)


Lesenswert?

amateurbastler schrieb:
> @ jar:
>
> leider erhalte ich auch in deiner vorgeschlagenen Version den Fehler:
> invalid conversion from 'const char*' to 'char*' [-fpermissive]

weil du immer wieder ein const reinsetzt, wo habe ich das je 
geschrieben?

const steht für Konstante und das ist deine Minute ja nicht, denn du 
willst sie zur Laufzeit ändern! da muss der Compiler ja meckern, merkst 
du das nicht?

nun habe ich den const Fehler glatt von dir übernommen

nimm const raus und es passt

: Bearbeitet durch User
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ amateurbastler (Gast)

>leider erhalte ich auch in deiner vorgeschlagenen Version den Fehler:
>invalid conversion from 'const char*' to 'char*' [-fpermissive]

Bist du wirklich so blöd oder tust du nur so?

Mensch Meier, das gibt's in keinem Russenfilm!

itoa() ist ein NORMALE Funktion, die im NORMALEN Programmablauf
aufgerufen wird! Sie ist KEIN Macro oder sonstige Präprozessorfunktion,
die man in einer Deklaration benutzen kann!!

const char text[] = {itoa(minute,minute_str,10)};


Das ist TOTALER UNSINN!!!

Siehe Anhang.

Auch als Hobbyprogammierer braucht man elementare Kenntnisse seiner
Programmierpsrache!!!

von amateurbastler (Gast)


Lesenswert?

auch ohne const erhalte ich:
invalid conversion from 'char*' to 'char' [-fpermissive]
trotz genau von dir übernommenen Code (ohne const)

von amateurbastler (Gast)


Lesenswert?

@ Falk: vielen Dank für deine Lösung und die ausschweifenden 
Beleidigungen.
Die von dir geforderten elementaren Kenntnisse versuche ich mir ja schon 
beizubringen. Und wie soll ich das anders machen als try&error&learn 
from it?
Ich muss zugeben, ich habe hier Zeitweise den Wald vor lauter Bäumen 
nicht mehr gesehen - mea culpa! Aber trotzdem danke für die Mühe!


Und die recht doch sehr amüsanten Beleidigungen von einem (erwachsenen?) 
Menschen :D

von Carl D. (jcw2)


Lesenswert?

1
char *  itoa ( int value, char * str, int base );

value   die zu konvertierende Zahl
str     Zeiger auf einen ausreichend großen Puffer aus char,
        nicht const char, weil man was konstantes nicht beschreiben darf

base.    das Zahlensystem (10,2,8,16)

Der Rückgabewert ist der übergebene Zeiger str

Dieser kann nicht zum initialisieren eines char[] benutzt werden, denn 
dazu braucht man (Überraschung) ein const char array, also 'a','b','c' 
oder "ABC"

Wahrscheinlich bekomm ich gleich eins übergebraten, aber ein wirklich 
guter Tip, wenn es nicht darum geht, die Hausarbeit fertig zu bekommen:

Les was über C. Online oder Papier, egal nur tu's.

: Bearbeitet durch User
von amateurbastler (Gast)


Lesenswert?

Tatsächlich ist dies keine Hausarbeit o.ä.
Ich bastel sehr gerne (so entstand die Matrix, ohne IC's, etc.(Abgesehen 
vom Ardu als Ansteuerung)) und hatte mir nun gedacht: "Hey, mach doch 
eine Uhr draus!"
So kam es zu dem Debakel hier. Als Lektüre habe ich "Jetzt lerne ich 
C++" vom Markt+Technik Verlag....Ich werde mich nun mal mehr im Internet 
nach guten Tutorials umschauen. Mein Problem ist oft einfach, dass ich 
bestimmte Dinge nicht verstehe, aber im Eigenstudium nicht die 
Möglichkeit habe, jemanden um Rat zu Fragen.

Von Foren nehme ich größtenteils Abstand (wenn es irgendwie geht), da 
gerade Anfänger mit leuten wie Falk Brunner zu kämpfen haben (er ist 
hier ja bekannt für seine ausfallende Art all denen gegenüber, die nicht 
seiner Meinung sind oder schlicht weniger wissen als er). Und es ist 
garnicht mal so angenehm, die eigene Dummheit (der ich mich sehr wohl 
bewusst bin) so beleidigend unter die Nase gerieben zu bekommen...

Wie dem auch sei: Vielen Dank Carl Drexler, für deine Ausführliche und 
pädagogisch sinnvolle Antwort.
Weil ich darauf hoffe auf Leute wie dich zu treffen, schreibe ich das 
ein oder andere mal doch in Foren wie diesem hier.

von Dirk B. (dirkb2)


Lesenswert?

amateurbastler schrieb:
> Und wie soll ich das anders machen als try&error&learn
> from it?

Mit einem Buch. Aus Papier. Zum lesen. Da stehen die Grundlagen drin.



Joachim B. schrieb:
> amateurbastler schrieb:
>> const char text[] = {itoa(minute,minute_str,10)};
>
> das ist eine Deklarierung ...

Das wäre, wenn es richtig gemacht ist, eine Definition (da Speicher 
verbraucht wird).
Eine Deklaration ist nur eine BEkanntgabe, das ein Objekt existiert. 
damit wird es aber nicht angelegt.

von Falk B. (falk)


Lesenswert?

@ amateurbastler (Gast)

>Die von dir geforderten elementaren Kenntnisse versuche ich mir ja schon
>beizubringen. Und wie soll ich das anders machen als try&error&learn
>from it?

Früher (tm) hat man Sachbücher gelesen, die das Schritt für Schritt 
erklärt haben.

von Dirk B. (dirkb2)


Lesenswert?

amateurbastler schrieb:

> Als Lektüre habe ich "Jetzt lerne ich
> C++" vom Markt+Technik Verlag....
Was denn jetzt? C oder C++. Das sind zwei verschiedene Sprachen, die 
auch unterschiedlich programmiert werden.

> Ich werde mich nun mal mehr im Internet
> nach guten Tutorials umschauen.
Gibt es leider nicht.

> Von Foren nehme ich größtenteils Abstand (wenn es irgendwie geht), da
> gerade Anfänger mit leuten wie Falk Brunner zu kämpfen haben (er ist
> hier ja bekannt für seine ausfallende Art all denen gegenüber, die nicht
> seiner Meinung sind oder schlicht weniger wissen als er). Und es ist
> garnicht mal so angenehm, die eigene Dummheit (der ich mich sehr wohl
> bewusst bin) so beleidigend unter die Nase gerieben zu bekommen...

Da musst du dir ein dickes Fell zulegen.


Kannst du schon andere Programmiersprachen?

von Falk B. (falk)


Lesenswert?

@ Dirk B. (dirkb2)

>> Als Lektüre habe ich "Jetzt lerne ich
>> C++" vom Markt+Technik Verlag....

>Was denn jetzt? C oder C++. Das sind zwei verschiedene Sprachen, die
>auch unterschiedlich programmiert werden.

Eben. Vor allem weil C++ ein GANZ anderes Kaliber ist!

>Da musst du dir ein dickes Fell zulegen.

Ein Buch über C würde schon erstmal reichen.

von Niklas (Gast)


Lesenswert?

>Und die recht doch sehr amüsanten Beleidigungen von einem (erwachsenen?)
>Menschen :D

Mach dir nichts draus, das ist die Währung im MC-Netz: Fragen im 
Austausch gegen Beleidigungen.

Das läuft dann etwas so:
1. Frage => Gegenfrage
2. Frage => leichte Beleidigung
3. Frage => Präsentation der Lösung und zum Vergnügen noch eine schwere 
Beleidigung dazu

von Carl D. (jcw2)


Lesenswert?

Aber es ist doch nicht einfach. Da kommen Leute, die haben keine Ahnung 
Grundlegendem der Elektrotechnik, und wenn man sie drauf hinweist sind 
sie Master ET. Oder sie haben wie einst TdB ein ganz tolles LED-Netzteil 
gekauft um hinter eine gekaufte Alufrontplatte Design "selbstgemacht" 
gepackt, fragen wie der PWM-Anschluß sein soll, haben teuere Oszis auf 
Tisch stehen, aber keinen Dunst was die anzeigen., und wenn man ihnen 
dann erklärt und es nach der Ferndiagnose funktioniert, dann wird man 
zum Dank angepöbelt.
Da kann man mit der Zeit schon schwierig werden.

Und es gibt andere, wie in diesem Fall, die können noch wenig, wollen 
aber was lernen. Solchen, so man sie schnell genug erkennt, muß man 
helfen, die werden mal die Sachen entwickeln, die unsere Rente 
finanzieren. Und schlimm ist es nicht, wenn man jüngere Menschen findet, 
mit denen man sich über unsere Hobbythemen unterhalten kann. Ich hab 2 
Töchter, eine davon hat gerade Abi gemacht, kann 51er Assembler, C, 
Java, JavaScript und wird bald bei einem Dax-Konzern eine weitere 
Sprache dir mit A beginnt lernen. Solche Leute brauchen wir. Nicht Mur 
SmartPhoneJunkies.

von Joachim B. (jar)


Lesenswert?

Carl D. schrieb:
> Nicht Mur
> SmartPhoneJunkies.

du mein Smombies

https://de.wikipedia.org/wiki/Smombie

von Carl D. (jcw2)


Lesenswert?

Joachim B. schrieb:
> Carl D. schrieb:
>> Nicht Mur
>> SmartPhoneJunkies.
>
> du mein Smombies
>
> https://de.wikipedia.org/wiki/Smombie

Ich hab mich doch bisher immer erfolgreich gegen eins gewehrt ;-)

von Niklas (Gast)


Lesenswert?

>Ich hab 2
>Töchter, eine davon hat gerade Abi gemacht, kann 51er Assembler, C,
>Java, JavaScript und wird bald bei einem Dax-Konzern eine weitere
>Sprache dir mit A beginnt lernen.

A ? ADA .. welcher DAX Konzern ist in der Rüstung tätig?

Apropos DAX-Konzern: Falls man Entwickler bleiben will, sollte man nicht 
bei einem DAX-Konzern arbeiten. Vor Jahren meine Frage auf einer 
Recruitingmesse an den Vertreter der DAX-Elektro-Firma mit dem "S", ob 
es auch Fachkarieren gibt: "Nein, die sind bei uns nicht vorgesehen".
Im Konzerh hat man als Entwickler zwar ein tiefes Fachwissen, ist aber 
DVD.
( Depp Vom Dienst )

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.