"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C++ Hilfe!!

Bunny 06.10.2010 - 12:17 2616 24
Posts

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
Halloo Leute !

ich komm gleich mal zum wesentlichen... ich hab in der schule folgendes Beispiel aufbekommen... nur kenn ich mich eigentlich nicht wirklich aus bzw. fehlt bis jetzt noch das Verständniss dazu...

Das Beispiel:

Wiederholung Netzwerktechnik: IP-Adresse: 4 Zahlen(Bytes) bzw. 32 Bits

"Intern" werden Ip-Adressen sinnvollerweise als ein Wert (32-bit Integer ohne Vorzeichen) gespeichert. Beispiel: aus der Ip-adresse 1.2.3.4 wird die Zahl 16909060 bzw. Hexadezimal 1020304

Passende Typen (statt int bzw. unsigned int)

uint8_t 8 Bit, unsigned
uint32_t 32 Bit, unsigned

Wir verwenden den Qt Creator, somit benötigen wir die <stdint.h> im Header


Und jetzt kommen die Unterprogramme dazu... :

Schreibe folgende Unterprogramme und teste mit sinnvollen Werten im Hauptprogramm ( Ausgabe OK/Fehler)

::Umwandlung 4 Zahlen in internes Format::

uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4); // Prototyp

Tipp: operator <<

Vorschlag für Test:

if(bytes2ip(0x01, 0x02, 0x03, 0x04) != 0x01020304L)
cerr << "Fehler in Zeile" << __LINE__ << "\n";

assert (bytes2ip(192,168,1,2) == 3232235778L);



::Umwandeln andere Richtung::

void ip2bytes(uint32_t IP, uint8_t& a1, uint8_t& a2, uint8_t& a3, uint8_t& a4);


Tipp: operator &

Metatipp: Diese Funktionen kann man hintereinander aufrufen
4 Zahlen --> bytes2ip --> Zwischenergebnis --> ip2bytes --> 4 Zahlen
Test: die vorderen 4 zahlen stimmen mit den hinteren 4 zahlen überein



tja... das wärs mal fürs erste... also ich hab wirklich keine durchblick.. ich versteh zwar was man theoretisch machen sollte.. aber wie ich das umwandeln soll .. pf... da steh ich an... vlt is ja der eine oder andere so nett und kann mir dabei helfen....

lg thomas

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
naja... wenn ich die angabe nicht falsch verstanden hab ists in dem Fall wohl mit ner union am einfachsten

Code: PHP
union ipaddr {
   uint32_t longval;
   uint8_t bytes[4];
};
lies nach was union datenstrukturen machen, damit du's auch anwenden kannst ;)

"<<" bzw. ">>" sind left bzw. right shifts, schätze die meinen man soll immer 8 bit hoch shiften und dann rein ORen... halt ich aber für etwas umständlich, vor Allem beim zerteilen


Ich werd nie verstehen warum man mit C++ in Schulen anfangen muss wenn dann eh nur C verwendet wird...
Bearbeitet von watchout am 06.10.2010, 14:05 (array fix)

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
@watchout

danke mal für deine antwort... aber wie soll ich den quellcode einsetzn ?
gehört der code ins hauptprogramm oder ins erste unterprogramm?? und wie kann ich das union dann benutzen ?



ich versteh die lehrer auch nicht.. alles wird vorausgesetzt, dabei wird nix erklärt... im selbststudium kann man sich alles selber bei bringen...

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Ich glaub wenn ich dir das schreib dann mach ich glaub ich die ganze Übung für dich :p
.. Naja was solls, die andere Richtung darfst dir selbst überlegen :p

Code: PHP
typedef union {
        uint32_t longval;
        uint8_t bytes[4];
} ipaddr_t;

void toshort(uint32_t ip_in, uint8_t* ip0, uint8_t* ip1, uint8_t* ip2, uint8_t* ip3)
{
        ipaddr_t ipaddr;
        ipaddr.longval = ip_in;
        *ip0 = ipaddr.bytes[3];
        *ip1 = ipaddr.bytes[2];
        *ip2 = ipaddr.bytes[1];
        *ip3 = ipaddr.bytes[0];
}

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Hab übrigens nicht umsonst geschrieben du sollst nachlesen was unions sind und machen

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
haha, danke dir !!.. aber bei mir is das immer so.. ich brauch mal ein ansatz .. und dann werd ich schon irgendwie drauf kommen !!!

sehr nett von dir !!

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Der Ansatz war mein erster Post ;)

Obwohl ich zugeben muss dass ich auf den 4 Zeilen einen Syntaxfehler geschafft hab... *hust*

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
haha =)

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
also ich komm trotzdem nicht weiter... bin anscheinend unfähig für c++ .....

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
naja woran hängts?

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
naja weil ich einfach nicht das verständnis hab... den code den ich von dir habe ist für das unterprogramm....

so, und jetzt brauch ich einfach drei variablen im hauptprogramm definiert in die ich werte einlese , oder ? Diese werte sollen dann ins unterprogramm übergeben werden..

welchen typ sollen die variablen haben.. .int ? oder auch diesen uint8_t ?

...

EDIT: was mich interessierten würde ist mal , wie rechne ich von integer um in uint8_t bzw. hex... dann wär mir ja shcon mal geholfen...
Bearbeitet von Bunny am 06.10.2010, 15:14

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Dachte zumindest Einlesen und Ausgeben von Variablen solltet ihr im Unterricht behandelt haben?
So wie ich das aber seh verlangt die Angabe aber keine Eingabe vom Benutzer, sondern es soll nur eine Testroutine geschrieben werden.


uint8/16/32/64_t... sind Datentypen die auf allen Systemen definitiv die Anzahl Bits haben, im Gegensatz zu sagen wir int. Int hat auf einem 8 Bit Prozessor 8 Bit, auf einem 32 Bit Prozessor 32 Bit und auf einem aktuellen 64 Bit System eben 64 Bit, ähnlich verhält es sich mit long. Long ist normal 2*int (wobei ich nicht weiß ob das standardisiert is), es gibt auch long long, etc.

Bunny

Addicted
Avatar
Registered: Oct 2002
Location: Austria
Posts: 525
okay, das erste unterprogramm hab ich gelöst... es funktioniert!!


Code: PHP
#include <iostream>
#include <stdint.h>
#include <assert.h>


uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4); // Prototyp



int main()
{
    bytes2ip(1,2,3,4);
    assert(bytes2ip(1,2,3,4) == 0x01020304L);

}


uint32_t bytes2ip(uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4)
{
    return ((a1 << 24) + (a2 << 16) + (a3 << 8) + a4);

}
Bearbeitet von Bunny am 06.10.2010, 21:16

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Jo schaut gut aus, nur verwend bitte den [ code ] oder [ php ] Tag wenn du Code im Forum postest. ;)

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Für diesen Threadtitel und für die Fragestellung verdienst du eigentlich überhaupt keine Hilfe, aber ich lasse den Thread trotzdem mal offen. Bitte lies die Regeln im ersten Post vollständig durch und halte dich ab sofort daran.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz