www.mikrocontroller.net

Forum: Compiler & IDEs char array nach long


Autor: DerDumme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vor einigen Wochen damit begonnen mir das Webserver-Projekt des 
Herrn Radig vorzunehmen. Ich habe da so meine liebe Not mit der 
Variablen dhcp_lease und wie diese anhand des char-arrays "gefüllt" 
wird.

In der Datei dhcpc.c wird dhcp_lease als unsigned long bestimmt. Nach 
meinem Verständnis sollte es sich fortan also um eine 32 bit schwere 
Variable handeln in der 4 Zeichen abgelegt werden können sollten.

In der Funktion unsigned char dhcp(void) soll die Variable dhcp_lease 
wie folgt gefüllt werden:
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

Weiter oben in derselben Funktion steht folgendes:
   if((dhcp_state == DHCP_STATE_FINISHED) && (dhcp_lease < 600))

Innerhalb der Webseite die in webpage.h abgelegt wird habe ich eine neue 
"Ersetzung" mit dem Namen %LEASE, welche durch folgende Zeile in httpd.c 
ersetzt wird, eingebaut:
   if(strncasecmp_P("LEASE", http_entry[index].new_page_pointer, 5) == 0)
      {
      ltoa(dhcp_lease, var_conversion_buffer, 10);
      str_len = strnlen(var_conversion_buffer, CONVERSION_BUFFER_LEN);
      memmove(&eth_buffer[TCP_DATA_START + a], var_conversion_buffer, str_len);
      a = a + (str_len - 1);
      http_entry[index].new_page_pointer = http_entry[index].new_page_pointer + 5;
      }

Verwende ich den Code im "Original" wird mir eine LeaseTime angezeigt 
die ein bischen mehr enthält als das was mein Router eigentlich vorhat. 
Das geht in die Millionen Sekunden. Dieses "dhcp_lease < 600" dürfte in 
Jahren nicht fällig werden. Mein Router vergibt eine IP für 1800 
Sekunden. Ich habe aus der 600 also eine 1770 gemacht um zu sehen dass 
da nach 30 Sekunden etwas geschieht. Fehlanzeige. Da passt also etwas 
nicht.

Ich dachte mir also, ich ersetzte
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

durch
   dhcp_lease = 0;
   dhcp_lease = dhcp_lease + (cache.lease[3] <<  0);
   dhcp_lease = dhcp_lease + (cache.lease[2] <<  8);
   dhcp_lease = dhcp_lease + (cache.lease[1] << 16);
   dhcp_lease = dhcp_lease + (cache.lease[0] << 24);

Beim compilieren erhalte ich sodann folgenden Fehler:
   left shift count >= width of type

Kann mir mal bitte jemand erklären wie ich in dieses unsigned long 4 
bytes aus dem Char-Array reingeprügelt bekomme?

Autor: DerDumme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das was mir da in dhcp_lease abgelegt wird hat den Wert 134676480 
was 0x08070000 entspricht. Es sollte jedoch 1800 also 0x00000708. Das 
sieht mir irgendwie verdreht aus.

Das ändert jetzt allerdings nichts an meinem Problem, dieses char, wie 
ich zuvor beschrieb, in ein long rein zubekomme.

Autor: DerDumme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ganz toll. Muss ich erst hier schreiben um auf folgende Idee zu 
kommen:
   dhcp_lease = (*((unsigned long*)&cache.lease[0]));

durch
   dhcp_lease = HTONS32((*((unsigned long*)&cache.lease[0])));

ersetzen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.