www.mikrocontroller.net

Forum: Compiler & IDEs String dynamisch zusammensetzen


Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Marcus Overhagen (marcus6100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, irgendwas mache ich falsch
char lcd_info[20];
if(TASTER & 0x01){
  sprintf(lcd_info,"test1, ");
}
if(TASTER & 0x02){
  sprintf(lcd_info,"test2, ");
}
lcd_write(lcd_info);

dabei kommt immer nur "test2, " raus, aber nie "test1, test2, " wenn 
beide Schalter umgelegt sind
könnt ihr mir helfen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht den String leer initialisieren, und dann strcat verwenden?
Ist auch viel schneller als sprintf.
Und bei Gelegenheit mal ein C-Buch anschauen...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char lcd_info[20];

lcd_info[0] = '\0';
if(TASTER & 0x01){
  sprintf(lcd_info + strlen(lcd_info), "test1, ");
}
if(TASTER & 0x02){
  sprintf(lcd_info + strlen(lcd_info), "test2, ");
}
lcd_write(lcd_info);

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für so was muss man doch nicht das Ressourcen-Monster sprintf bemühen. 
Genau dafür gibt es strcat.
#include <string.h>

char lcd_info[20];

lcd_info[0] = '\0';
if (TASTER & 0x01) {
  strcat(lcd_info, "test1, ");
}
if (TASTER & 0x02) {
  strcat(lcd_info, "test2, ");
}


Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein C / C++ Buch habe ich bereits...

was mache ich falsch, denn der folgende Code erzeugt die Fehlermeldung:
char lcd_info[20];
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> was mache ich falsch,

string.h nicht eingebunden.

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

In deiner "lcd.c" fehlt am Anfang ein "include <string.h>".
Dann sollte der Fehler weg sein.

Gruß Denny

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und du hast  vergessen den String zu initialisieren

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und das Buch auch zu lesen.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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.

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
static uint8_t update_lcd = 0;
static uint8_t old_value = 0;
char lcd_info_1[20];
char lcd_info_2[20];
if(TASTER != old_value){
  update_lcd = 1;
  old_value = TASTER;
}
if(update_lcd){
  update_lcd = 0;
  lcd_clr();
  lcd_curs_set(lcd_z1+0);
  lcd_write("Fatal error:");
  lcd_curs_set(lcd_z2+0);
  lcd_write("Not retriggered");
  if(TASTER & 0x01){
    strcat(lcd_info_1,"cutter, ");
  }
  if(TASTER & 0x02){
    strcat(lcd_info_1,"depot, ");
  }
  if(TASTER & 0x04){
    strcat(lcd_info_1,"hub1, ");
  }
  if(TASTER & 0x08){
    sprintf(lcd_info_2,"hub2, ");
  }
  if(TASTER & 0x10){
    sprintf(lcd_info_2,"endpoint, ");
  }
  lcd_curs_set(lcd_z3+0);
  lcd_write(lcd_info_1);
  lcd_curs_set(lcd_z4+0);
  lcd_write(lcd_info_2);
}
Das LCD wird nur neu geschrieben, wenn eine Änderung an den Eingängen 
vorliegt.

Danke für die Hilfe
MFG
P51D

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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';

Autor: Patrick B. (p51d)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?)

Autor: Marcus Overhagen (marcus6100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schlage vor, etwa über C arrays, und über automatische Variablen zu 
lesen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er hat ja auch nur gesagt, daß er das Buch hat :-)
(Hatte ich das schon erwähnt?)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.