Forum: Mikrocontroller und Digitale Elektronik Wieder mal problem mit long beim Ausgeben


von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

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

von Guru (Gast)


Lesenswert?

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.

von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

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...

von Yagan Ζ. D. (yagan)


Lesenswert?

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

von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

funktioniert leider beides nicht.
Bei %li bekomm ich die Ausgabe:
sekVal i

und bei %ld die Ausgbe:
sekVal d

von Yagan Ζ. D. (yagan)


Lesenswert?

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

von Yagan Ζ. D. (yagan)


Lesenswert?

Manuel Simmerl schrieb:
> und bei %ld die Ausgbe:
> sekVal d

Seltsam! Was benutzt du denn für einen Compiler?

von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

Ich benutze den normalen Kompiler der beim AVR Studio 4.0 dabei ist.

von H.Joachim S. (crazyhorse)


Lesenswert?

CodeVision?
Dem musste unter Project->Configure-> C Compiler->(s)printf features 
sagen, dass du long-Variablen ausgeben willst.

von Guru (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

Bei AVRStudio 4.0 ist kein Compiler dabei.

Oliver

von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

H:\WinAVR-20090313\bin\avr-gcc.exe

Ich nehme mal an das es sich um den gcc kompiler handelt.

von Guru (Gast)


Lesenswert?

>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.

von Manuel S. (Firma: S+S) (msimmerl)


Lesenswert?

Es ist der GCC installiert.
Leider finde ich aber in den Projekteinstellung das beschriebene 
nicht...

von Yagan Ζ. D. (yagan)


Lesenswert?

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

von Guru (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.