[C/Matlab] Daten richtig auslesen
-
Hallo Leute ich stecke zz bei einem 'kleinen' Problem fest welches mich daran hindert meine Arbeit abzuschließen.
Es geht um folgendes:
Hier ein Screenshot meiner Daten (Variablennamen und Stringinhalt habe ich zwecks Datenschutzgründen unkenntlich machen müssen)
[IMG]http://www.img-hosting.de/thumb/15788forum_screenjpg[/IMG]
Ich soll diese Daten auslesen und habe das über C geregelt.
Hier mein Code.
Vorher habe ich die Variablen ausgelesen und von jeder Variable die Headerinformationen in ein mxArray pa gespeichert.
Der ganz folgende Block befindet sich in einer FOR-Schleife welche alle Variablen durchgeht..... pa = matGetNextVariableInfo(pmat, &varName); .... .... for(j=0;j<fields;j++) { //save Fieldname fieldName = mxGetFieldNameByNumber(pa,j); //save fieldvalue da = mxGetField(pa,0,fieldName); printf("Fieldname: %s , Fieldnumber: %i ", fieldName, j); //check if it is a string a number or a matix... if (mxIsChar(da)) { // Bekomme keinen String zurück-------------------- // Bei String str = empty, bei anderen Daten str = <null> str=mxArrayToString(da); printf(", Fieldvalue: %s \n", str); } else { // Wie finde ich heraus ob es ein Feld / Integer oder andere Daten sind?----- if (mxGetM(da)==0 && mxGetN(da)==0) printf(", []\n"); else if (mxGetM(da)==1 && mxGetN(da)==1) printf(", Number: \n"); else printf(", Array: [%dx%d] \n", mxGetM(da), mxGetN(da)); } //Deallocates memory mxDestroyArray(da); }
Das Problem könnt ihr aus dem Code schon auslesen, aber ich schreibe es hier nochmal konkret hin:
Ich versuche mir den Feldinhalt auszulesen und speichere diesen in ein mxArray
da = mxGetField(pa,0,fieldName);
Danach überprüfe ich ob es sich um einen String handelt oder doch nur um eine Zahl / Matrix etc
if (mxIsChar(da)) {...
So weit so gut.
Wenn es sich nun um einen String handelt würde ich diesen gerne ausgeben.. (str is mit char* deklariert)str=mxArrayToString(da); printf(", Fieldvalue: %s \n", str);
Das Problem hier ist das er mir nichts zurückgibt.. also einen leeren String.
Ergebnis:
[IMG]http://www.img-hosting.de/thumb/15789forum_screen_2jpg[/IMG]
Also lautet meine Frage an euch, wie ich mein Programm dazu bekomme mir den wahren Inhalt auszugeben?....
Ich hoffe es ist ein erfahrener Programmierer unter euch der mir helfen kann. Ich würde mich sehr über eine Antwort freuen.
mfg, Ralph
-
Evtl. liegt der Fehler auch in mxIsChar() oder mxArrayToString(). Poste doch mal die beiden Funktionen.
-
die mxIsChar und mxArrayToString sind aus der Matlab Header und folgends definiert:
/* * Determine whether the given array contains character data. */ EXTERN_C bool mxIsChar(const mxArray *pa);
bzw.
/* * Create a NULL terminated C string from an mxArray of type mxCHAR_CLASS * Supports multibyte character sets. The resulting string must be freed * with mxFree. Returns NULL on out of memory or non-character arrays. */ EXTERN_C char *mxArrayToString(const mxArray *pa);
Das mcIsChar funktioniert funktionsgemäß und selektiert die Nicht Strings von den Strings..
Das es vielleicht an der der mxArrayToString liegt glaub ich auch fast, aber wieso weis ich halt nicht
-
So ich/(wir) haben nach langem hin und her endlich die Lösung gefunden..
Ich geb sie hier Preis falls es in naher Zukunft jemand geben sollte der sich hier nicht durchsieht 8-).
ich lese mir die Anzahl an Variablen und die Namen selber aus..
int ndir=0; char **varNames; varNames = matGetDir(pmat, &ndir);
danach hole ich mir die Informationen wiefolgt
pa = matGetVariable(pmat, varNames[varIndex]);
varIndex läuft von 0 bis ndir
Und der Rest funktioniert wie oben.
mfg Ralph