[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


Anmelden zum Antworten