array an DLL übergeben



  • @Mathias: Was gibt das folgende Programm aus?

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


  • Tupo13 schrieb:

    Das mit der Namensgebung habe ich noch nicht so richtig raus,
    Weiß jemand ob es irgendwo einen Übereinkunft für die Namen gibt?
    Ich meine jetzt Klein-Groß Schreibung, Integer immer mit kleinem i beginnen...

    In C++ nicht. Es gibt verschiedene Notation, z.B. die ungarische von Microsoft.



  • Mathias schrieb:

    Abgesehen davon, dass du das Array per Value übergibst und nicht per Referenz.

    Arrays werden immer by reference übergeben.

    Tupo13 schrieb:

    Das mit der Namensgebung habe ich noch nicht so richtig raus,
    Weiß jemand ob es irgendwo einen Übereinkunft für die Namen gibt? Ich meine jetzt Klein-Groß Schreibung, Integer immer mit kleinem i beginnen...

    Solche Konventionen sind mehr oder weniger willkürlich, da gibt es viele unterschiedliche Ansichten. Aber darum geht's hier gar nicht. Du hast eine Klasse, die den Namen einer Tätigkeit hat. Das ist vom Design her fragwürdig, weil Klassen eher Dinge repräsentieren, keine Tätigkeiten.



  • @MFK
    @schorsch code
    Danke für die Korrektur. 🙂

    Ich arbeite so häufig mit Arrays, dass ich das schon wieder vergessen hatte. Mit Arrays zu hantieren ist ziemlich unschön (deshalb mach ich das auch so extrem häufig), da dass Wissen über die Größe der Arrays nur der Programmierer kennt oder sie weitergereicht werden muss. Das ist extremst gefährlich....
    😞

    Nicht umsonst hat MS bei ihrem neuen Compiler alle Funktionen, die auf Arrays arbeiten um Parameter für die Größe erweitert.



  • 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


Anmelden zum Antworten