tag:forum.selfhtml.org,2005:/self C/C++ Befehl time(NULL) falscher Wert? – SELFHTML-Forum 2016-03-29T13:53:00Z https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664044#m1664044 ralphi ralphi4211@gmail.com 2016-03-25T14:40:14Z 2016-03-25T14:40:14Z C/C++ Befehl time(NULL) falscher Wert? <p>Hi all,<br> weiß jemand, warum ich in C/C++ mit dem Befehl time(NULL) einen falschen Wert bekomme?<br> ca. 14:07 Unix-timestamp:<br> in C: 2130385884 sec<br> php: liefert 1458911223 sec</p> <p>Ich möchte gerne den Timestamp zu einem Sensormodul (nRF24L01+) senden, zwengs Messwertzuordnungen.<br> Alles funktioniert wie gewünscht, außer Timestamp (.. und deuten des 1-Wire DS18B20 Messwerts - frag ich weiter unten auch gleich)<br> Auszug vom Pi2-Code:</p> <pre><code class="block language-c++"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdlib></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sstream></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><RF24/RF24.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><time.h></span></span> <span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token comment">//g++ -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv7-a -mtune=arm1176jzf-s -Wall -I../ -lrf24-bcm mytest.cpp -o test2</span> <span class="token comment">// Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 8Mhz</span> RF24 <span class="token function">radio</span><span class="token punctuation">(</span>RPI_V2_GPIO_P1_22<span class="token punctuation">,</span> RPI_V2_GPIO_P1_24<span class="token punctuation">,</span> BCM2835_SPI_SPEED_8MHZ<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token keyword">uint64_t</span> addresses<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0x65646f4e31</span><span class="token punctuation">,</span><span class="token number">0x65646f4e32</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">unsigned</span> <span class="token keyword">long</span> startTime<span class="token punctuation">,</span> stopTime<span class="token punctuation">,</span> counter<span class="token punctuation">,</span> rxTimer<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span><span class="token operator">*</span> argv<span class="token punctuation">)</span><span class="token punctuation">{</span> radio<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">openWritingPipe</span><span class="token punctuation">(</span>addresses<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">openReadingPipe</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>addresses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token operator">*</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span> <span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>stamp<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token punctuation">)</span><span class="token operator">&</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">startListening</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// hier dann das Messwert Empfangszeug</span> <span class="token punctuation">}</span> </code></pre> <p>Zwengs 1-Wire Tempsensor DS18B20.<br> Vielleich weiß das auch Jemand?<br> Laut <a href="https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" rel="nofollow noopener noreferrer">Datenblatt</a> :<br> BYTE 0 TEMPERATURE LSB (50h)<br> BYTE 1 TEMPERATURE MSB (50h) (85°C)<br> Byte 1 Byte 0<br> S S S S S B6 B5 B4 - B3 B2 B1 B0 -1 -2 -3 -4<br> Ich bekomme MSB 136 LSB 45 (Byte1,0) Zimmertemp: ca. 20,9°C<br> 1000 1000 - 0010 1101<br> Also: 2,13°C - (könnt natürlich 21,3 sein - dann deut ich aber das DB falsch)</p> <p>Beim ATTiny84:</p> <pre><code class="block language-c"><span class="token punctuation">.</span><span class="token punctuation">.</span> Sensor<span class="token punctuation">.</span><span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Sensor<span class="token punctuation">.</span><span class="token function">skip</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Sensor<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token number">0xBE</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Read Scratchpad Byte0 LSB byte1 MSB</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">2</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 9 bytes brauch nur 2 davon laut Datenblatt</span> temp<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> Sensor<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> </code></pre> <p>Viele Grüße aus LA<br> ralphi</p> <div class="signature">-- <br> "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E. </div> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664045#m1664045 Der Martin 2016-03-25T15:04:17Z 2016-03-25T15:04:17Z C/C++ Befehl time(NULL) falscher Wert? <p>Hallo,</p> <blockquote> <p>weiß jemand, warum ich in C/C++ mit dem Befehl time(NULL) einen falschen Wert bekomme?</p> </blockquote> <p>nein, aber hast du das mal isoliert getestet?</p> <blockquote> <p>ca. 14:07 Unix-timestamp:<br> in C: 2130385884 sec<br> php: liefert 1458911223 sec</p> </blockquote> <p>Der Wert 145... erscheint plausibel (46 Jahre mal 365 Tage/Jahr mal 86400 Sekunden/Tag).</p> <blockquote> <p>Alles funktioniert wie gewünscht, außer Timestamp (.. und deuten des 1-Wire DS18B20 Messwerts - frag ich weiter unten auch gleich)</p> </blockquote> <p>Könnte es ein Problem der Byte-Reihenfolge sein? Erwartet bzw. sendet dein Sensor vielleicht das MSB zuerst (Motorola-Format)? Das wäre jedenfalls das erste, was mir dazu einfiele ...</p> <p>So long,<br>  Martin</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664046#m1664046 pl 2016-03-25T15:12:31Z 2016-03-25T15:12:31Z C/C++ Befehl time(NULL) falscher Wert? <p>time() möchte als Argument einen Pointer. Möglicherweise kannst Du den Pointer mit NULL initialisieren aber NULL ist kein Pointer.</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664055#m1664055 Neunpapier 2016-03-25T16:42:03Z 2016-03-25T16:42:03Z C/C++ Befehl time(NULL) falscher Wert? <blockquote> <p>weiß jemand, warum ich in C/C++ mit dem Befehl time(NULL) einen falschen Wert bekomme?<br> ca. 14:07 Unix-timestamp:<br> in C: 2130385884 sec<br> php: liefert 1458911223 sec</p> </blockquote> <blockquote> <pre><code class="block language-c++"> <span class="token keyword">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token operator">*</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ohne C zu können: time() liefert einen Wert vom Typ time_t, kein uint8_t (was hardwareseitig identisch sein mag), vor allem aber keinen Zeiger auf uint8_t (oder time_t) – entferne erstmal das Sternchen vor stamp.</p> <blockquote> <p>Ich möchte gerne den Timestamp zu einem Sensormodul (nRF24L01+) senden, zwengs Messwertzuordnungen.</p> </blockquote> <p>Bei aller Liebe: Was meinst du denn bitte mit "zwengs"? Doch nicht etwa "zwecks", vom Zweck?</p> <blockquote> <p>1-Wire Tempsensor DS18B20.<br> Vielleich weiß das auch Jemand?<br> Laut <a href="https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" rel="nofollow noopener noreferrer">Datenblatt</a> :<br> BYTE 0 TEMPERATURE LSB (50h)<br> BYTE 1 TEMPERATURE MSB (50h) (85°C)<br> Byte 1 Byte 0<br> S S S S S B6 B5 B4 - B3 B2 B1 B0 -1 -2 -3 -4<br> Ich bekomme MSB 136 LSB 45 (Byte1,0) Zimmertemp: ca. 20,9°C<br> 1000 1000 - 0010 1101</p> </blockquote> <p>Dieser Wert kann nicht vom Sensor stammen. Die S-Bits zeigen das Vorzeichen an und sind entweder alle 1 oder alle 0, nicht, wie bei dir, ein paar 1 und ein paar 0.</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664060#m1664060 Robert B. 2016-03-25T17:20:54Z 2016-03-25T17:20:54Z C/C++ Befehl time(NULL) falscher Wert? <p>Moin,</p> <blockquote> <pre><code class="block language-c++"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><stdio.h></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><time.h></span></span> </code></pre> </blockquote> <p>Wenn du in C++ programmierst, dann nimm doch besser deren Header für die Standardbibliothek:</p> <pre><code class="block language-c++"><span class="token comment">// …</span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><ctime></span></span> </code></pre> <p>Warum eigentlich iostream und cstdio? Das kann unter Umständen Konflikte bei der I/O geben. In deinem Codebeispiel wird cstdio auch gar nicht verwendet.</p> <blockquote> <pre><code class="block language-c++"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span> <span class="token keyword">unsigned</span> <span class="token keyword">long</span> startTime<span class="token punctuation">,</span> stopTime<span class="token punctuation">;</span> </code></pre> </blockquote> <p>Was für Werte sollen in diesen Variablen gespeichert werden? Die Funktion std::time liefert einen Wert vom Typ std::time_t zurück. Das muss nicht zwingend ein long sein.</p> <blockquote> <pre><code class="block language-c++"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span><span class="token operator">*</span> argv<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// …</span> <span class="token keyword">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token operator">*</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Hier unterstellst du, dass std::time einen 32-Bit-Wert zurückgibt. Es können aber auch 64 Bit sein (um das <a href="https://de.wikipedia.org/wiki/Jahr-2038-Problem" rel="nofollow noopener noreferrer">Jahr-2038-Problem</a> zu umgehen).</p> <p>Wenn mich nicht alles täuscht, dann steht der time_t in stamp auch unter Umständen in einer anderen Byte-Reihenfolge als vielleicht gewünscht. Das könnte hier zum Problem werden:</p> <blockquote> <pre><code class="block language-c++"> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span> <span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>stamp<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ansonsten könnte der Aufruf von write auch geändert werden:</p> <pre><code class="block language-c++">std<span class="token double-colon punctuation">::</span>time_t stamp <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>stamp<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Viele Grüße Robert</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664153#m1664153 frank 2016-03-26T13:39:35Z 2016-03-26T13:39:35Z C/C++ Befehl time(NULL) falscher Wert? <blockquote> <pre><code>uint8_t stamp[4] ; </code></pre> </blockquote> <p><code>stamp</code> ist hier deklariert als ein Pointer auf einen <code>uint8_t</code>-Wert.</p> <blockquote> <pre><code>* stamp = time(NULL); </code></pre> </blockquote> <p>Diese Zeile erzeugt links einen <code>uint8_t</code>-Wert und weist diesem eine größere Zahl zu. Was davon nicht in 8 Bit passt, wird abgeschnitten.</p> <blockquote> <pre><code>cout << "stamp: " << (unsigned long)&stamp << ends; </code></pre> </blockquote> <p>Diese Zeile gibt nicht den Wert von <code>stamp</code> aus, sondern die Adresse an der der Pointer <code>stamp</code> gespeichert ist.</p> <p>Korrekt wäre:</p> <pre><code>uint8_t stamp[4]; *(unsigned long*)stamp = time(NULL); cout << "stamp: " << *(unsigned long*)stamp << endl; </code></pre> <p>Oder ganz einfach:</p> <pre><code>time_t stamp = time(NULL); cout << "stamp: " << stamp << endl; </code></pre> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664049#m1664049 ralphi ralphi4211@gmail.com 2016-03-25T15:25:38Z 2016-03-25T15:25:38Z C/C++ Befehl time(NULL) falscher Wert? <p>Hi Martin,</p> <p>nun – den Timestamp hol / generier ich mir auf dem Raspi (Debian Server) mit Echtzeit.<br> Und gebe Ihn zur Kontrolle auch auf dem Raspi aus, nicht gesendet / empfangen.</p> <pre><code class="block language-c">cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token punctuation">)</span><span class="token operator">&</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> </code></pre> <p>Der µC hat keine Echtzeit (nur ‘dumme’ Timmer). Der bekommt dann den Timestamp.<br> Mit:<br> my_zeitstamp = stamp - (millis()/1000); // stamp = gesendet<br> bekomme ich dann jedesmal mit<br> my_zeitstamp + (millis()/1000) den Unix-Timestamp auch später im µC<br> millis() ist die Uptime des µC<br> Viele Grüße aus LA<br> ralphi</p> <div class="signature">-- <br> "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E. </div> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664048#m1664048 Der Martin 2016-03-25T15:15:10Z 2016-03-25T15:15:10Z C/C++ Befehl time(NULL) falscher Wert? <p>Hallo,</p> <blockquote> <p>time() möchte als Argument einen Pointer.</p> </blockquote> <p>ja, der aber ausdrücklich auch NULL sein darf, in diesem Fall wird der Timestamp nur als Funktionsergebnis geliefert, und nicht zusätzlich irgendwohin geschrieben.</p> <blockquote> <p>Möglicherweise kannst Du den Pointer mit NULL initialisieren aber NULL ist kein Pointer.</p> </blockquote> <p>Hä?</p> <p>So long,<br>  Martin</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664057#m1664057 Der Martin 2016-03-25T17:12:54Z 2016-03-25T17:12:54Z C/C++ Befehl time(NULL) falscher Wert? <p>Hallo,</p> <blockquote> <blockquote> <pre><code class="block language-c++"> <span class="token keyword">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token operator">*</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ohne C zu können: time() liefert einen Wert vom Typ time_t, kein uint8_t (was hardwareseitig identisch sein mag), vor allem aber keinen Zeiger auf uint8_t (oder time_t) – entferne erstmal das Sternchen vor stamp.</p> </blockquote> <p>ohne C zu können, hast du vermutlich genau den Knackpunkt gefunden, aber falsch erklärt bzw. die falschen Schlüsse daraus gezogen.</p> <p>Also: tatsächlich liefert time() einen Wert vom Typ time_t, und das ist ein uint32 (also im üblichen Sprachgebrauch ein DWORD). In ralphis Beispiel ist stamp deklariert als Array von vier uint8 (also BYTE). Die Zuweisung</p> <pre><code class="block language-c"><span class="token operator">*</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>ist de facto identisch mit</p> <pre><code class="block language-c">stamp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>weil die Nennung eines Arrays ohne Index-Klammern gleichwertig mit einem Zeiger auf das erste Array-Element ist, und weist daher dem ersten Byte von stamp das Ergebnis von time() zu. Dabei findet implizit ein Typecast von DWORD auf BYTE statt, bei dem Information verlorengeht (vom Compiler hätte ich an der Stelle eigentlich eine Warnung erwartet), während stamp[1] bis stamp[3] uninitialisiert bleiben und zufällige Werte enthalten.</p> <p>Aber ralphi will ja den von time() gelieferten DWORD-Wert in den vier Bytes stamp[0] bis stamp[3] haben. Am einfachsten wäre das wohl mit:</p> <pre><code class="block language-c"><span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token class-name">time_t</span><span class="token operator">*</span><span class="token punctuation">)</span> stamp<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <blockquote> <blockquote> <p>Ich möchte gerne den Timestamp zu einem Sensormodul (nRF24L01+) senden, zwengs Messwertzuordnungen.</p> </blockquote> <p>Bei aller Liebe: Was meinst du denn bitte mit "zwengs"? Doch nicht etwa "zwecks", vom Zweck?</p> </blockquote> <p>Das fiel mir auch auf, aber ich habe einfach drüber hinweggelesen. :-)</p> <p>So long,<br>  Martin</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664177#m1664177 ralphi ralphi4211@gmail.com 2016-03-27T00:56:59Z 2016-03-27T00:56:59Z C/C++ Befehl time(NULL) falscher Wert? <p>Hi,</p> <blockquote> <p>Bei aller Liebe: Was meinst du denn bitte mit "zwengs"? Doch nicht etwa "zwecks", vom Zweck?</p> </blockquote> <p>Sorry - mein Dialekt.<br> 'zwengs (am)' heißt: 'und wegen des' ;-)<br> Viele Grüße aus LA<br> ralphi</p> <div class="signature">-- <br> "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E. </div> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664176#m1664176 ralphi ralphi4211@gmail.com 2016-03-27T00:51:35Z 2016-03-27T00:51:35Z C/C++ Befehl time(NULL) falscher Wert? <p>Hi all,<br> Danke erst mal an Alle:<br> Also der Befehl radio.write() erwartet void* als Daten.</p> <p>Wenn ich jetzt:</p> <pre><code class="block language-c"><span class="token class-name">time_t</span> stamp2 <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> </code></pre> <p>Dann passen die Bytes :-)</p> <pre><code class="block language-c"><span class="token comment">//Allerdings:</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token punctuation">)</span> <span class="token operator">*</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">// nur das erste Byte</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span> stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">// nur Adresse</span> <span class="token comment">//Jetzt bekomm ich:</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span> <span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//sizeof(stamp)) ; // Also Adresse von stamp</span> <span class="token comment">// nix gscheids</span> </code></pre> <p>Kann aber auch ein Fehler im µC-Prog sein!?</p> <p>Bei:</p> <pre><code class="block language-c"><span class="token class-name">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token operator">*</span><span class="token punctuation">)</span>stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token operator">*</span><span class="token punctuation">)</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> </code></pre> <p>warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]</p> <p>So richtig, wie ich an den Speicherbereich bei Linux ran muss, weiß ich noch nicht?<br> Beim µC hab ich:</p> <pre><code class="block language-c"><span class="token class-name">uint8_t</span> data<span class="token punctuation">[</span><span class="token number">32</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//..</span> <span class="token comment">// füll es</span> <span class="token comment">//..</span> <span class="token comment">// VCC</span> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0x01</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> analogValue <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>analogValue <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">//.. usw</span> <span class="token comment">// SENSDEREI</span> radio<span class="token punctuation">.</span><span class="token function">powerUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span> data<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> radio<span class="token punctuation">.</span><span class="token function">powerDown</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>das klappt ohne Probleme!?</p> <p>Viele Grüße aus LA<br> ralphi</p> <div class="signature">-- <br> "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E. </div> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664184#m1664184 Der Martin 2016-03-27T07:40:58Z 2016-03-27T08:00:22Z C/C++ Befehl time(NULL) falscher Wert? <p>Moin,</p> <blockquote> <p>Also der Befehl radio.write() erwartet void* als Daten.</p> </blockquote> <p>und das bedeutet jetzt was genau - so zusammenhanglos?</p> <blockquote> <pre><code class="block language-c"><span class="token class-name">time_t</span> stamp2 <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> stamp<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>stamp2 <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Okay, das geht natürlich. Ist quasi die Holzhammer-Narkose. Einen eleganteren Weg hatte ich dir <a href="https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664057#m1664057" rel="noopener noreferrer">schon vorgeschlagen</a>; ein anderer wäre eine union-Deklaration, so dass ein time_t und vier Bytes dieselben Adressen belegen:</p> <pre><code class="block language-c"><span class="token keyword">union</span> <span class="token punctuation">{</span> <span class="token class-name">time_t</span> t<span class="token punctuation">;</span> uint8 b<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> stamp<span class="token punctuation">;</span> </code></pre> <p>So kannst du denselben Speicherplatz einmal mit stamp.t als time-Wert ansprechen, und einmal mit stamp.b als Byte-Array.</p> <blockquote> <pre><code class="block language-c"><span class="token comment">//Allerdings:</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token punctuation">)</span> <span class="token operator">*</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">// nur das erste Byte</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">int</span><span class="token punctuation">)</span> stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">// nur Adresse</span> <span class="token comment">//Jetzt bekomm ich:</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span> <span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//sizeof(stamp)) ; // Also Adresse von stamp</span> <span class="token comment">// nix gscheids</span> </code></pre> </blockquote> <p>Nochmal: Der Ausdruck <em>(unsigned long) *stamp</em> nimmt die Basisadresse des Arrays als Zeiger auf uint8, dereferenziert diesen Zeiger und liest das erste Array-Element, und castet das dann nach unsigned long. Das ist dasselbe wie <em>(unsigned long) stamp[0]</em>.<br> Der Ausdruck <em>(unsigned int) stamp</em> nimmt die Adresse des Arrays und castet die nach unsigned int. (Warum nimmst du hier nicht auch long?)<br> Und <em>&stamp</em> ist wieder nur die Adresse des Arrays, wobei der Adress-Operator & hier überflüssig ist (aber auch nicht schädlich).</p> <blockquote> <pre><code class="block language-c"><span class="token class-name">uint8_t</span> stamp<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token operator">*</span><span class="token punctuation">)</span>stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"stamp: "</span> <span class="token operator"><<</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token operator">*</span><span class="token punctuation">)</span>stamp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> </code></pre> <p>warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]</p> </blockquote> <p>Prima: Der Compiler erkennt, dass du hier verschiedene Zeiger-Typen ineinander überführen willst und warnt, weil das meistens ein Fehler ist. Hier ist es dagegen Absicht.</p> <blockquote> <p>So richtig, wie ich an den Speicherbereich bei Linux ran muss, weiß ich noch nicht?</p> </blockquote> <p>Es gibt keinen Unterschied zwischen Linux und beispielsweise Windows in diesen Beispielen.</p> <blockquote> <pre><code class="block language-c"> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0x01</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> analogValue <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>analogValue <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> x<span class="token operator">++</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Das geht noch etwas schöner, wenn man die Zuweisung und das Increment zusammenfasst:</p> <pre><code class="block language-c"> data<span class="token punctuation">[</span>x<span class="token operator">++</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0x01</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token operator">++</span><span class="token punctuation">]</span> <span class="token operator">=</span> analogValue <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> data<span class="token punctuation">[</span>x<span class="token operator">++</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>analogValue <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0xFF</span><span class="token punctuation">;</span> </code></pre> <p>ERGÄNZUNG:<br> Wieso hantierst du eigentlich so umständlich mit einem time-Wert und dem Byte-Array herum? Wozu brauchst du das Array? Genügt nicht einfach sowas:</p> <pre><code class="block language-c"><span class="token class-name">time_t</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// weiterer Code ...</span> <span class="token comment">// weiterer Code ...</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>stamp<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Denn eingangs hattest du noch darauf hingewiesen, dass radio.write() mit <em>void*</em> als Parameter deklariert ist, und der ist ja zu allen anderen Zeigertypen kompatibel.</p> <p>Schöne Ostern noch,<br>  Martin</p> https://forum.selfhtml.org/self/2016/mar/25/c-strich-c-plus-plus-befehl-time-null-falscher-wert/1664354#m1664354 ralphi ralphi4211@gmail.com 2016-03-29T13:53:00Z 2016-03-29T13:53:00Z C/C++ Befehl time(NULL) falscher Wert? -GELÖST- <p>Hi all,<br> ich muss mich erst mal entschuldigen – ein Problem zu schildern, dass es so nicht gibt.<br> Meiner Schlamperei ist zu verdanken, dass der ATTiny die gesendeten Werte falsch darstellt. Und der DS18(B)20 falsch gedeutet wird.<br> Natürlich funktioniert:</p> <blockquote> <p>ERGÄNZUNG:<br> Wieso hantierst du eigentlich so umständlich mit einem time-Wert und dem Byte-Array herum? Wozu brauchst du das Array? Genügt nicht einfach sowas:</p> <pre><code class="block language-c"><span class="token class-name">time_t</span> stamp <span class="token operator">=</span> <span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// weiterer Code ...</span> <span class="token comment">// weiterer Code ...</span> radio<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token operator">&</span>stamp<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>stamp<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ich hab mehr als 3 Sachen gleichzeitig implementiert und Murx im Speicher gemacht.<br> Auch der DS18(B)20 funktioniert, wenn man in der Box nicht DS18B20 und DS18S20 mischt - grr</p> <blockquote> <p>ein anderer wäre eine union-Deklaration, so dass ein time_t und vier Bytes dieselben Adressen belegen:</p> <pre><code class="block language-c"><span class="token keyword">union</span> <span class="token punctuation">{</span> <span class="token class-name">time_t</span> t<span class="token punctuation">;</span> uint8 b<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> stamp<span class="token punctuation">;</span> </code></pre> <p>So kannst du denselben Speicherplatz einmal mit stamp.t als time-Wert ansprechen, und einmal mit stamp.b als Byte-Array.</p> </blockquote> <p>Dachte das geht einfacher!?<br> Zitat:</p> <blockquote> <p>Es ist allerdings genauso gut möglich eine Zeigervariable zu übergeben oder direkt die Speicherposition des Feldes:<br> char str[] = {'h','a','l','l','o','\0'};<br> char* pStr1 = str;<br> char* pStr2 = &str[0];<br> pStr1 und pStr2 zeigen auf den selben Speicherbereich</p> </blockquote> <blockquote> <blockquote> <pre><code class="block language-c"></code></pre> </blockquote> </blockquote> <p>Sorry - AN ALLE :-0 Viele Grüße aus LA<br> ralphi</p> <div class="signature">-- <br> "Nicht alles was einfach ist, ist genial, aber alles was genial ist, ist einfach" - Albert E. </div>