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

fprintf in MEX-Dateien

 

keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 23.11.2007, 13:05     Titel: fprintf in MEX-Dateien
  Antworten mit Zitat      
Hallo zusammen,

ich möchte gerne in einem MEX-File Daten in eine Textdatei ausgeben.

In einem normalen C-Programm ist das ja relativ einfach machbar mit:
Code:
/*...*/
double a[max];
/*...*/
FILE* fid = fopen(filename,"w");
for(i = 0; i < max; i++) {
  fprintf(fid, "%lf\n",daten[i]);
}
fclose(fid)
/*...*/
 


In eine MEX-File geht das leider nicht mehr, zumindest funktioniert es bei mir noch nicht.

Gibt es eine Möglichkeit, dieses fprintf() trotzdem einzubauen?

Viele Grüße,
k.
Private Nachricht senden Benutzer-Profile anzeigen


Olaf Naujocks

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2007, 14:32     Titel:
  Antworten mit Zitat      
Moin keloid,

ich wüsste eigentlich keinen Grund warum das nicht gehen sollte. Ich habe das soeben mal mit einer s-function probiert und das geht ohne probleme. s-functions sind nichts anderes als spezielle mex-dlls. Übersetzt werden sie auch mit dem mex compiler.

Du solltest mal Näheres zu Fehlermeldungen, verwendetem compiler usw preisgeben.

Bis denne
 
keloid
Themenstarter

Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.11.2007, 11:59     Titel:
  Antworten mit Zitat      
Hallo nochmal,

ich habe das Problem inzwischen gelöst.
Es lag offensichtlich daran, dass ich den File-Pointer nicht direkt nach dem Funktionsaufruf deklariert habe, sondern erst an der Stelle der Funktion, an der ich ihn verwenden wollte. Offensichtlich hat der Compiler, im Gegensatz zu anderen gebräuchlichen C-Compilern, ein Problem damit, wenn Variablen nicht direkt nach dem Funktionsaufruf deklariert werden.
Ich verwende übrigens den Compiler Lcc-win32 C 2.4.1, der bei Matlab R2007b dabei ist.

Um es mit einem Beispielcode darzustellen:
Code:
#include "mex.h"

void test(double *array1, double* array2, int L) {
    int i;
    mxArray *obs;
   
    obs = mxCreateDoubleMatrix(L, 1, mxREAL);
    mxDestroyArray(obs);
   
    FILE *fid = fopen("test.txt","w");
    if(!fid) {mxErrMsgTxt("Fehler beim Öffnen der Datei.");}
    for(i = 0; i < L; i++){
        array2[i] = array1[i]/2.0;
        fprintf(fid,"array2[%d] = %lf\n",i,array2[i]);
    }
    fclose(fid);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    double *array1;
    double *array2;
    int L;

    L = mxGetScalar(prhs[1]);
    plhs[0] = mxCreateDoubleMatrix(L,1,mxREAL);
   
    array1 = mxGetPr(prhs[0]);
    array2 = mxGetPr(plhs[0]);
   
    test(array1, array2, L);
}
 


So funktioniert es nicht, es gibt die Fehlermeldung:
Zitat:
Error test.c: 10 illegal use of type name `FILE'
Error test.c: 10 undeclared identifier `fid'
Error test.c: 10 operands of * have illegal types `struct _iobuf' and `int'
Error test.c: 10 operands of = have illegal types `int' and `pointer to struct _iobuf'
Error test.c: 10 lvalue required
Error test.c: 13 type error in argument 1 to `fprintf'; found `int' expected `pointer to struct _iobuf'
Warning test.c: 10 possible usage of fid before definition
6 errors, 1 warnings


Mit dem folgenden Code funktioniert es dann:
Code:
#include "mex.h"

void test(double *array1, double* array2, int L) {
    int i;
    FILE *fid;
    mxArray *obs;
   
    obs = mxCreateDoubleMatrix(L, 1, mxREAL);
    mxDestroyArray(obs);
   
    fid = fopen("test.txt","w");
    if(!fid) {mxErrMsgTxt("Fehler beim Öffnen der Datei.")};
    for(i = 0; i < L; i++){
        array2[i] = array1[i]/2.0;
        fprintf(fid,"array2[%d] = %lf\n",i,array2[i]);
    }
    fclose(fid);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    double *array1;
    double *array2;
    int L;

    L = mxGetScalar(prhs[1]);
    plhs[0] = mxCreateDoubleMatrix(L,1,mxREAL);
   
    array1 = mxGetPr(prhs[0]);
    array2 = mxGetPr(plhs[0]);
   
    test(array1, array2, L);
}
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Olaf

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2007, 14:02     Titel:
  Antworten mit Zitat      
Auch nochmal moin,

das ist ansi c standard, dass alle variablendeklarationen am Anfang der Funktion stehen muessen. Ist es wirklich so ,dass einige ander c compiler das so akkzeptieren? Oder sind das etwa doch c++ compiler. In c++ gilt diese Beschränkung der Variablendeklaration nämlich nicht.

Bis denne
 
keloid
Themenstarter

Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.11.2007, 16:20     Titel:
  Antworten mit Zitat      
Also ich habe es mit verschiedenen gcc-Compilern versucht, unter drei verschiedenen Linux-Distributionen (Suse, Gentoo, Ubuntu, wo ich nicht weiss, inwieweit sich die Compiler überhaupt unterscheiden) und mit dem gcc-Compiler von MinGW für Windows.
Der Matlab-Lcc ist somit der erste, bei dem mir das wirklich aufgefallen ist.
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 - 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.