WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

C-Bibliothek in Matlab einbinden

 

juju
Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 26.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2010, 10:43     Titel: C-Bibliothek in Matlab einbinden
  Antworten mit Zitat      
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...

Danke schonmal im Voraus
Viele Grüße
Juju
Private Nachricht senden Benutzer-Profile anzeigen


juju
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 26.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2010, 16:48     Titel:
  Antworten mit Zitat      
Hallo nochmal...

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??

Code:
%  UINT WINAPI Acquisition_Init ( HACQDESC * phAcqDesc , DWORD dwChannelType , int nChannelNr , BOOL bEnableIRQ , UINT Rows , UINT Columns , UINT dwSortFlags , BOOL bSelfInit , BOOL bAlwaysOpen );
fcns.name{fcnNum}='Acquisition_Init'; fcns.calltype{fcnNum}='stdcall'; fcns.LHS{fcnNum}='uint32'; fcns.RHS{fcnNum}={'errorPtr', 'uint32', 'int32', 'error', 'uint32', 'uint32', 'uint32', 'error', 'error'};fcnNum=fcnNum+1;
%  UINT WINAPI Acquisition_SetCallbacksAndMessages ( HACQDESC pAcqDesc , HWND hWnd , UINT dwErrorMsg , UINT dwLoosingFramesMsg , void ( CALLBACK * lpfnEndFrameCallback )( HACQDESC ), void ( CALLBACK * lpfnEndAcqCallback )( HACQDESC ) );
fcns.name{fcnNum}='Acquisition_SetCallbacksAndMessages'; fcns.calltype{fcnNum}='stdcall'; fcns.LHS{fcnNum}='uint32'; fcns.RHS{fcnNum}={'error', 'error', 'uint32', 'uint32', 'FcnPtr', 'FcnPtr'};fcnNum=fcnNum+1;
%  UINT WINAPI Acquisition_EnumSensors ( UINT * pdwNumSensors , BOOL bEnableIRQ , BOOL bAlwaysOpen );
fcns.name{fcnNum}='Acquisition_EnumSensors'; fcns.calltype{fcnNum}='stdcall'; fcns.LHS{fcnNum}='uint32'; fcns.RHS{fcnNum}={'uint32Ptr', 'error', 'error'};fcnNum=fcnNum+1;
Private Nachricht senden Benutzer-Profile anzeigen
 
Linus
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 69
Anmeldedatum: 30.08.10
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 17.09.2010, 17:31     Titel:
  Antworten mit Zitat      
1.) Eine schöne Ansicht, was MATLAB genau von dir will, bekommst du mit libfunctionsview nach dem Aufruf von loadlibrary...

2.) Wenn du einer Funktion laut C Pointer übergeben musst, brauchst du dich in MATLAB darum normalerweise nicht kümmern, das geht automatisch.

Ich sollte mal einen Pointer auf nen String-Buffer übergeben, und wollte es mit:
Code:

buffer = blanks(255);
pBuffer = libpointer('cstring', buffer);
calllib(..., pBuffer, ...)
 

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:
Code:

buffer = blanks(255);
calllib(..., buffer, ...)
 


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);
        if isempty(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 Smile
_________________

RWTH - Mindstorms NXT Toolbox - free & open source
Private Nachricht senden Benutzer-Profile anzeigen
 
dEliRio
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 14.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 16:43     Titel:
  Antworten mit Zitat      
@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:
Code:

  rep.ReportID = 0;
  rep.Bytes[6] = (BYTE) value;

--> in der Argumentenliste:

  (PCHAR) &rep


Sprich, ein Pointer auf ein struct

AAAAH

jemand eine Idee?
Oder irgendjemand überhaupt meine Formulierung verstanden?
Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
juju
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 26.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 20:02     Titel:
  Antworten mit Zitat      
hihi Wink ...
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
dEliRio
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 14.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2010, 18:56     Titel:
  Antworten mit Zitat      
hehe...

dito
<< Diplomarbeit Very Happy


Hab halt ein Hardware Thema und befinde mich Tag und Nacht im Layout ohne übrige Zeit für irgendwelche Code Spielerein Twisted Evil Very Happy

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... )

viele Grüße
AS
Private Nachricht senden Benutzer-Profile anzeigen
 
Linus
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 69
Anmeldedatum: 30.08.10
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 02.11.2010, 15:09     Titel:
  Antworten mit Zitat      
@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!
_________________

RWTH - Mindstorms NXT Toolbox - free & open source
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.