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

S-Function: Work-Vectoren überschreiben sich gegenseitig ?

 

Tjark

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2009, 16:19     Titel: S-Function: Work-Vectoren überschreiben sich gegenseitig ?
  Antworten mit Zitat      
Hallo zusammen,

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:

Code:

struct T_Liste {
        struct T_Liste *y_next;
        struct T_Bedingung *x_next;
    };

struct T_Bedingung {
        char name[10];
        double wert;
        struct T_Bedingung *next;
    };
 



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:

Code:

long Position;
FILE *input_file;

input_file = fopen("input.txt","r")
ssSetPWorkValue(S,0, (struct T_Liste *)NULL);
Position = ftell(input_file);
ssSetPWorkValue(S,2, (long*)&Position);
fclose(input_file);
ssPrintf("Positionstest: %f,%d\n",*((long*)ssGetPWorkValue(S,2)),ftell(input_file));
 


In mdlOutputs passiert nun folgendes:

Code:

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:
Code:

ssSetNumRWork(S, 3);
ssSetNumIWork(S, 1);
ssSetNumPWork(S, 5);
 


Wär echt super, wenn jemand eine Lösung wüsste!
Vielen Dank schonmal im Vorraus.


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 10.03.2009, 13:39     Titel:
  Antworten mit Zitat      
Hallo,

ohne mir alles genau angeschaut zu haben, habe ich einen Verdacht:
in mdlStart steht
Code:
long Position;
...
ssSetPWorkValue(S, 2, (long*) &Position);
 

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Tjark

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2009, 14:13     Titel:
  Antworten mit Zitat      
Ja, mir ist das gleiche heute vormittag auch aufgefallen, ich hab das Brett vorm Kopf regelrecht krachen hören Wink
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!
 
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.