Arduino: Problem beim casten

Gast #4616089
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
Angehängte Dateien:
#4616100
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.
Gast #4616117
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").
#4616126
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
Gast #4616149
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.
#4616171
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);
Gast #4616181
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);
Gast #4616187
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]
#4616194
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!
Gast #4616195
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
#4616201
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.
Gast #4616213
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.
#4616246
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;
Gast #4616253
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.
#4616257
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
#4616265
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!!!
Angehängte Dateien:
Gast #4616283
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
#4616285
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.
Gast #4616300
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.
#4616303
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.
#4616305
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.
#4616316
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?
#4616342
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.
Gast #4616350
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
#4616498
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.
Gast #4616627
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 )

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