Ich habe eine Level-2 C-Mex S-Function geschrieben, die eine aus einer Text-Datei etwas einlesen soll und je nachdem was eingelesen wurde, soll eine lineare Liste gefüllt oder geleert werden, die so am Anfang der S-Function definiert ist:
Diese Liste soll mittels eines Pointer-Work-Vectors in jedem Simulationsschritt verfügbar sein. Ausserdem werden noch Integer- und Real-Work-Vectoren benutzt.
Die Liste und die anderen Workvectoren werden nun in mdlStart initialisiert:
FILE *input_file;
long *Position;
long test;
struct T_Liste *Listenanfang;
Position = (long *)ssGetPWorkValue(S,2);
Listenanfang = (struct T_Liste *) ssGetPWorkValue(S,0);
Position = (long *)ssGetPWorkValue(S,2);
ssPrintf("Position: %p,%d\n",Position,*Position);
..... //hier passiert nur unwichtiges
fopen("input.txt","r") fseek(input_file,0,SEEK_END);
test = ftell(input_file);
if(test <= (*Position)) {
ssPrintf("Position falsch: %d, %d\n",*Position,test);
return;
} fseek(input_file,(*Position),SEEK_SET);
.... /*hier passiert auch nur unwichtiges, u.a. wird hier die Datei eingelesen, die Liste gefüllt/geleert und das ensprechende Element des Pointer-Work-Vectors auf den Listenanfang gesetzt*/
IWork[0] = ...
*Position = ftell(input_file);
RWork[2]= ... fclose(input_file);
Ich habe jetzt sehr viel Code weggelassen, weil es sonst extrem unübersichtlich würde und ich jetzt auch seit Tagen an diesem Problem sitze und die Fehlersuche auf dieses Code-Fragment einschränken konnte. Und zwar ist das Problem nun, dass *Position, wenn ich es in mdlStart ausgebe zwar 0 ist, aber in mdlOutputs ist es dann 12758404 bzw. später an anderer Stelle dann 754328. Die Ausgabe ist nämlich:
Positionstest: 0.000000,432568376
Position: 00C2A838,12758404
Position falsch: 754328, 319
und ab hier wiederholen sich die letzten zwei Zeilen, bis die Simulation abbricht.
Irgendwie machen die Pointer nicht das, was sie machen sollen, egal wie ich das Programm umschreibe. Ich hatte die Position auch schon im Real-Work-Vector gespeichert, was allerdings regelmäßige, reproduzierbare Abstürze von Simulink gab und auch dafür sorgte, dass die nicht leere Liste, die mittels Pointer-Work-Vector gespeichert wird, im nächsten Simulationsschritt trotzdem wieder NULL war.
Hat jemand eine Idee woran das liegen könnte bzw. noch besser wie ich es beheben kann ? Kann es sein, dass die Stelle, an der die Position im Speicher liegt, von den anderen Work-Vectoren oder Vector-Elementen überschrieben wird ? z.B. von dem Pointer, der auf die Liste zeigt ?
Die Anzahl der WorkVector-Elemente ist jedenfalls richtig gesetzt:
Was passiert? Es wird der Pointer auf eine lokale Variable gespeichert, d.h., nach mdlStart gibt es Position nicht mehr, und der Pointer zeigt in die "Irre".
Du musst den Speicher allozieren (und in mdlTerminate freigeben). Siehe Beispielcode in ssSetPWorkValue:
Code:
typedef struct Color_tag {int r; int b; int g;}Color;
Color *p = malloc(sizeof(Color));
ssSetPWorkValue(S, 0, p);
Dasselbe natürlich für die anderen PWork-Werte ...
Ciao,
Titus
Tjark
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 10.03.2009, 13:13
Titel:
Ja, mir ist das gleiche heute vormittag auch aufgefallen, ich hab das Brett vorm Kopf regelrecht krachen hören
Ich hab es mittlerweile behoben und bin nun wieder auf der Fehlersuche, weil es leider immer noch nicht läuft (diesmal stürzt es ganz zu Beginn der Simulation ab). Vielleicht ist es ja wieder so ein dämlicher Fehler.
Vielen Dank auf jeden Fall!
Einstellungen und Berechtigungen
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
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.