Und das ganze dann auslese, habe Ich in stamp[1].time genau die gleiche
Uhrzeit wie in stamp[0]. Was mache Ich hier falsch?
Irgendetwas stimmt mit meiner Zeiger Thematik nicht so ganz..
Schwer zu sagen, wenn man nicht weiß, wie sich bcd_ttostr verhält.
Allerdings würde ich davon ausgehen, dass der Pointer, den die Funktion
zurückgibt auf einen internen statischen Puffer zeigt, der
logischerweise mit jedem Aufruf überschrieben wird. Also würde ich mal
ein strrep um den Aufruf setzen.
Felix U. schrieb:> Schwer zu sagen, wenn man nicht weiß, wie sich bcd_ttostr verhält.> Allerdings würde ich davon ausgehen, dass der Pointer, den die Funktion> zurückgibt auf einen internen statischen Puffer zeigt, der> logischerweise mit jedem Aufruf überschrieben wird. Also würde ich mal> ein strrep um den Aufruf setzen.
Hier ist die Funktion
Helmut A. schrieb:> Hier ist die Funktion
Dann ist es so wie ich vermute habe. Der "time" Puffer wird bei jedem
Aufruf überschrieben. Du musst ihn also kopieren bevor du die Funktion
neu aufrufst. Ein Ansatz dafür wäre strrep.
Das bringt dich aber in die unangenehme Situation, dynamisch Speicher
allozieren und freigeben zu müssen.
Entweder du änderst also deine Struktur so, dass du die RTC-Werte als
Zahlen speicherst und dann nur für die Ausgabe in Text umwandelst, oder
du erzeugst direkt für jedes Element einen ausreichend großen Puffer:
1
typedefstruct
2
{
3
/*
4
* Zu einer bestimmten Uhrzeit gemessene Temperatur
5
*/
6
int8_ttemp;
7
8
/*
9
* Uhrzeit des gemessenen Wertes
10
*/
11
chartime[9];
12
13
}tempStamp_t;
und machst dann
1
strcpy(stamp[0].time,(char*)bcd_ttostr(...));
oder, wenn du gerade dabei bist, kannst du dir die unnötige Kopieraktion
auch sparen und die Funktion so ändern:
Felix U. schrieb:> Dann ist es so wie ich vermute habe. Der "time" Puffer wird bei jedem> Aufruf überschrieben. Du musst ihn also kopieren bevor du die Funktion> neu aufrufst. Ein Ansatz dafür wäre strrep.
Verstehe Ich jetzt mal nicht ganz.
Ich möchte doch das der "time" Puffer überschrieben wird wenn sich die
Uhrzeit ändert.
"00:00:00" ist eine ein constantes char array, dass nicht verändert
werden darf. Aus historischen gründen darf ein char* damit initialisiert
werden. Der compiler wird vermutlich die beiden identischen
Stringconstanten nur einmal speichern, wodurch stamp[0].time ==
stamp[1].time. Ändere entweder "char *time" zu "char time[9]", oder
initialisere es mit einem compound literal (char[]){"00:00:00"}.
Helmut A. schrieb:> Verstehe Ich jetzt mal nicht ganz.> Ich möchte doch das der "time" Puffer überschrieben wird wenn sich die> Uhrzeit ändert.
In deiner Version gibt es nur einen einzigen Time-Puffer, auf den sowohl
der Eintrag für den Minimal, als auch der für den Maximalwert zeigt. Der
einzelne Puffer kann logischerweise auch nur eine einzelne Uhrzeit
beinhalten.
Du brauchst also mindestens zwei Puffer, um zwei Uhrzeiten speichern zu
können.
Daniel A. schrieb:> "00:00:00" ist eine ein constantes char array, dass nicht> verändert> werden darf. Aus historischen gründen darf ein char* damit initialisiert> werden. Der compiler wird vermutlich die beiden identischen> Stringconstanten nur einmal speichern, wodurch stamp[0].time ==> stamp[1].time. Ändere entweder "char *time" zu "char time[8]", oder> initialisere es mit einem compound literal (char[]){"00:00:00"}.
Meinst du so?
Felix U. schrieb:> Helmut A. schrieb:>> Verstehe Ich jetzt mal nicht ganz.>> Ich möchte doch das der "time" Puffer überschrieben wird wenn sich die>> Uhrzeit ändert.>> In deiner Version gibt es nur einen einzigen Time-Puffer, auf den sowohl> der Eintrag für den Minimal, als auch der für den Maximalwert zeigt. Der> einzelne Puffer kann logischerweise auch nur eine einzelne Uhrzeit> beinhalten.>> Du brauchst also mindestens zwei Puffer, um zwei Uhrzeiten speichern zu> können.
Ich dachte das tue Ich hiermit
1
tempStamp_tstamp[]=
2
{
3
{-12,"00:00:00 "},// Niedrigst gemessene Temperatur
4
{12,"00:00:00 "},// Höchst gemessene Temperatur
5
};
Sage Ich dem Compiler dadurch nicht das er mir für "00:00:00" 9 Bytes
reservieren soll?
@Helmut A. (Gast)
Ich hatte übersehen, dass bcd_ttostr nur einen Pointer auf einen anderen
Buffer zurück gibt, und nicht den bestehenden übergeben bekommt und
überschreibt. Sorry führ die Verwirrung.
Helmut A. schrieb:> Sage Ich dem Compiler dadurch nicht das er mir für "00:00:00" 9 Bytes> reservieren soll?
Nein. Das musst du schon in der Struktur machen.
Felix U. schrieb:> Helmut A. schrieb:>> Sage Ich dem Compiler dadurch nicht das er mir für "00:00:00" 9 Bytes>> reservieren soll?>> Nein. Das musst du schon in der Struktur machen.
Wie kann man das noch machen?
Helmut A. schrieb:> char *buff[2][9]> Würde das gehen?
char buff[2][9] würde noch Sinn ergeben. Warum nimmst du nicht die
Variante die ich oben vorgeschlagen habe?
Felix U. schrieb:> Helmut A. schrieb:>> char *buff[2][9]>> Würde das gehen?>> char buff[2][9] würde noch Sinn ergeben. Warum nimmst du nicht die> Variante die ich oben vorgeschlagen habe?
Diese Funktion benutze Ich schon an anderen Stellen erfolgreich so muss
Ich nicht ständig noch einen Parameter übergeben und setze so nur auf
einen Puffer. Jetzt wirds mir auch klar wieso das nicht funktioniert.
Helmut A. schrieb:> Könnte es mit einem Zeiger nicht auch funktionieren?
Der Zeiger nützt dir genau garnichts. Du weisst ja bereits, wo deine
zwei Buffer sind, und wen du wie vorher wieder die Zeiger auf den
gleichen Buffer zeigen lässt hasst du wieder das gleiche Problem. Du
könntest aber memcpy verwenden, sofern du die Funktion bcd_ttostr nicht
in unterschiedlichen Threads oder in Signal handlern nutzt.
//so würde dein stamp[1].time Pointer auf den Buffer zeigen. Der Inhalt wird ja nicht in stamp[1].time kopiert.
14
15
//stamp[1].time = "16:10:00";
16
}
Dein Problem ist, dass nach dem beide stamp[0].time und stamp[1].time
gesetzt wurden diese auf den Buffer zeigen. Somit repräsentieren diese
immer den aktuellen Inhalt des Buffers.
Grüße
steve41993