Wieder mal problem mit long beim Ausgeben

OP (Firma: S+S) #2202680
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
OP (Firma: S+S) #2202704
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...
Gast #2202728
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.
Gast #2202733
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.
#2202745
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
Gast #2202766
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren