Anfänger: Pointer an Funktion / Variable verändern



  • Abend Jungs ...

    Brauche ein paar Tips von euch. Bin wie gesagt totaler Anfänger - also für jeden Tip dankbar.

    Hier ersteinmal der CODE:

    Form1.h

    char szIPAddress;
    void IP_auslesen(char&);
    
    ...
    ...
    IP_auslesen(szIPAddress);
    

    Und hier die Funktion welche in einer anderen Headerdatei steht:

    ...
    ...
    void IP_auslesen(char &szIPAddress)
    {
    
     char *szIPAddress2;
     char hostname[255];
     WORD wVer;
     WSADATA wData;
     PHOSTENT hostinfo;
     wVer = MAKEWORD( 2, 0 );
    
    if ( WSAStartup( wVer, &wData ) == 0 )
    
    	{
    	if( gethostname ( hostname, sizeof(hostname)) == 0)
    			{
    
    			if((hostinfo = gethostbyname(hostname)) != NULL)
    
    					{
    					szIPAddress2 = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
    					}
    
    			}
    	}
    WSACleanup();
    }
    

    Hier verstehe ich einfach nicht, wie ich den Inhalt der Variable szIPAddress2 per Pointer in die Variable szIPAddresse bekommen soll. Ich hoffe ihr habt mich verstanden und könnt mir weiterhelfen 🙂

    Der Umweg über die zweite Variable ist mit Sicherheit totaler Unsinn. Nur hab ich nen riesen Brett vorm Kopf - und mir fehlen sicher einige Grundlagen.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • 👎



  • ok ich will mal nicht so sein, was willst du denn überhaupt machen? dein code ist bisher nicht wirklich verständlich. du benutzt szIPAddress2 doch gar nicht.



  • hi!

    du übergibst eine referenz auf ein einzelnes zeichen: char &szIPAddress.
    du möchtest aber nicht ein einzelnes zeichen, sondern eine zeichenkette speichern.
    also machst du folgendes:
    - definiere einen puffer außerhalb von IP_auslesen, z.b. char buf[BUFSIZ+1]={0}.
    - ändere deinen prototypen in: void IP_auslesen(char* s).
    - den puffer gibst du deiner funktion: IP_auslesen (buf).
    - prüfe, ob inet_ntoa erfolgreich war und speichere den rückgabewert:
    if ( NULL != ( szIPAddress2 = inet_ntoa ( ... ) ))
    strncpy ( s, szIPAddress2, BUFSIZ );
    else // ... Fehlerbehandung ...

    mfg,
    w.s.

    🕶



  • Also Los:

    In der Form1 einen Buffer definieren und den Prototypen wie folgt:

    char IPbuffer [16] = {0};
    void IP_auslesen(char* s);
    
    ...
    ...
    

    Was genau bedeutet hier IP_auslesen (char* s)? Ein pointer des Typs Char auf ...? einen String?

    Der Funktionsaufruf sieht wie folgt aus:

    IP_auslesen(IPbuffer);
    

    Hier die Funktionsdefinition:

    void IP_auslesen(char  *s)
    {
    
    char hostname[255];
    char *szIPAddress2;
     WORD wVer;
     WSADATA wData;
     PHOSTENT hostinfo;
     wVer = MAKEWORD( 2, 0 );
    
    if ( WSAStartup( wVer, &wData ) == 0 )
    
    	{
    	if( gethostname ( hostname, sizeof(hostname)) == 0)
    			{
    
    			if((hostinfo = gethostbyname(hostname)) != NULL)
    
    					{
    					szIPAddress2 = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
    					if ( NULL != ( szIPAddress2 = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list)))
    						{
    						strncpy ( s, szIPAddress2, 16);
    						}
    					}
    
    			}
    	}
    WSACleanup();
    }
    

    Sorry ... aber irgendwie ist der Groschen noch nicht gefallen. Wenn ich nun die Speicheradressen von s und szIPAddress2 vergleiche, fällt mir auf das diese nicht die selben sind. Wohl aber der Inhalt - die IP Adresse.

    Nur war das doch nun so gewollt, dass ich die IP Adresse in den reservierten Speicherbereich von IPBuffer schreibe ?!



  • shaun1981 schrieb:

    Was genau bedeutet hier IP_auslesen (char* s)? Ein pointer des Typs Char auf ...? einen String?

    prinzipiell ja. in diesem fall speziell ist das der zeiger auf deinen puffer, der die ip-adresse speichert.

    shaun1981 schrieb:

    Sorry ... aber irgendwie ist der Groschen noch nicht gefallen. Wenn ich nun die Speicheradressen von s und szIPAddress2 vergleiche, fällt mir auf das diese nicht die selben sind. Wohl aber der Inhalt - die IP Adresse.

    so isses. sind zwei verschiedene speicherbereiche, also auch zwei verschiedene adressen. szIPAddress2 ist die adresse des puffers, den dir inet_ntoa liefert.

    shaun1981 schrieb:

    Nur war das doch nun so gewollt, dass ich die IP Adresse in den reservierten Speicherbereich von IPBuffer schreibe ?!

    jepp! du musst die funktion natürlich auch aufrufen, ne. der funktionsaufruf IP_auslesen(IPbuffer);
    sollte dir nach rückkehr die ip in den puffer IPbuffer speichern.



  • Die Funktion wird aufgerufen via Form1. Es gibt keinen Rückgabewert der Funktion aufgrund von Void. Die IP Adresse wird bei Rückkehr in den IPbuffer geschrieben - via Return?! Soweit richtig?

    Wenn ja, müsste ich noch wissen wie ich den Inhalt von IPbuffer in eine bereits definierte Textbox hineinbekomme.

    Habe es so versucht ...

    textBox1->AppendText("lokale IP...");
    

    ... und etliche Varianten dazu ...

    hierzu ergänzend einen Tip?



  • das schreiben in den puffer passiert hier:
    strncpy ( s, szIPAddress2, 16);
    wie sieht denn der prototyp von AppendText aus ?



  • Bitte nochmal einen kleinen Schritt zurück:

    Wenn ich während des Debuggens die Variablen beobachte sehe ich folgendes (vor dem Rücksprung zur Main):

    s 0x01F5B444 "192.168.178.24" char*
    *s 49 '1' char

    szIPAddress2 0x05457064 "192.168.178.24" char*
    *szIPAddress2 49 '1' char

    IPbuffer error: identifier 'IPbuffer' out of scope

    Das Ding mit den zwei Unterschiedlichen Speicheradressen habe ich verstanden. Nun wird via strncpy (zielpointer auf s, pointer auf quelle(szIPAddress2), größe von 16) der Inhalt von szIPAddress2 in den Speicherbereich s geschrieben?

    .. und dieser repräsentiert dann den IPbuffer. Aus welchem Grund erhalte ich dann diese Fehlermeldung OUT OF SCOPE?



  • ich werde das gefühl nicht los, das du die funktion nicht richtig aufrufst.
    es muss unbedingt irgendwo die zeile: IP_auslesen(IPbuffer);
    stehen.
    sonst wird auch nichts in den puffer reingeschrieben, sondern wild in undefinierten speicherbereich.

    sollte der aufruf IP_auslesen(IPbuffer); aus welchen gründen auch immer nicht möglich sein, kannst du den IPbuffer global deklarieren, dann brauchst du auch keinen parameter für IP_auslesen, dann reicht auch ein
    void IP_auslesen(void);



  • Die Funktion wird via IP_auslesen(IPbuffer) als Event aus der Form1 heraus aufgerufen. Soweit stimmt das. Versuche es mal Global.



  • Okay ... danke dir.

    Das scheint gut auszusehen:

    IPbuffer "192.168.178.24" char[]
    szIPAddress2 0x05637064 "192.168.178.24" char*

    Allerdings sieht mir das komisch aus ...

    - IPbuffer "192.168.178.24" char[]
    [0] 64 '@' char
    [1] -76 '´' char
    [2] 6 '' char
    [3] 2 '' char
    [4] 88 'X' char
    [5] -76 '´' char
    [6] 6 '' char
    [7] 2 '' char
    [8] 104 'h' char
    [9] -76 '´' char
    [10] 6 '' char
    [11] 2 '' char
    [12] -124 '„' char
    [13] -76 '´' char
    [14] 6 '' char
    [15] 2 '' char

    Wie könnte ich das Ergebniss nun bspw. in einer MessageBox anzeigen lassen?



  • das kommt drauf an, welches string-format deine message-box erwartet. ich kenne mich mit forms nicht aus.
    gegebenfalls musst du IPbuffer umwandeln.



  • Danke für deine Hilfe ... für Heute reicht es mir erstmal. 😃



  • was für forms benutzt du, vb? c#?



  • winapi scientist schrieb:

    was für forms benutzt du, vb? c#?

    Ehm, hier ist WinAPI Forum... warum also .NET?

    Wie könnte ich das Ergebniss nun bspw. in einer MessageBox anzeigen lassen?

    > http://msdn.microsoft.com/en-us/library/aa363362.aspx
    > http://msdn.microsoft.com/en-us/library/ms645505.aspx

    Simon



  • schonmal textBox1->AppendText in einer winapi funktion gesehen? 🤡

    theta schrieb:

    winapi scientist schrieb:

    was für forms benutzt du, vb? c#?

    Ehm, hier ist WinAPI Forum... warum also .NET?
    Simon



  • Irgendwie werde ich das Gefühl nicht los, das es hier Leute gibt, die förmlich danach suchen, andere auf soetwas hinzuweisen. Habt ihr nichts besseres zu tun? Ich bitte hier lediglich um Hilfe - und wer mir nicht antworten möchte soll es doch lassen.

    Ein einfacher Hinweis wie "Bitte ins API Forum posten" reicht mir allemal.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten