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?
> 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";
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(;;); }
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
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);
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
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
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.
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.