C++ Hilfe!!

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/c_hilfe_219421/page_1 - zur Vollversion wechseln!


Bunny schrieb am 06.10.2010 um 12:17

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 schrieb am 06.10.2010 um 12:44

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...


Bunny schrieb am 06.10.2010 um 13:11

@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 schrieb am 06.10.2010 um 14:01

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 schrieb am 06.10.2010 um 14:03

Hab übrigens nicht umsonst geschrieben du sollst nachlesen was unions sind und machen


Bunny schrieb am 06.10.2010 um 14:06

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 schrieb am 06.10.2010 um 14:12

Der Ansatz war mein erster Post ;)

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


Bunny schrieb am 06.10.2010 um 14:40

haha =)


Bunny schrieb am 06.10.2010 um 14:58

also ich komm trotzdem nicht weiter... bin anscheinend unfähig für c++ .....


watchout schrieb am 06.10.2010 um 15:03

naja woran hängts?


Bunny schrieb am 06.10.2010 um 15:09

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...


watchout schrieb am 06.10.2010 um 15:59

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 schrieb am 06.10.2010 um 19:14

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

}


watchout schrieb am 06.10.2010 um 19:31

Jo schaut gut aus, nur verwend bitte den [ code ] oder [ php ] Tag wenn du Code im Forum postest. ;)


that schrieb am 06.10.2010 um 20:40

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025