Forum: Compiler & IDEs string operationen


von Markus Friedrich (Gast)


Lesenswert?

Hallo,
sitze seit längerer Zeit an einem eigentlich einfachen Vorhaben - nur
leider kriege ich es nicht hin. :-(
Vielleicht seht ihr ja den Fehler oder habt sogar den ultimativen
Gegenvorschlag.

Die Idee:

- vier globale Variablen für die vier Zeilen meines LCDs
unsigned char line1[15]; //0..15 = 16 chars
unsigned char line2[15];
unsigned char line3[11];
unsigned char line4[11]; //0..11 = 12 chars, erste vier werden von LCD
verschluckt (ist aber anderes Problem)

- einzelne Funktionen ändern die Variablen z.B.
if(init()==1) {
    strcpy(line4, "_ready_");
  } else {
    strcpy(line4, "_error_");
  };

- Endlosschleife der main Routine ruft dann ein updatedisplay() auf
damit sich nach jedem sequentiellen Durchlauf eine komplett geänderte
Anzeige ergibt
void updatedisplay(void)
{
  lcd_clrscr();
  lcd_gotoxy(0,0);
  lcd_print(line1);
...

- meine Printfunktion
void lcd_print(const char *string)
{
  char *chr;
  char buf[15];
  chr = string;

  while (*chr++) {
    strlcat(buf, *chr, 15);
  }
  lcd_puts(buf);
}

Entweder sehe ich gar nichts oder aber nur Datenmüll z.B.:
J_ea__ready_y oder ähnliches.

Bin für jede Idee ausgesprochen dankbar sonst raufe ich mir noch das
letzte Haar!

Gute Nacht,

Markus

von Joerg Wunsch (Gast)


Lesenswert?

unsigned char line1[15]; //0..15 = 16 chars

Erstens sind das, was Du hier deklariert hast, nur 15 Zeichen (wie's
auch
dasteht), also 0..14 als gültiger Indexbereich.
Zweitens wäre es sinnvoll, gleich ein Byte mehr zu spendieren für ein
abschließendes \0 byte, dann funktionieren alle normalen
Stringoperationen
auf dem Puffer, und man muß nicht explizit jedesmal noch die Anzahl
der
Zeichen mitzählen:

unsigned char line1[17]; /* 0..16 */

Dein lcd_print() ist völlig mysteriös.  Was soll der Unterschied zu
Deinem (offenbar vorhandenen) lcd_puts() sein?

von Markus Friedrich (Gast)


Lesenswert?

Danke für die Korrektur meiner arrays!

Die lcd_print Funktion war ein Versuch trotz des scheiterns der
lcd_puts Funktion aus der Peter Fleury lcdlibrary eine Ausgabe zu
erhalten.

die PF-lib hat die folgenden Funktionen:
void lcd_putc(char c);
void lcd_puts(const char *s);
void lcd_puts_p(const char *progmem_s);
#define P(s) ({static const char c[] _attribute_ ((progmem)) =
s;c;})
#define lcd_puts_P(__s)   lcd_puts_p(P(__s))

Ich will aber nicht nur hart codierte Ausgaben wie lcd_putc('x') oder
lcd_puts_P("XYZ"), sondern auch dynamisch erzeugte Strings ausgeben.

Wenn ich nun, wie schon oben angedeutet, versuche mit strcpy(line1,
"Hallo, Welt!") und lcd_puts(line1) eine Ausgabe zu erhalten,
passiert nichts.

Was mach ich falsch - ich glaub ich steh seit Gestern auf der
Leitung?!


Markus

von Peter Fleury (Gast)


Lesenswert?

@Markus

Die lcd_puts() funktioniert schon, Du musst sie nur nur wie
dokumentiert einsetzen.

lcd_puts() dient zur Ausgabe EINES strings.

Willst Du einen dynamischen String ausgeben, musst du ihn zuerst
zusammensetzen mit Standart C String funktionen:

char buffer[32];

strcpy( buffer, "Teil1-" );
strcat( buffer, "Teil2" );

lcd_puts( buffer );  -> zeigt "Teil1-Teil2" auf LCD


Bitte neueste Version von meiner lcd-lib herunterladen und Bespiel
test_lcd.c anschauen.
http://www.mysunrise.ch/users/pfleury/avr-software.html

von Markus Friedrich (Gast)


Lesenswert?

Vielen Dank! Werde ich gleich mal testen...

von Markus Friedrich (Gast)


Lesenswert?

geht leider immer noch nicht: LCD bleibt einfach leer. Warum weiß ich
nicht. Meine einzige Idee ist, dass ich zum einen eine ältere lcdlib
verwende (aber neusten avr-gcc [unter linux]) zum anderen sich
irgendetwas mit anderen eingebunden libs beißt.
Werde Morgen mal ein ganz neues Studio Projekt aufmachen, welches nur
die obigen vier Zeilen ausführt; mal schaun was dann passiert.

von Markus Friedrich (Gast)


Lesenswert?

Nach einer Tasse Kaffee funktioniert nun alles wie erwartet.

Es muß also an einer meiner eingebunden libs gelegen haben, ohne dass
gcc den Fehler beim compilieren gemerkt hat.

An was genau poste ich mal, wenn ich es beim Wiedereinbinden finde...

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.