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

mex-File

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 13:47     Titel: mex-File
  Antworten mit Zitat      
Hallo,

ich schreibe gerade an einem mex-file
Code:

 for(n=0;n<=laenge;n++)                                                                                            
             {
              x[n]=(x0+n*step*-cos(Theta));                                                                            
              y[n]=(y0+n*step*sin(Theta));      
             
             }
           
  /* Allocate storage place for the result */
  plhs[0]=mxCreateDoubleMatrix (1,laenge, mxREAL);
  plhs[1]=mxCreateDoubleMatrix (1,laenge, mxREAL);
 
/* Store return value */
  *(mxGetPr(plhs[0]))=x;
  *(mxGetPr(plhs[1]))=y;

 

Aber bei der Ausgabe bekomme ich den Fehler:

operands of = have illegal types `double' and `pointer to double'

für: *(mxGetPr(plhs[0]))=x; Ich hab auch x richtig vorbelegt. D.h. ich dachte ich kann so alle Berechnungen an Matlab ausgeben lassen. Aber anscheinend passt was mit der Zuweisung nicht? Was ist flasch?

Besten Dank


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.08.2010, 16:14     Titel: Re: mex-File
  Antworten mit Zitat      
Hallo Anonymous,

ich glaube, der Compiler kann mit dem komischen Kästchen nichts anfangen :-)
Ein weiteres Beispiel für verwirrende Darstellung in der Code-Umgebung.

Zitat:
Code:
x[n] = (x0+n*step*-cos(Theta));
*(mxGetPr(plhs[0]))=x;


"x[n]" beudeted, dass "x" ein Pointer auf ein DOUBLE Array ist.
"*(mxGetPr(plhs[0]))" ist der Inhalt des ersten Elements der Daten von "plhs[0]". Du kannst aber nicht ein DOUBLE Element mit einem Pointer auf ein DOUBLE belegen, wie die Fehlermeldung klar sagt.
Wahrscheinlich meinst Du:
Code:
x[n] = (x0+n*step*-cos(Theta));
*(mxGetPr(plhs[0]))=*x;

Damit hast Du aber nur das erste Element kopiert. Falls Du das ganze Array kopieren möchtest, nimm "memcpy". Meistens ist es aber effizienter, Du erstellst das Ausgabe-Array zuerst und schreibst dann gleich in mxGetr(plhs[0]) rein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 16:34     Titel:
  Antworten mit Zitat      
Damit bekomme ich diese Fehlermeldung

Error koor.c: 39 operands of + have illegal types `pointer to int' and `double'
Error koor.c: 39 type error: pointer expected
Error koor.c: 40 syntax error; found `y' expecting `;'
Error koor.c: 40 operands of + have illegal types `pointer to int' and `double'
Error koor.c: 40 type error: pointer expected
5 errors, 0 warnings
Code:

for(n=0;n<=laenge;n++)                                                                                            
             {
              x[n]=(x0mat+n*step*-cos(Theta))                                                                          
              y[n]=(y0mat+n*step*sin(Theta));      
             
                       
//-------------------------------------------------------------------------        
             
                        /* Allocate storage place for the result */
                        plhs[0]=mxCreateDoubleMatrix (1,laenge,mxREAL);
                        plhs[1]=mxCreateDoubleMatrix (1,laenge,mxREAL);
 
             

           /* Store return value */
          *(mxGetPr(plhs[0]))=memcpy(x);
          *(mxGetPr(plhs[1]))=memcpy(y);
             }
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.08.2010, 16:59     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Anonymous hat Folgendes geschrieben:
Damit bekomme ich diese Fehlermeldung
Error koor.c: 39 operands of + have illegal types `pointer to int' and `double'
Error koor.c: 39 type error: pointer expected
Error koor.c: 40 syntax error; found `y' expecting `;'
Error koor.c: 40 operands of + have illegal types `pointer to int' and `double'

