array an DLL übergeben
-
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 0Woran 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 *macoder 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