array an DLL übergeben



  • Hallo

    Ich bins nochmal und zwar funktioniert das ganze leider immer noch nicht.

    es Stimmt immer nur der Wert, den ich auf die erste Adresse schreibe.
    Also auf mac[0], die Werte die ich auf mac[1],mac[2]... schreibe kommen nicht an

    Weiß jemand warum?

    int _stdcall Test(char* ip, int* test, int mac[])
    {
    
    	initialize b1;
    	b1.test(ip);
    
    mac[0]=b1.myIP[0];
    mac[1]=b1.myIP[1];
    mac[2]=b1.myIP[2];
    
    *test=b1.iAdapternr;
    
    return 5;
    
    }
    


  • Tupo13 schrieb:

    int mac[]

    Das geht nicht. Gib entweder die Größe an, oder benutz einen Zeiger.



  • Benutze Zeiger (da man sich sowieso nicht auf die Größenangabe verlassen kann)



  • @MFK: Was gibt das folgende Programm aus?

    #include <iostream>
    using namespace std;
    
    int foo(int bar[])
    {
    	bar[0] = 4711;
    }
    
    int main()
    {
    	int foobar;
    	foo(&foobar);
    	cout << foobar << endl;
    	cin.get();
    }
    


  • ich meinte

    void foo(int bar[])
    {
        bar[0] = 4711;
    }
    


  • @ all Danke für eure geduld

    Ich habe jetzt diese Arten versucht

    mac[], mac[3], *mac
    Aber bei allen stimmt immer nur das aller erste Element.
    Wenn ich in VB das Array dann Ausgebe stimmt immer nur das erste Element
    mac_vb[0] alle Weiteren sind 0

    Woran kann das liegen?

    Danke nochmal für eure Mühen
    Gruß Tupo13



  • Was kommt denn raus, wenn du das Array in C/C++ ausgibst?



  • Warte mal....
    du hast auf der einen Seite ein Visual Basic Array und auf der anderen Seite arbeitest du mit einem C++ Array?
    Da hab ich doch den stillen Verdacht, dass VB Array nicht gleich C++-Array ist.
    Sprich a[1] in VB wo anders hinzeigt wie a[1] in C++.



  • schorsch code schrieb:

    @MFK: Was gibt das folgende Programm aus?

    Was soll das Ratespiel? Ist dir klar, dass man diese Funktion nur mit einem Zeiger auf int aufrufen kann?



  • Wieso Ratespiel? Das war eine rethorische Frage.

    MFK schrieb:

    Tupo13 schrieb:

    int mac[]

    Das geht nicht.

    Das geht nämlich als Parameter genauso wie

    int *mac
    

    oder aber

    int mac[0]
    

    oder aber

    int mac[4711]
    
    #include <iostream>
    using namespace std;
    
    void foo1(int *bar)
    {
        bar[0] = 4711;
    }
    void foo2(int bar[])
    {
        bar[0] = 4712;
    }
    void foo3(int bar[0])
    {
        bar[0] = 4713;
    }
    void foo4(int bar[4711])
    {
        bar[0] = 4714;
    }
    
    int main()
    {
        int foobar;
        int foobars[1];
    
        foo1(&foobar);
        foo1(foobars);
        cout << foobar << endl;
        cout << foobars[0] << endl;
    
        foo2(&foobar);
        foo2(foobars);
        cout << foobar << endl;
        cout << foobars[0] << endl;
    
        foo3(&foobar);
        foo3(foobars);
        cout << foobar << endl;
        cout << foobars[0] << endl;
    
        foo4(&foobar);
        foo4(foobars);
        cout << foobar << endl;
        cout << foobars[0] << endl;
    
        cin.get();
    }
    


  • @ Spezi L
    Wenn ich Debugge schreibt er die richtigen Werte in das mac Array

    @ Mathias
    Du meinst also, dass ein Int in C++ nicht gleich Lang wie ein Int in VB ist?
    Oder wie meinst du das?
    Der erste Wert des Feldes stimmt ja und wenn ich das mit Einzelwerten int,long... mache funktioniert es ja auch



  • Ob int's die selbe Größe haben, weiß ich nicht - aber offenbar ist ein VB-Array anders aufgebaut als ein C-Array.



  • Nein, was ich meinte ist das ein C++ Array nichts anderes ist als x Variablen des angegebenen Typs hintereinander aufgereiht (z.B. x mal int).
    Dies muss in VB nicht unbedingt so sein, da kann z.B. zu jedem Eintrag zusätzliche Informationen hinter dem Eintrag abgelegt sein. Dann sind die Adressen der dem ersten Eintrag folgenden Einträge nicht identisch. (VB fragt den Wert somit an einer anderen Stelle ab als ihn C++ hingeschrieben hat.)



  • Ein VB Integer hat 2 Bytes. In VB sind Arrays eh ein wenig anders, Index beginnt bei 1, UBOUND liefert den höchsten Index zurück, und es ist auch erlaubt Arrays mit 0 Elementen anzulegen und mit ReDim größer zu machen. Wie sie im Speicher liegen, weiß wahrscheinlich nur MS selbst...



  • Damit wäre es klar. Is nix mit direkt Array übergeben...



  • @all Danke euch allen

    Jetzt ist mir einiges klarer.

    Damit wäre es klar. Is nix mit direkt Array übergeben...

    Ich weiß aber, aus einem VB-Beispielprogramm dass es so geht. Allerdings wurde dort der Datentyp Byte verwendet. -> Ich weiß aber nicht, wie der C++-Code dazu aussieht. Byte wäre in C++ wahrscheinlich unsigned char nehme ich an.

    Gruß Tupo13



  • Das ist eh schwierig, da in VB die Parameter default by Reference übergeben werden, kann aber abgeändert werden:

    FUNCTION whatever(x AS LONG, ByVal y AS INTEGER)
    'x wird by Reference übergeben, y by Value
    END FUNCTION
    


  • Ok die Lösung ist einfacher als gedacht

    ein C(++) 'int' entspricht unter Win32 einem VB 'long' (beide 4 Byte groß). Ein VB 'integer' ist nur 2 Byte groß.

    Deshalb waren die höheren Indexe stehts null oder hatten einen völlig unsinnigen Wert

    Danke Nochmal
    Gruß Tupo13


Anmelden zum Antworten