Du traust uns ja eine Menge zu: Woher könnte ich wissen, welches die Zeilen 39 und 40 sind?
Die Fehlermeldung sagt Dir, dass Du versuchst in diesen Zeilen eine DOUBLE value und einen Pointer auf einen INT Wert zu addieren. Das geht natürlich nicht.
Du musst in C die Typen der Variablen genau kontrollieren und darfst nicht Pointer und Werte mixen.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 17:04     Titel:
  Antworten mit Zitat      
Hallo Jan,

sorry, hab vergessen dazu zu schreiben woher der Fehler kommt.
Es bezog sich auf die letzten beiden Zeilen:
/* Store return value */
*(mxGetPr(plhs[0]))=memcpy(x);
*(mxGetPr(plhs[1]))=memcpy(y);
dachte so kann ich die Werte für x und y reinkopieren und meine Werte zurück an Matlab zu schicken. Leider nein...
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.08.2010, 17:24     Titel:
  Antworten mit Zitat      
Hallo Gast,

ja, das ist kein gültiger C-Code.
Matlab liefert ein paar Beispiele mit (matlabroot/extern/examples), und in den FileExchange Seiten gibt es viele sehr schöne C-Mex-Beispiele, von denen man sich einiges anschauen kann:
http://www.mathworks.com/matlabcentral/fileexchange/

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2010, 20:35     Titel:
  Antworten mit Zitat      
Keine Hilfe?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.08.2010, 00:08     Titel:
  Antworten mit Zitat      
Hallo Gast,

helfen können wir, wenn Du eine Frage stellst.
Ich denke mir gerne eine Lösung aus, aber mir auch eine Frage auszudenken ist bestimmt nicht effizient.

Code:
*(mxGetPr(plhs[0])) = memcpy(x);

Das sieht aus, als würden Dir die Beispiele weiterhelfen. Ein C-Tutorial wäre wohl auch hilfreich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 13:25     Titel:
  Antworten mit Zitat      
Die Zips aus dem File Exchange kann ich leider nicht öffnen. Hab nichts um welche zu anzuschaun und exe.Datein kann ich nicht/darf ich nicht herunterladen.

Etwas weiter bin ich aber dennoch:

memcpy(*(mxGetPr(plhs[0])),*x[i],sizeof(double[laenge]))
memcpy(*(mxGetPr(plhs[1])),*y[i],sizeof(double[laenge]))

Zumindest sollte die Zuweisung für memcpy in etwa so sein... in etwa... Fehelr kann ich gerade nicht dazuschreiben, weil Matlab noch etwas anders rechnet.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.08.2010, 17:03     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Wenn Dein Institut/Arbeitgeber möchte, dass Du mit Mex-Files arbeitest, sollte er Dir eine Zip-Funktion zur Verfügung stellen. Da das in WindowsXP (und neuer natürlich) und MacOS bereits eingebaut ist, vermute ich, Du arbeitest auf einer Linux-Maschine mit einem betagteren System.

Exe-Dateien gibt es zum Glück in der FEX nicht.

Zitat:
Code:
memcpy(*(mxGetPr(plhs[0])),*x[i],sizeof(double[laenge]))

Das ist schon etwas besser. Trotzdem wird es Deine Maschine abschmieren lassen. Es wäre allemal effizienter, in die Beispiele von Matlab reinzuschauen - ich finde da z.B. 10 Datein, die "memcpy" enthalten. Ich könnte auch mit vielen Tips einen C-Kurs nicht ersetzen. In dieser Zeile stecken alleine schon 3 Fehler, die jeweils einen Crash erzeugen werden. Und C ist wirklich keine Sprache, mit der man sich schrittweise an ein laufendes Programm heranraten kann. C ist einfach richtig tückisch.

Obwohl ich eindeutig vermute, dass es die Probleme nicht beheben wird:
Code:
memcpy(mxGetPr(plhs[0]), x, laenge * sizeof(double));

Dies kopiert den Inhalt des Arrays x in die Daten des Ausgabe Arrays.

Viel Erfolg und Geduld, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 19:56     Titel:
  Antworten mit Zitat      
vielen Dank Jan!!!
 
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 - 2024 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.