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
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.
@ 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.
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").
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
charminute_str[3]={0};// deine Minute wird nie mehr als 2 Zeichen brauchen + Ende 0
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
charminute_str[3]={0};// deine Minute wird nie mehr als 2 Zeichen
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!
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
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.
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.
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.
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!
}
@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.
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;
Ä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.
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
@ 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!!!
@ 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
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.
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.
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.
@ 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.
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?
@ 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.
>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
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.
>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 )