mikrocontroller.net

Forum: Compiler & IDEs strcat Problem


Autor: Fiji (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich möchte eine Uhr auf dem LCD Display mitlaufen lassen, habe aber ein
kleines problem damit.
Die zeitvariablen habe ich in drei int werten abgelegt und erhöhe diese
entsprechend dem Clocktakt. soweit funktioniert es ja auch richtig. Und
auch die Normale ausgabe von text aufm LCD funktioniert auch.

nun wollte ich aber die Variablen "zusammenpacken" und als Zeit
formatiert ausgeben. Etwa so 00:00:00
Aber irgendwie funktionert der Code nicht.


char clock[27], c_std[2], c_min[2], c_sec[2];

itoa(i_std, c_std, 10);
itoa(i_min, c_min, 10);
itoa(i_sec, c_sec, 10);
if
(i_std==0||i_std==1||i_std==2||i_std==3||i_std==4||i_std==5||i_std==6||i 
_std==7||i_std==8||i_std==9)
  {
  strcat(clock, "0");
  strcat(clock, c_std);
  strcat(clock, ":");
  }
else
  {
  strcat(clock, c_std);
  strcat(clock, ":");

  }


if(i_min==0||i_min==1||i_min==2||i_min==3||i_min==4||i_min==5||i_min==6| 
|i_min==7||i_min==8||i_min==9)
  {
  strcat(clock, "0");
  strcat(clock, c_min);
  strcat(clock, ":");
  }
else
  {
  strcat(clock, c_min);
  strcat(clock, ":");
  }

if(i_sec==0||i_sec==1||i_sec==2||i_sec==3||i_sec==4||i_sec==5||i_sec==6| 
|i_sec==7||i_sec==8||i_sec==9)
  {
  strcat(clock, "0");
  strcat(clock, c_sec);
  }
else
  {
  strcat(clock, c_sec);
  }

lcd_out(clock);

Der Controller spinnt dann hier nur noch. Mir ist nicht klar warum
(überschreibe ich falsche addressbereiche?).
Gibt es ein Befehl um einen String ab einer bestimmten Stelle zu
überschreiben? z.B.
string=123456789
und die letzten drei stellen mit 0 überschreiben?

Autor: mastercpp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es ein Befehl um einen String ab einer bestimmten Stelle zu
> überschreiben? z.B.
> string=123456789

char* foo = "1234";
*(foo+2) = 'b'; // foo = "12b4";

Autor: mastercpp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups... Ich hab dich missverstanden. Was du suchst ist eher das:

void over(char* foo, char* bar, int start, int length)
{
  for(int i = 0; i<length; i++) *(foo+start+i) = *(bar+i);
}

int main(void)
{
  char* foo = "1234";
  char* bar = "cd";
  over(foo, bar, 2, 2);
  /*foo is now "12cd"*/
  for(;;);
}

Autor: Peter Mahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Fiji,


deine char Arrays sollten mindestens so lang sein, dass die
abschliessende binäre 0 noch reinpasst, also
   c_std[2], c_min[2], c_sec[2];
wird zu
   c_std[3], c_min[3], c_sec[3];
gleichzeitig würde die if-Bedingung etwas anders aufbauen,
z.B.:

if(i_std < 0) { // Bei signed werden
  strcpy(c_std,"EE");  // Fehler
} else if (i_std <= 9) {
  strcat(c_std,"0");
  strcat(c_std,i_std);
} else if(i_std <  24) {   // 24 bei stunden
  strcat(c_std,i_std);
} else {
  strcpy(c_std,"EE");  // Fehler
}

ganz einfach gehts  so :

clock[0] = '0' + (i_std / 10); //Integer Division
clock[1] = '0' + (i_std % 10); // Modulo
clock[2] = ':';
clock[3] = '0' + (i_min / 10); //Integer Division
clock[4] = '0' + (i_min % 10); // Modulo
clock[5] = ':';
clock[6] = '0' + (i_sec / 10); //Integer Division
clock[7] = '0' + (i_sec % 10); // Modulo
clock[8] = 0;  // Wichtig! Abschluss mit binärer 0

Gruss,

Peter

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Dein Controller groß genug ist (also nicht gerade ein '2313),
dann kannst Du Dir natürlich den ganzen Streß auch durch Verwendung
von sprintf() ersparen.

sprintf(clock, "%02d:%02d:%02d", i_std, i_min, i_sec);

Autor: Fiji (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die antowrten werde es gleich mal ausprobieren.

@Jörg
Habe einen Mega128. Ich schätze der ist groß genug?!
Ich versteh aber nicht wie das mit dem sprintf funktionieren soll. Den
ich schreibe das ganze ja auf ein LCD Display. Über einen terminal
Programm sollte das aber funktionieren, oder?


MfG

Autor: Fiji (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Danke  hat wunderbar geklappt.



MfG
Fiji

Autor: Peter Mahler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Der sprintf(...) macht eine Ausgabe in einen char-Array.

Was zwar auf den ersten Blick als einfach aussieht kostet leider
Unmengen(...in AVR-Dimensionen) an Flash, RAM, Stack, Laufzeit,...
Wenn du ein Map-File hast dann soltest du dir den Speicherbedarf mit
und ohne printf's betrachten, du wirst staunen was der Linker alles
für Funktionen dazupackt. Richtig schlimm wird das ganze, wenn dein
Stack knapp wird, dann hast du ein Problem das sich auf den ersten
Blick nicht als solches ausmachen lässt.
Daher sollte man meiner Ansicht nach auf die __printf-Funktionen auf
einem 8-Bitter verzichten.


Gruss,
Peter

Autor: Darko Sabljo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
habe gerade gestern so eine Funktion geschrieben, der man sec,min und h
übergibt und diese dann einen String zurückgibt.
das ganze sieht bei mir so aus

void charClock(char sec, char min, char hou, char *s) {

char cSec[3],cMin[3],cHou[3];
char Tges[20];

   if (sec != NULL)
      itoa(sec,cSec,10);

   itoa(min,cMin,10);
   itoa(hou,cHou,10);

   if (hou <10 ) {
     strcpy (Tges , "0");
     strcat (Tges , cHou);
   }
   else strcpy (Tges, cHou);

   strcat (Tges, ":");

   if (min <10 )
     strcat (Tges , "0");

   strcat (Tges, cMin);

   if (sec !=  NULL) {
     strcat (Tges, ":");
     if (sec <10 )
       strcat (Tges , "0");
     strcat (Tges, cSec);
   }
 strcpy (s,Tges);
}

Achso.. programmier erst seit einer Woche mit C, falls es da
Verbesserungsvorschläge gibt, wär ich dankbar. Man lernt schliesslich
gerne wie man seinen Code optimieren kann.

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.