Pointer Problem / gethostbyname / Winsock



  • hi,

    bei folgendem code

    int get_ip(){
    char ho_name[25];
    int *ptr_name = &ho_name;
    int *ptr_2;
    char inf1[25];
    gethostname(ptr_name,25);
    ptr_2 = gethostbyname(ptr_name);
    printf("pointer 2 ist dezi: %d\n", ptr_2);
    inf1 = ptr_2->h_name;
    //printf("pointer 2 ist hname: %s\n", inf1);
    printf("host name: %s", ho_name);
    getch(0);
    return 0;}
    

    spuckt der compiler folgende Fehlermeldung aus bei der Zeile inf1 = ptr_2->h_name; :

    Pointer to structure required on left side of -> or ->*

    Aber ich habe doch nen Pointer davor... jedenfalls giebt der mir nen Wer aus der Verdammt nach Zeiger aussieht wenn ich ptr_2 printe !

    freu mich auf Antworten 🙂

    greetz,
    Ole



  • Zum glück können wir alle lesen: "Pointer to a structure required" schau dir mal den Datentypen von Ptr_2 an.

    -junix



  • WO steht das ?



  • Achso, jetzt versteh ich was du meinst. Jo, aber es ist doch ein zeiger auf eine Struktur, und zwar die, die gethostbyname zurückgeliefert hat.

    aber ich mach das jetzt trotzdem anders, mach erstmla ne struktur, auf die erstell ich dann nen zeiger, und dann sortiert gethostbyname das ja vielleicht von alleine in die einzelnen Struktur elemente.



  • int *ptr_2;
    

    Soso... ein Zeiger auf eine Struktur.... Statt Copy-Paste Programmierung solltest du vielleicht die Quelle mal überarbeiten... Oder dir mal grundsätzliche C/C++ Tutorien zu Gemüte führen...

    -junix

    [ Dieser Beitrag wurde am 02.12.2002 um 20:37 Uhr von junix editiert. ]



  • das ist nicht copy und paste !

    Aber trotzdem, warum kann in einer int Zeigervariable keine Adresse gespeichert werden die auf eine Struktur zeigt ? genug platz ist doch drin, in der Variable !
    aber wahrscheinlich haben strukturen mehrere Adressen... gell ?



  • ok ok... ich hab jetzt so ne struktur...:

    typedef struct cominfo{
             char name[20];
             char alias[20];
             short a_typ;
             short a_len;
             char s_IP[16];
             }info;
    

    aber wie man nun nen Zeiger auf die Struktur macht weiß ich nicht, hab schon vieles Probiert (aus tutorials). Ich meine, wenn ich jetzt nen Zeiger auf die Struktur mache, dann weiß gethosbyname immer noch nicht, wo es die daten reinpacken soll. woher sollte es.

    also, wäre cool wenn mir jemand sagen kann, wie ich nen funktionierenden Zeiger auf die oben gezeigte struktur erstelle. Nur ein kleines Beispiel... büdde
    🙂



  • gethostbyname(); liefert übrigens einen Zeiger auf eine Struktur zurück... und ich möchte eigentlich nur an die daten rankommen die in dieser Struktur (auf die gezeigt wird) gespeichert sind.



  • Du hast ein grundsätzliches C-Verständnisproblem. Eine Struktur ist ein Typ wie int und andere auch... auf Typen kann man Zeiger setzen... nun überdenk deinen Code nochmal. Die Struktur die du erstellt hast, ist allerdings nutzlos, da sie ja bereits definiert wurde.

    -junix



  • struct cominfo{
        char name[20];
        char alias[20];
        short a_typ;
        short a_len;
        char s_IP[16];
      };
    
    // irgendow im Programm
    cominfo* ainfo=new cominfo;
    ainfo->Name="jklj";
    ainfo->atyp=2;
    //...
    


  • :p
    war schneller 🙂



  • Was zum Teufel habt ihr nur mit euren selbst erstellten structs?
    Aus der WinSock 2-Hilfe:

    gethostbyname returns a pointer to a hostent structure. The contents of this structure correspond to the hostname name.

    Also brauchts doch nur einen Zeiger vom Typ hostent?

    -junix



  • joh,
    oder so halt eben. 🙂



  • yo, thanx,

    aber den zeiger auf hostent wollte ich nicht benutzen, weil in der hilfe auch steht, das man von den daten eine Kopie anfertigen soll, und sie dann erst benutzen soll.



  • The contents of this structure correspond to the hostname name.<<<

    den satz verstehe ich nicht... wie kann man zu einem namen korrespondieren ? warum zweimal name hintereinander, hätte nicht einmal hostname gereicht ?



  • AUSSERDEM junix....

    wenn ich einen zeiger vom typ hostent erstelle, also so:

    hostent * info;

    und dann :

    info = gethostbyname();

    mache, wohin gehen die daten denn dann die returned werden ? die müßten doch dann eigentlich dahin gehen, wo hin der Zeiger zeigt - aber der Zeigt ja auf das, wo es her kommt... das wäre dann ja ein loop. Ohne das ich an die daten rankomme.

    Ich schreibe das nur, damit du mal merkst wieviel Fragen man sich zu sowas stellen kann. ...bevor man sich das richtige denkt...



  • ...und andreas... new kann ich nicht benutzen, da ich in c und nicht c++ programmiere.



  • Gut, dann stellt sich allerdings die Frage was du im C++ Builder-Forum machst. new unter C = malloc() um die Struktur zu kopieren verwendet man memcpy() und ich würde dir echt empfehlen ein C-Tutorial zu lesen.

    -junix



  • ich dachte in diesem forum geht es hauptsächlich um das Borland in dem titel... da der Borland C++ Compiler ja auch c kann, dachte ich, das wäre hier eigentlich ganz richtig, naja.

    tutorials hab ich schon viele gelesen, naja, das mit memcpy und so hab ich noch ausgelassen. wüßte nicht was ich mit nem tutorial soll..... dann besser etwas das sich ausführlich mit einem Thema beschäftigt. Grundlagen sind mir bewußt. jedenfalls denke ich das 🙂 ob ich richtig denke, zeigt sich dann ja erst wenn ichs auch anwende...



  • Fragen zum Freeware Compiler, "Borland C++" etc. bitte nach Andere Compiler.

    kommt dir diese Zeile bekannt vor? (Steht irgendwo oben in der Threadübersicht dieses Forums)

    Grundlagen sind mir bewußt. jedenfalls denke ich das 🙂

    Falsch gedacht... Bestimmt sind dir die Grundlagen nicht bewusst, wenn du einen int-Zeiger als Zeiger auf eine Struktur benutzen willst und dann noch was von "genügend Platz" erzählst...

    ob ich richtig denke, zeigt sich dann ja erst wenn ichs auch anwende...

    Es hat sich gezeigt, du hast falsch gedacht, also zurück auf Start (-;

    Ich denke ich schieb dich mal nach Andere Compiler...

    -junix

    [ Dieser Beitrag wurde am 03.12.2002 um 08:22 Uhr von junix editiert. ]


Anmelden zum Antworten