Hi Leute, hab folgendes Problem. Der Nachfolgende Code berechnet die Sekunden, die vom Jahresanfang bis jetzt vergangen sind. Das heißt es kommt eine ziemlich große Zahl heraus. Das %i falsch ist weis ich schon denn da bekomme ich einen Überlauf. Was muss ich verwenden um die Ausgabe richtig zu bekommen? long berechnungSek(DATETIME_T dt){ long sekVal = 0; for(int i = 1; i <= dt.mon; i++){ if(i == dt.mon){ sekVal += ((dt.day - 1L) 24L 60L * 60L) + (dt.hour * 60L *60L) + (dt.min * 60L) + dt.sec; }else{ sekVal += tageMonat[i] 24L 60L * 60L; } } usart_write("sekVal %i\r\n", sekVal); return sekVal; } Danke schonmal im Vorraus. Grüße Manuel Simmerl
Siehe z.B. http://www.wachtler.de/ck/B_3_Formatstring_fur_printf.html Stichworte "printf formatstring" >da bekomme ich einen Überlauf. Wieso Überlauf? Was für ein Überlauf? Du bekommst einfach nur eine zu kleine Zahl angezeigt.
Hab jetzt die Funktion abgeändert: long berechnungSek(DATETIME_T dt){ unsigned int sekVal = 0; for(int i = 1; i <= dt.mon; i++){ if(i == dt.mon){ sekVal += ((dt.day - 1L) 24 60 * 60) + (dt.hour * 60 *60) + (dt.min * 60) + dt.sec; }else{ sekVal += tageMonat[i] 24 60 * 60; usart_write("sekVal %u\r\n", sekVal); } } //usart_write("sekVal %u\r\n", sekVal); return sekVal; } Hab aus long, unsigned int gemacht. Nur leider bekomm ich jetzt keine Ausgabe mehr...
Manuel Simmerl schrieb: > Das %i falsch ist weis ich schon denn da bekomme ich einen Überlauf. > Was muss ich verwenden um die Ausgabe richtig zu bekommen? %ld oder %li etc. Ciao, Yagan
funktioniert leider beides nicht. Bei %li bekomm ich die Ausgabe: sekVal i und bei %ld die Ausgbe: sekVal d
Manuel Simmerl schrieb: > Hab aus long, unsigned int gemacht. Nur leider bekomm ich jetzt keine > Ausgabe mehr... Wie gross ist denn 'unsigned int' bei deinem Compiler? 16 oder 32 Bits? Die Sekunden pro Tag passen nicht mehr in eine 16-Bit-Zahl. Also besser 'long' oder 'unsigned long' benutzen. Im Formatstring dann mit %ld bzw. %lu codieren. Ciao, Yagan
Manuel Simmerl schrieb: > und bei %ld die Ausgbe: > sekVal d Seltsam! Was benutzt du denn für einen Compiler?
CodeVision? Dem musste unter Project->Configure-> C Compiler->(s)printf features sagen, dass du long-Variablen ausgeben willst.
Du schreibst leider nicht welchen Compiler Du benutzt. Da Du im uC Forum postest wäre es möglich, dass Du z.B. AVRStudio verwendest mit WinGCC. Bei diesem muss der Support für long Variablen zusätzlich in den Projekteinstellungen aktiviert werden. Hier hat das den Grund, das die Aktivierung den Code so deutlich vergrössert, das man eher auf longs verzichtet. Aber ich habe ohnehin vorausgesetzt (was ich einfach nicht tun darf, nein, nein, nein, Du dummer Guru Du ) das Du die Doku zu der Entwicklungsumgebung und dem Compiler gelesen hast. Da sollte sowas drinstehen.
H:\WinAVR-20090313\bin\avr-gcc.exe Ich nehme mal an das es sich um den gcc kompiler handelt.
>den normalen Kompiler der beim AVR Studio 4.0 Tja. Schade, das beim AVR Studio, von vorneherein überhaupt kein Compiler dabei ist. Deine Antwort geht also von falschen Voraussetzungen aus, so das wir damit nichts anfangen können.
Es ist der GCC installiert. Leider finde ich aber in den Projekteinstellung das beschriebene nicht...
Manuel Simmerl schrieb: > Ich benutze den normalen Kompiler der beim AVR Studio 4.0 dabei ist. Damit kenne ich mich leider nicht aus. Ich vermute mal, die Funktion > usart_write("sekVal %i\r\n", sekVal); versteht keine Standard-Formatstrings wie printf. Vielleicht kannst du sprintf benutzen und den Ergebnis-String dann über die UART schicken, z.B. so: #include "stdio.h" #include "string.h" char ausgabepuffer[100]; long sekVal = 86400L; // 1 Tag in Sekunden. sprintf(ausgabepuffer, "sekVal %ld\r\n", sekVal); usart_outs(ausgabe); Ob es die Funktion usart_outs gibt, musst du in der Doku nachschauen. Eventuell heisst sie anders. Ciao, Yagan
Irgendwie habe ich jetzt auch den Eindruck mich irreführen gelassen zu haben bzw. auch etwas verwechselt. Sorry. Beim avr gcc können liegen die Verhältnisse etwas anders, daher meine Verwechselung. Soweit ich das erkennen kann, sollte auch die primitivste vfprintf mit long umgehen können. Das Problem wäre eher float. Irgendwas ist da faul. usart_write ist keine Bibliotheksfunktion, soweit ich weiss. Zeig da mal den Quellcode.
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.