hallo miteinander Die Frage die mich heute beschäftigt ist sicher ganz einfach zu beantworten: Gibst eine Möglichkeit, wie ich Strings dynamisch verarbeiten kann um später an eine LCD auszugeben?? Das ganze sollte eigentlich eine Error-Anzeige werden, nur dachte ich mir anstelle für jede Fehlermöglichkeit eine if-Abfrage zu machen könnte ich die anderen Fehler dem schon vorhandenen String anhängen. Nur wie? Bei C++ gehts das über sprintf aber im gcc compiler habe ich im Include-File string.h nicht dergleichen gefunden. Die Anzeige sollte so aussehen: Error: Cutter blocked kommt jetzt aber noch ein neues Problem dazu sollte es so aussehen: Error Cutter blocked, depot empty sprich der ", dempot empty" Teil sollte an den "Cutter blocked" string hinzugefügt werden können ohne fixe Positionierung des String bei der Anzeige. Ich hoffe ihr versteht was ich meine, ansonsten nur fragen Danke im voraus für die Hilfe MFG Patrick
> Bei C++ gehts das über sprintf aber im gcc compiler habe ich im > Include-File string.h nicht dergleichen gefunden. sprintf ist in stdio.h deklariert und kann selbstverständlich auch aus C heraus genutzt werden.
Hallo Patrik, in C gibt es einige string Funktionen, die nützlich sind. Kauf dir doch mal ein Buch und lerne das. Oder lies dir wenigstens mal das AVR GCC tutorial durch, bevor du fragst. Bereits im Vorwort werden dort die avr libc Dokumentation und ein C Tutorial empfohlen, die dir sicherlich bereits weiter geholfen hätten. Gruß Marcus
ok, irgendwas mache ich falsch
1 | char lcd_info[20]; |
2 | if(TASTER & 0x01){ |
3 | sprintf(lcd_info,"test1, "); |
4 | }
|
5 | if(TASTER & 0x02){ |
6 | sprintf(lcd_info,"test2, "); |
7 | }
|
8 | lcd_write(lcd_info); |
dabei kommt immer nur "test2, " raus, aber nie "test1, test2, " wenn beide Schalter umgelegt sind könnt ihr mir helfen.
vielleicht den String leer initialisieren, und dann strcat verwenden? Ist auch viel schneller als sprintf. Und bei Gelegenheit mal ein C-Buch anschauen...
1 | char lcd_info[20]; |
2 | |
3 | lcd_info[0] = '\0'; |
4 | if(TASTER & 0x01){ |
5 | sprintf(lcd_info + strlen(lcd_info), "test1, "); |
6 | }
|
7 | if(TASTER & 0x02){ |
8 | sprintf(lcd_info + strlen(lcd_info), "test2, "); |
9 | }
|
10 | lcd_write(lcd_info); |
Für so was muss man doch nicht das Ressourcen-Monster sprintf bemühen. Genau dafür gibt es strcat.
1 | #include <string.h> |
2 | |
3 | char lcd_info[20]; |
4 | |
5 | lcd_info[0] = '\0'; |
6 | if (TASTER & 0x01) { |
7 | strcat(lcd_info, "test1, "); |
8 | }
|
9 | if (TASTER & 0x02) { |
10 | strcat(lcd_info, "test2, "); |
11 | }
|
Ein C / C++ Buch habe ich bereits... was mache ich falsch, denn der folgende Code erzeugt die Fehlermeldung:
1 | char lcd_info[20]; |
2 | strcat(lcd_info,"test, "); |
>> lcd.c:74: warning: implicit declaration of function 'strcat' >> lcd.c:74: warning: incompatible implicit declaration of built-in function >> 'strcat' habs nachgeschlagen und strcat fügt nur den 2. String am Ende des 1. Strings, also was ist falsch achja und nochmals danke.
Hallo! In deiner "lcd.c" fehlt am Anfang ein "include <string.h>". Dann sollte der Fehler weg sein. Gruß Denny
Patrick B. schrieb: >>> lcd.c:74: warning: implicit declaration of function 'strcat' >>> lcd.c:74: warning: incompatible implicit declaration of built-in function >> > 'strcat' > habs nachgeschlagen Nachschlagen ist was fuer Leute, die es schon koennen. Der Rest sollte das Buch ganz lesen. Wenn du hier nach "implicit declaration" suchst, wirst du zig Antworten finden.
> Ein C / C++ Buch habe ich bereits...
Das klingt nicht gut. "C / C++" gibt es nicht. C und C++ sind zwei
verschiedene Sprachen, und wenn man die gemeinsam abhandeln will, kommt
nur Murks raus.
Rolf Magnus schrieb: > Das klingt nicht gut. "C / C++" gibt es nicht. C und C++ sind zwei > verschiedene Sprachen, und wenn man die gemeinsam abhandeln will, kommt > nur Murks raus. LOL und ich dachte immer das C++ von C aus aufgebaut wurde und enthält auch den Syntax vom C. Peter Stegemann schrieb: > Nachschlagen ist was fuer Leute, die es schon koennen. Der Rest sollte > das Buch ganz lesen. hmm, ich weiss zwar nicht wie es mit deinem Gedächnis aussieht, aber bei mir kommts schon mal wieder vor, dass ich mich nicht mehr ganz an alles erinnere und dann soll ich ein Buch wieder von vorne lesen, bei dem ich wohl etwa 2 Monate intensiv beschäftigt wäre?? Das ist weder wirtschaftlich noch vernünftig. Für Leute, die den ganzen Tag lang seit Jahren immer nur C programmieren und das auch noch in allen Variationen sind sollche Ausserungen sicher schnell und leicht gemacht (soll jetzt nicht "ich pinkle dir ans Bein" mässig rüberkommen) aber bei mir ist das Programmieren als Hobby und als Zusatz zum Beruf, der aber nicht immer regelmässig zum Zug kommt. Aber für alle die sich etwas genervt haben nochmals ein Dankeschön MFG Patrick P51D
Patrick B. schrieb: > Rolf Magnus schrieb: >> Das klingt nicht gut. "C / C++" gibt es nicht. C und C++ sind zwei >> verschiedene Sprachen, und wenn man die gemeinsam abhandeln will, kommt >> nur Murks raus. > > LOL und ich dachte immer das C++ von C aus aufgebaut wurde und enthält > auch den Syntax vom C. Das war mal. In der Zwischenzeit haben sich C++ und C schon weit genug voneinander entfernt, dass der Begriff "C/C++" keinen wirklichen Sinn mehr macht. Aus den ursprünglich kleinen (aber feinen) Unterschieden sind spätestens nach den letzten Spracherweiterung große geworden. Die Art der typischen Programmierung unterschiedet sich fundamental. ... > hmm, ich weiss zwar nicht wie es mit deinem Gedächnis aussieht, aber bei > mir kommts schon mal wieder vor, dass ich mich nicht mehr ganz an alles > erinnere und dann soll ich ein Buch wieder von vorne lesen, bei dem ich > wohl etwa 2 Monate intensiv beschäftigt wäre?? Das ist weder > wirtschaftlich noch vernünftig. OK. Es kommt schon mal vor, dass man irgendwelche Details vergisst. Aber 'Stringverarbeitung'? Nicht böse sein, aber das ist C-Grundlagenwissen. Das wäre so als ob du behauptest, du könntest Autofahren, kannst dich aber nicht mehr daran erinnern ob du für eine Rechtskurve das Lenkrad nun nach rechts oder nach links drehen musst. Und von 'ganz erinnern' kann keine Rede sein. strcpy, strcat, strcmp, strlen sind mit DIE Arbeitspferde in der C-Programmierung. Kaum ein Programm, welches länger als 20 Zeilen ist, kommt ohne aus. In der µC Programmierung mag es zwar Ausnahmen geben, weil da auch schonmal größere Programme ohne irgendeine Form der textuellen Ausgabe gebaut werden, aber sobald eine UART oder ein LCD im Spiel ist, findet sich irgendeine dieser Funktionen praktisch immer. In deinem Buch gibt es bestimmt ein ganzes Kapitel über diese Funktionsfamilie. Und ganz gross steht da drüber: Stringbearbeitung Dass man nicht mehr alle Details kennt ist ok. Aber zumindest wissen, wo man in der Literatur nachschlagen muss, sollte man schon. Und sei es nur, dass man sich erinnert "da gabs doch spezielle Funktionen dafür"
> hmm, ich weiss zwar nicht wie es mit deinem Gedächnis aussieht, aber > bei mir kommts schon mal wieder vor, dass ich mich nicht mehr ganz an > alles erinnere und dann soll ich ein Buch wieder von vorne lesen, bei > dem ich wohl etwa 2 Monate intensiv beschäftigt wäre?? Das tolle an einem Buch ist, daß man kleine Abschnitte auch einzeln lesen kann und es nicht jedesmal, wenn man es aufschlägt, komplett von Anfang bis Ende durchlesen muß. Dieses Feature kann man nutzen, um speziell den Teil anzusehen, mit dem man gerade ein Problem hat. > aber bei mir ist das Programmieren als Hobby und als Zusatz zum Beruf, > der aber nicht immer regelmässig zum Zug kommt. Dann ist es besonders wichtig, mit einem Buch umgehen zu können, da man sich bei nur gelegentlicher Anwendung die Sachen natürlich nicht so gut merken kann.
Karl heinz Buchegger schrieb: > Die Art der typischen > Programmierung unterschiedet sich fundamental. ... Ich nehme jetzt mal an du sprichst von den Klassen/Objekten ansonsten müsste ich wirklich mal nachschlagen wie im C++ if-else, while, do-while, for, switch, continue, break, funktionen, Variablen... neu behandelt werden, respektive Deklariert/Initialisiert. Karl heinz Buchegger schrieb: > Kaum ein Programm, welches länger als 20 Zeilen ist, > kommt ohne aus. In der µC Programmierung mag es zwar Ausnahmen geben, Darf ich dich mal was fragen: Was programmierst du, PC oder MCU? Ich arbeite seite 3 Jahren mit MCU's und habe bis jetzt in etwa 5 Programmen LCD's und UART's gebraucht, alles andere war stand alone und höchstens mit exteren Zusatzspeichern oder Peripherie (RTC, DAC, ADC, FIFO, LIFO, FF...) versehen und in diesem Bereich brachte es nie irgendwelche String-Funktionen. Ich wage jetzt einmal zu behaupten das diesen "Ausnahmen" extrem vom Anwenungsbereich abhängig sind, den es kann die Ausnahme sein, dass mit Strings gearbeitet wird, aber auch umgekehrt. Karl heinz Buchegger schrieb: > Das wäre so als ob du behauptest, du könntest > Autofahren, kannst dich aber nicht mehr daran erinnern ob du für eine > Rechtskurve das Lenkrad nun nach rechts oder nach links drehen musst. Ich hoffe jetzt mal schwer, dass mir das nie passieren wird... ;) Rolf Magnus schrieb: > Das tolle an einem Buch ist, daß man kleine Abschnitte auch einzeln > lesen kann und es nicht jedesmal, wenn man es aufschlägt, komplett von > Anfang bis Ende durchlesen muß. Dieses Feature kann man nutzen, um > speziell den Teil anzusehen, mit dem man gerade ein Problem hat. Ein kompliment für den sehr ansprechenden Text. Nur das mit dem Buch lesen war nicht meine Idee sondern die von anderen Users. => Klaus Wachtler schrieb: > ... und das Buch auch zu lesen. MFG Patrick
>> Die Art der typischen >> Programmierung unterschiedet sich fundamental. ... > > Ich nehme jetzt mal an du sprichst von den Klassen/Objekten ansonsten Da ist noch sehr viele weitere Dinge. > müsste ich wirklich mal nachschlagen wie im C++ if-else, while, > do-while, for, switch, continue, break, funktionen, Variablen... neu > behandelt werden, respektive Deklariert/Initialisiert. Die sind in Java auch sehr ähnlich. Würdest du dann auch ein Buch "C/Java" kaufen bzw. von ihm erwarten, daß es dir beide Sprachen vernünftig beibringt? Es geht hier weniger um die grundlegenden Syntax-Elemente, sondern darum, wie man die Sprachen einsetzt. Und auch bei den selben Konstrukten haben die Sprachen teilweise unterschiedliches Verhalten. So kann man z.B. in C einen void* ohne Cast in einen Zeiger auf ein Objekt konvertieren, in C++ nicht. Deshalb wird in C empfohlen, bei malloc den Rückgabewert nicht zu Casten. In C++ müßte man das tun, wenn man denn malloc verwenden würde. Da nimmt man stattdessen aber den Operator new. >> Rolf Magnus schrieb: >> Das tolle an einem Buch ist, daß man kleine Abschnitte auch einzeln >> lesen kann und es nicht jedesmal, wenn man es aufschlägt, komplett von >> Anfang bis Ende durchlesen muß. Dieses Feature kann man nutzen, um >> speziell den Teil anzusehen, mit dem man gerade ein Problem hat. > >Ein kompliment für den sehr ansprechenden Text. Danke. Ich hab mich da auch echt mühe gegeben. ;-) > Nur das mit dem Buch lesen war nicht meine Idee sondern die von anderen > Users. Wie gesagt, man muß es ja nicht ganz lesen, wenn man das schon mal getan hat.
sorry, dass ich wieder störe, aber irgenwie hab ich den Kopf heute nicht so richtig frei: Falls alle Fehler auftreten sollten, sollte die Anzeige so aussehen: Fatal error: Not retreggered cutter, depot, hub1, hub2, endpoint, doch leider ist auf meinem Testboard die Anzeige komplet anders: dans einzige was am richtigen Ort ist, ist "Fatal error:" der Rest ist total unregelmässig, und auch nicht auf der Zeile wo es sein sollte: Fatal error: endpoint: iggered 6"<Qcutter, cutter, cut endpoint: ausserdem läuft das ganze irgendwie nicht so wie es sollte. selbst wenn nur ein Taster gedrückt wird, gibts gleich alle Fehler auf dem LCD. ich weiss nicht weiter... hier noch die Teile die das LCD steuern.
1 | static uint8_t update_lcd = 0; |
2 | static uint8_t old_value = 0; |
3 | char lcd_info_1[20]; |
4 | char lcd_info_2[20]; |
5 | if(TASTER != old_value){ |
6 | update_lcd = 1; |
7 | old_value = TASTER; |
8 | }
|
9 | if(update_lcd){ |
10 | update_lcd = 0; |
11 | lcd_clr(); |
12 | lcd_curs_set(lcd_z1+0); |
13 | lcd_write("Fatal error:"); |
14 | lcd_curs_set(lcd_z2+0); |
15 | lcd_write("Not retriggered"); |
16 | if(TASTER & 0x01){ |
17 | strcat(lcd_info_1,"cutter, "); |
18 | }
|
19 | if(TASTER & 0x02){ |
20 | strcat(lcd_info_1,"depot, "); |
21 | }
|
22 | if(TASTER & 0x04){ |
23 | strcat(lcd_info_1,"hub1, "); |
24 | }
|
25 | if(TASTER & 0x08){ |
26 | sprintf(lcd_info_2,"hub2, "); |
27 | }
|
28 | if(TASTER & 0x10){ |
29 | sprintf(lcd_info_2,"endpoint, "); |
30 | }
|
31 | lcd_curs_set(lcd_z3+0); |
32 | lcd_write(lcd_info_1); |
33 | lcd_curs_set(lcd_z4+0); |
34 | lcd_write(lcd_info_2); |
35 | }
|
Das LCD wird nur neu geschrieben, wenn eine Änderung an den Eingängen vorliegt. Danke für die Hilfe MFG P51D
Du initialisierst die beiden Stringarrays nicht. Das bedeutet, daß da irgendwas drinstehen kann, und strcat hängt an dieses irgendwas an. Das kann also auch bedeuten, daß hinter das Array geschrieben wird, also letztlich irgendwo in den Speicher, was sehr interessante Auswirkungen haben kann. Füge am Anfang Deiner Funktion folgende Zeilen ein: lcd_info_1[0] = '\0'; lcd_info_2[0] = '\0';
Patrick B. schrieb: > char lcd_info_1[20]; > char lcd_info_2[20]; reicht das nicht?? ich weiss das Strings mit "\0" abgeschlossen sind aber dass ich die Strings so initialisieren muss.
Außerdem ist lcd_info_1 auch zu klein für alle drei Strings. Und in lcd_info_2 wird niemals beides stehen, weil du da schon wieder mit sprintf arbeitest.
wie soll man dir helfen, wenn du - immer noch nur Fragmente deines Programms lieferst - die bisherigen Ratschläge in den Wind schlägst - den Kopf nicht frei hast ? Es bleibt dabei: - zweimal mit sprintf in den gleichen Puffer schreiben -> das zweite überschreibt das erste - Variablen dürfen auch initialisiert werden - du zeigst einen winzigen Ausschnitt und keiner weiß, wo all die Werte herkommen - du hast dein C-Buch herumliegen und noch nicht gelesen BTW: lcd_curs_set bekommt nur einen Parameter? Bitte - erst selber schlau machen - selber nachdenken - bisherige Ratschläge berücksichtigen - so konkret fragen, daß man das Problem auch nachvollziehen kann Was soll man mit ein paar Zeilen Quelltext, wenn die Werte irgendwo vom Himmel fallen?
Patrick B. schrieb: > reicht das nicht?? ich weiss das Strings mit "\0" abgeschlossen sind > aber dass ich die Strings so initialisieren muss. C-Buch auch lesen! (wie oft eigentlich noch?)
Ich schlage vor, etwa über C arrays, und über automatische Variablen zu lesen.
>> char lcd_info_1[20]; >> char lcd_info_2[20]; > > reicht das nicht?? Das ist die Definition. So wie das da steht, bekommst du zwei Arrays aus char, die jeweils mit Datenmüll gefüllt sind (bzw. das, was halt zu dem Zeitpunkt zufällig gerade dort im Speicher steht). > ich weiss das Strings mit "\0" abgeschlossen sind Das stimmt schon. Das da oben sind aber erstmal keine Strings. Es sind einfach nur Arrays aus char, aus denen du Strings machen kannst, indem du dafür sorgst, daß sie mit '\0' abgeschlossen sind. Die Funktionen wie strcat erwarten das, und sie fügen auch selbst wieder ein \0 ans Ende an, aber bevor du die Funktion das erste mal aufrufst, mußt du dafür sorgen, daß das \0 da ist. > aber dass ich die Strings so initialisieren muss. Eine Initialisierung ist da überhaupt nicht vorhanden. Daß du, wenn du nur Mikrocontroller programmierst, dich evtl. mit Stringhandling nicht auskennst, kann ich noch verstehen, aber wenn du nicht mal weißt, was eine Initialisierung ist, macht das auf mich den Eindruck, daß vom Buch nicht allzuviel hängengeblieben ist oder dieses vielleicht tatsächlich nicht gerade das beste ist. Und dann solltest du nochmal nachzählen, ob "cutter, depot, hub1, " plus das abschließende '\0' tatsächlich in 20 Zeichen passt.
er hat ja auch nur gesagt, daß er das Buch hat :-) (Hatte ich das schon erwähnt?)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.