Verfasst am: 17.09.2010, 10:43
Titel: C-Bibliothek in Matlab einbinden
Hallo,
zur Zeit versuche ich einen Detektor mit Matlab anzusteuern. Die mitgebrachte C-Bibliothek (.dll +Header.h) lässt sich zunächst problemlos in Matlab einpflegen.
Mein Problem ist, dass die Funktionen der Bibliothek als Input- und Outputparameter teilweise Pointer benötigen. Wenn ich nun einen Pointer (Outputparameter einer Funktion) als Inputparameter einer anderen Funktion übergebe, gibt diese Funktion eine Fehlermeldung zurück: "Invalid Value" ...
Kann mir da zufällig jemand weiter helfen?? ...
Habe bereits versucht den Pointer mit libpointer zu deklarieren, funktioniert allerdings auch nicht...
habe jetzt die Headerdatei nochmal in ein mfile umgewandelt...
vielleicht erkennt man ja hier mehr... man beachte die Inputvariablen ... bedeutet 'error', dass das Format bzw der Typ der Inputvariable in Matlab nicht verarbeitet werden kann??
probieren. Es stellte sich jedoch heraus, dass das nicht geht / ich das nicht brauche, MATLAB macht das von sich aus. Im Endeffekt war der Aufruf dann einfach:
3.) Ich glaube, du brauchst die Funktion libstruct. Damit macht man aus Pointern, die man bekommt, ein MATLAB struct. Das kann man dann ganz locker verändern usw.
Entweder gibt man danach einfach dieses MATLAB struct an die Funktion zurück (wie oben beschrieben), oder dann muss man es eben doch noch mit libpointer() vorher zu nem Pointer machen... Musst du wohl leider viel ausprobieren. Hier mal nen Beispiel von Code, der so funktioniert:
Code:
p = calllib('libusb', 'usb_get_busses');
bus = libstruct('usb_bus', p);
clear p
% in einer schleife dann:
dev = libstruct('usb_device', bus.devices);
ifisempty(dev) break
end%if % usw, jetzt wieder mit dev arbeiten
Ich habe mir die komischen libpointer / structs oft in MATLAB auf der Kommandozeile angeschaut und ausprobiert, was die noch für Eigenschaften haben und wie man mit dem . und Autocomplete oder so da dran kommt. So richtig "sauber" scheint das alles nicht, aber irgendwann gehts dann _________________
@juju,
bist du weiter gekommen, ich hab genau die selbe Problematik
@linus,
hört sich soweit gut an...
bei mir ist der Fall das er laut libfunctionsview eben
"nur" einen String Array verlangt was dann folgendermaßen aussieht
ARGUMENTS(int32Ptr,uint32,cstring,uint32)
dabei sind
int32Ptr -> von vorher als Rückgabe Wert (lib.pointer) vorhanden
uint32 = 0;
cstring = ??? vorinitialisieren mit blanks?? k.A.
uint32 = 8;
Mein Problem ist, ich hab die C Syntax dieser Übergabe Werte
und wo bei mir cstring steht
ist in dieser folgendes hinterlegt:
hihi ...
ich habe es aufgegeben... ich kann dein Problem sehr gut nachvollziehen...dennoch weiß ich keine genaue Lösung...
Im Prinzip könntest du dein "PRogramm" oder was immer du auch vorhast... als C-Source Code schreiben, daraus eine MEX-File machen...und dann in Matlab verwenden... weiß nich, halte das für etwas übertrieben... ich habs jedenfalls nicht mehr weiter versucht... da ich keine wertvolle Messzeit (Diplomarbeit) verschwenden wollte...
Hab halt ein Hardware Thema und befinde mich Tag und Nacht im Layout ohne übrige Zeit für irgendwelche Code Spielerein
Bei mir gehts im übrigen speziell um die Ansteuerung des IOWarrior56 von http://www.codemercs.com (für die Forensuche...)
der Support stellt dafür eine .dll zur Verfügung welche alle nötigen Operationen des Kontrollers als Funktion beinhalten.
Gleichzeit ist übrigens auch der Source Code für die dll zugänglich.
*nachdenk*
Ist es sehr gewagt einfach nur diesen über mex zu kompilieren und im Anschluss die Funktionalität zu testen?!?
(versuche ich mal bei Gelegenheit... )
@dEliRio: Ich meine mich zu erinnern, dass cstring sehr cool von MATLAB gelöst wurde. Sprich, du konntest einfach einen MATLAB-String ganz normal übergeben... Ansonsten kann ich gerade nix neues beitragen, außer halt der Erfahrung, dass es sich einfach nur um eine gewisse Kombination aus "calllib, libpointer und libstruct" Befehlen handeln KANN. Die Frage ist halt, welche. Trickreicher Mist :-/
Trotzdem nach wie vor viel Glück natürlich!
_________________
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.