Char in Long Variable

OP #1990897
Lesenswert?
• ▲
▼
Hallo,
ich habe vor 6 Char Variablen in eine Long Variable zu packen und zwar 
ganz einfach über addition der Werte. Es handelt sich dabei um die 
Stellen einer Uhr. Wenn es z.B. 12:34:56 ist steht in der Long Variable 
123456. Long Variable wollte ich nehemen da z.B. die Integer Variable 
nur bis 32767 geht.
Meine Frage is überhaupt ob das so einfach möglich ist wie ich mir das 
vorstelle:
1
Long_Uhrzeit = (rtc.time[0] * 100000) +  (rtc.time[1] * 10000) 
2
             + (rtc.time[3] * 1000) +  (rtc.time[4]* 100)
3
       + (rtc.time[6] * 10) +  (rtc.time[7] * 1);
Da das irgendwie nicht funktioniert. Das ganze beruht auf die rtc.h.

Hintergrund: Ich will die Istuhrzeit mit einer Solluhrzeit vergleichen. 
(z.B. Long_Uhrzeit <= Long_Soll_Uhrzeit ... )
1
// **************************************************************
2
// *******  RTC_ROUTINES HEADER FILE ********     
3
// **************************************************************
4
#define  DS1307_W      0xd0
5
#define  DS1307_R      0xd1
6

7
#define RTC_NO_ERROR  0
8
#define RTC_ERROR    1
9

10

11
typedef struct
12
{
13
  unsigned char time[9];
14
  unsigned char date[12];
15
  unsigned char day;
16
  unsigned char rtc_register[7];
17

18

19
} RTC_DATE_TIME;
20

21

22
unsigned char rtc_read(RTC_DATE_TIME *r);
23
unsigned char rtc_write(RTC_DATE_TIME *r);
#1990903
Lesenswert?
• ▲
▼
Kann es sein, daß deine RTC dir die Zeit als String zurückgibt? Oder 
warum überspringst du sonst nach zwei Elementen immer eins?
In dem Fall kannst du das Zeichen natürlich nicht einfach als Integer 
intepretieren. Mach mal bei jedem rtc.time[x] in deiner Berechnung oben 
ein (rtc.time[x] - '\0').

Übrigens: Das ist zumindest auf kleinen µC ziemlich aufwendig. Wenn du 
das nur für den Vergleich machst, könnte man es deutlich effizienter 
machen.
OP #1990909
Lesenswert?
• ▲
▼
Hi wenn Du z.B.  (rtc.time[2]) meisnt, das ist der Doppelpunkt. Die 
Variablen stehen in Char da. Wie würdest Du denn die Variablen 
vergleichen. Ich muss noch dazu sagen das ich 20 Uhrzeiten habe, die ich 
mit der "Long_Uhrzeit" vergleichen will. Welche die erste Uhrzeit ist, 
die kleiner als die Long_Uhrzeit ist soll angezeigt werden.
OP #1990914
Lesenswert?
• ▲
▼
@ Klaus deine Nachricht hatte ich erst übersehen.

In rtc.time[0] steht die Zehnerstelle der Stunden
rtc.time[1] Einerstelle der Stunden
rtc.time[2] Doppelpunkt
rtc.time[3] Zs der Minuten
rtc.time[4] Es der Minuten
rtc.time[5] Doppelpunkt
rtc.time[6] Zs der Sekunden
rtc.time[7] Es der Minuten

Alles als char datei
Im ganzen wollte ich das so machen:
1
Long_Uhrzeit =   (rtc.time[0] * 100000) +  (rtc.time[1] * 10000) 
2
               + (rtc.time[3] * 1000) +  (rtc.time[4]* 100)
3
               + (rtc.time[6] * 10) +  (rtc.time[7] * 1);
4

5

6
for (g = 20; g >= 0; g--)
7
 { 
8

9

10
Long_Soll_Uhrzeiten     = (StundenFuetterung[g] * 10000)
11
                        + (MinutenFuetterung[g] * 100)
12
                        + (SekundenFuetterung[g] );
13

14
 if (Long_Uhrzeit < Long_Soll_Uhrzeiten )
15
    Naechste_UhrzeitNr = g;    
16

17
   }


StundenFuetterung[g] = 12
MinutenFuetterung[g] = 34
SekundenFuetterung[g] = 56
______________________________
Ergibt dann         : 123456
#1990926
Lesenswert?
• ▲
▼
Sebastian K. schrieb:
> Danke, ich mach das mit dem strcmp-Befehl . Wenn ich das richtig
> verstehe muss das für char's ja auch gehen.

Was heißt 'auch'? Es ist dafür gemacht. Allerdings muß das Array für 
strcmp nullterminiert sein. Wenn die Länge eh fix ist, würde sich aber 
memcmp eher anbieten.

> PS.: Noch eine Frage, wie sorge ich denn dafür das die
> Zwischenergebnisse unsigned_long werden ?

Indem du dafür sorgst, daß die Eingangsdaten unsigned long sind. Du 
kannst bei den Konstanten statt z.B. 1000 einfach 1000UL schreiben, also 
überall ein UL dranhängen.

Sebastian K. schrieb:
> Die Variablen stehen in Char da.

char ist zunächst mal nix weiter als ein kleiner Integer-Typ. Wichtig 
ist, in welcher Form die Daten da drin stehen. Einfach als Integer-Wert 
oder als Text. Deine Aussagen ist zu entnehmen, daß es sich um Text 
handelt. Dann solltest du bei Verwendung deiner bisherigen Methode 
tatsächlich das da beherzigen:

Rolf Magnus schrieb:
> Mach mal bei jedem rtc.time[x] in deiner Berechnung oben
> ein (rtc.time[x] - '\0').

aber ein memcmp wäre tatsächlich einfacher und auch deutlich schneller.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.