PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stopwatch in Sekunden ausgeben



Dasive
04.01.2011, 13:32
Ich wollte eine gewisse Zeit messen um die danach im Terminal ausgeben zu können. Ich habe eine Funktion geschrieben um die Werte der Stopwatches in Sekunden mit 3 Kommastellen umzurechnen.
Mein Problem ist das ich keinen Fehler im Code finden kann, machnchmal aber Negative Werte bekomme.
Ich kann mir nicht erklären warum, die Häufigkeit ist etwa 40%.

Meine Funktion:


void ZahlMitKommaAusgeben(int Zahl, int Genauigkeit){
Zahl_mit_Komma = Zahl / Genauigkeit;
writeInteger(Zahl_mit_Komma,DEC);
writeString_P(",");
Zahl_mit_Komma = Zahl_mit_Komma * Genauigkeit;
writeInteger(Zahl - Zahl_mit_Komma, DEC);
}

Dirk
04.01.2011, 22:17
@Dasive:
Der Typ int16_t reicht ja von -32768 bis +32767.
Das wird auch mit writeInteger so ausgegeben.

Wenn eine deiner Werte also > 32767 wird, wird er negativ dargestellt.

Alternative:
Den Typ uint16_t nehmen (0..65535).
Den unsigned int Wert müßtest du dann aber auch mit einer geeigneten Funktion ausgeben.
Ich hänge dir mal eine Funktion an, die (u)int16_t und int32_t darstellen kann:

/**
* Write a long number (with specified base) to the UART.
*
* Example:
*
* // Write a hexadecimal number to the UART:
* writeLong(0xAACC,16);
* // Instead of 16 you can also write "HEX" as this is defined in the
* // RP6uart.h :
* writeLong(0xAACC, HEX);
* // Other Formats:
* writeLong(1024,DEC); // Decimal
* writeLong(044,OCT); // Octal
* writeLong(0b11010111,BIN); // Binary
*/
void writeLong(int32_t number, uint8_t base)
{char buffer[33];
ltoa(number, &buffer[0], base);
writeString(&buffer[0]);
}


Gruß Dirk

Dasive
06.01.2011, 12:54
Danke dir, daran häte ich nicht gedacht