[Hilfe] variable mit mehreren punkten ??



  • Brauche Hilfe...

    Wie mache ich eine Variable wo ich Zahlen und "Punkte" machen kann z.b mann kann ja komma zahlen machen
    float x=1.1;

    wie ist es aber wenn ich z.b sowas haben will

    x=1.1.1.1;

    ? 😕
    hab jetzt schon alles mögliche probiert -.-

    und kann ich nacher auch diese variable verändern mittels consolen abfrage und eingabe ?

    danke schon mal im voraus 🙂



  • abratar schrieb:

    wie ist es aber wenn ich z.b sowas haben will

    x=1.1.1.1;

    Die Frage ist eher warum du überhaupt so etwas haben möchtest. Was sollte 1.1.1.1 denn deiner Meinung nach sein?

    abratar schrieb:

    und kann ich nacher auch diese variable verändern mittels consolen abfrage und eingabe ?

    Schau dir mal std::cout und std::cin an.



  • [quote="icarus2"]

    abratar schrieb:

    wie ist es aber wenn ich z.b sowas haben will

    x=1.1.1.1;

    Die Frage ist eher warum du überhaupt so etwas haben möchtest. Was sollte 1.1.1.1 denn deiner Meinung nach sein?
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------

    In die Variable sollte eine Ip rein z.b 127.0.0.1 aber ich weiss nicht wie die da rein soll.. also standart sollte 127.0.0.1 deklariert sein und dann mit der abfrage und eingabe selber eine fesgelegt werden.. und dann auch wieder abgerufen werden kann ..

    bestimmt ist das die dümmste frage ich auf dem board und bestimmt gibt es eine ganz einfache lösung dafür aber ich bin noch anfänger und check das einfahc nicht 😕 😕
    hoffe ihr könnt mir trotzdem sagen wie ich das machen..



  • Du kannst eine IP mit Format a.b.c.d wie folgt einlesen und speichern:

    char dot;
        int a, b, c, d;
        std::cin >> a >> dot >> b >> dot >> c >> dot >> d;
        uint32_t ip = (a << 24) | (b << 16) | (c << 8) | d;
    


  • icarus2 schrieb:

    Du kannst eine IP mit Format a.b.c.d wie folgt einlesen und speichern:

    char dot;
        int a, b, c, d;
        std::cin >> a >> dot >> b >> dot >> c >> dot >> d;
        uint32_t ip = (a << 24) | (b << 16) | (c << 8) | d;
    

    danke 🙂

    könntest du mir bitte noch die letzte zeile erklären ? bzw was genau bedeutet "uint32_t ip" und die zahlen hinter den "<<" .. normal sollten doch die ersten 3 zeilen auch schon reichen oder ?



  • Bei mir steht dann : "Error: Der Bezeichner ""uint32_t"" ist nicht definiert." ... ?

    [Edited]
    ok das hab ich jetzt gefixt.

    aber jetzt hab ich ein neues problem...

    wenn ich dann

    cout << ip << endl;
    

    mache zeigt er mir eine gaaanz andere zahl ein ...



  • abratar schrieb:

    wenn ich dann

    cout << ip << endl;
    

    mache zeigt er mir eine gaaanz andere zahl ein ...

    Klar.
    icarus nutzt die Variable ip als Container.
    Die ersten 8 digits enthalten die erste Gruppe, die nächsten 8 die zweite, etc.
    Diese digits zusammengesetzt ergeben natürlich nicht deine Zahl.
    Du musst dafür die ersten 8 ausgeben, dann einen Punkt, dann die nächsten 8, einen Punkt, ...



  • uint32_t ist ein unsigned int, der genau 32 Bit gross ist (wenn du einen unsigned int hast muss dieser nicht zwingend 32 Bit gross sein, eine IP4 Adresse ist aber immer 32 Bit gross). uint32_t ist im Header <cstdint> definiert.

    Du kannst die IP auch mit a, b, c, d speichern. Ich persönlich würde eiene IP in einem uint32_t speichern. Wenn dir die Umrechnung mit den Shifts nicht klar ist, dann speicher die IP mit a, b, c, d.
    Dürfte onehin keine schlechte Idee sein für die IPs eine Klasse zu schreiben, um die ganzen Implementierungsdetails zu verstecken.



  • Klar.
    icarus nutzt die Variable ip als Container.
    Die ersten 8 digits enthalten die erste Gruppe, die nächsten 8 die zweite, etc.
    Diese digits zusammengesetzt ergeben natürlich nicht deine Zahl.
    Du musst dafür die ersten 8 ausgeben, dann einen Punkt, dann die nächsten 8, einen Punkt, ...

    Und wie würde ich das machen ?



  • okey und wie mache ich jetzt ein ":" wenn "." dot heisst, wie heisst dann ":" ?



  • abratar schrieb:

    Und wie würde ich das machen ?

    Zum Beispiel so:

    std::cout << (ip >> 24) << '.' << ((0xFF0000 & ip) >> 16) << '.' << ((ip & 0xFF00) >> 8) << '.' << (ip & 0xFF) << std::endl;
    

    Aber wie gesagt, wenn du die ganzen Umrechnungen nicht verstehst, dann kannst du ruhig die IP Adresse in den Varablen a, b, c, d speichern. Jenachdem was du vorhast kann dies genau so sinnvoll sein wie in einem uint32_t.

    Wie bereits erwähnt ist es eventuell eine gute Idee für IP Adressen eine Klasse zu schreiben. Dann brauchst du dich im Rest des Programms nicht mit diesen Implementierungsdetails herumzuschlagen.


Anmelden zum Antworten