Forum: Compiler & IDEs Char in Long Variable


von Markus P. (sebastianwurst)


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);

von Klaus W. (mfgkw)


Lesenswert?

Was genau steht in rtc.time[0] bis rtc.time[7] ?

Was genau funktioniert nicht?

Evtl. muß man die Rechnung in long erzwingen mit einem cast oder 
passenden Konstanten (10000ul bspw.).

von Rolf M. (rmagnus)


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.

von Markus P. (sebastianwurst)


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.

von Klaus W. (mfgkw)


Lesenswert?

Na wenn das ein String ist und die höchsten Stellen vorne stehen,
dann nimm doch einfach strcmp() zum Vergleichen!
(Oder memcmp(), wenn der String nicht nullterminiert ist.)

von Markus P. (sebastianwurst)


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

von Klaus W. (mfgkw)


Lesenswert?

1. Im Prinzip sollte es gehen, aber wie gesagt musst du dafür sorgen, 
daß die Zwischenergebnisse ggf. schon unsigned long werden.
2. Es ist eine sinnlose Rechnerei, wie gesagt geht es mit strcmp() 
schneller und einfacher
3. Deine Schleife hat 21 Durchläufe

von Markus P. (sebastianwurst)


Lesenswert?

Danke, ich mach das mit dem strcmp-Befehl . Wenn ich das richtig 
verstehe muss das für char's ja auch gehen.

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

von Rolf M. (rmagnus)


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.

von Klaus W. (mfgkw)


Lesenswert?

Rolf Magnus schrieb:
> rtc.time[x] - '\0'

Was soll das bringen?
Du meintest wohl eher rtc.time[x] - '0'

von Rolf M. (rmagnus)


Lesenswert?

Du hast natürlich recht. Es muß '0' sein, nicht '\0'.
Mea culpa.

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.