Dynamische Module in MuPAD und einige Fragen dazu.

09/12/2007 - 18:30 von dimwegner | Report spam
Hallo

Ich habe mir das Konzept der dynamischen Module in MuPAD angeschaut
und versuche gerade einige numerische Algorithmen in C zu
implementieren und diese dann zu einem Modul für MuPAD zu kompilieren.
Dabei habe ich einige Fragen.

1. Ich benutze MFcall, um eine Prozedur aufzurufen, die als Parameter
an meine Modul-Funktion übergeben wird, folgendermaßen:

MFcell f = MFcopy( MFarg(1) );
MFcell retval = MFcall( f, 1, xyz );

Sobald ich aber MFcall mehrmals ausführe, stürzt der MuPAD-Kernel ab
(ohne Fehlermeldung). Lösung für mein Problem ist, immer wieder vor
jedem Aufruf von MFcall "f = MFcopy( MFarg(1) );" aufzurufen, d.h. die
Variable jedes mal neu setzen. Hat vllt einer eine Erklàrung für
dieses seltsame Verhalten?

2. Ich will Funktionen, die Modul enthalten soll, in externen cpp-
Dateien auslagern und diese dann in die Haupt-Modul-Datei includen.
Das funktioniert soweit, dass das Modul kompiliert wird, allerdings
sind die eingefügten Funktionen nach dem Laden des Moduls nicht in
MuPAD verfügbar.

3. Kann man eine Prozedur, die als Parameter übergeben wurd, an einen
C-Funktionszeiger binden? So könnte man auf MFcall verzichten und
direkt in C die Funktion aufrufen.

4. Etwas allgemeinere Frage. Wie sieht es eigentlich mit der
Weiterentwicklung des Interfaces für Dynamische Module aus? Das Buch
von Andreas Sorgatz ist nicht mehr zu bestellen und wurde für die
Version 1.4 von MuPAD geschrieben, wo inzwischen schon die 4.
veröffentlicht wurde.

Vielen Dank für die Antworten im Voraus
 

Lesen sie die antworten

#1 Christopher Creutzig
11/12/2007 - 11:05 | Warnen spam
wrote:

1. Ich benutze MFcall, um eine Prozedur aufzurufen, die als Parameter
an meine Modul-Funktion übergeben wird, folgendermaßen:

MFcell f = MFcopy( MFarg(1) );
MFcell retval = MFcall( f, 1, xyz );

Sobald ich aber MFcall mehrmals ausführe, stürzt der MuPAD-Kernel ab
(ohne Fehlermeldung). Lösung für mein Problem ist, immer wieder vor
jedem Aufruf von MFcall "f = MFcopy( MFarg(1) );" aufzurufen, d.h. die
Variable jedes mal neu setzen. Hat vllt einer eine Erklàrung für
dieses seltsame Verhalten?



MFcall gibt (siehe Doku) seine Argumente frei. Du kannst z.B. Deinen
Code so schreiben:

MTcell f = MFarg(1);
int i;
for(i=1; i<10; ++i) {
MTcell ret = MFcall(MFcopy(f), 1, MFint(i));
// ...
MFfree(ret);
}

2. Ich will Funktionen, die Modul enthalten soll, in externen cpp-
Dateien auslagern und diese dann in die Haupt-Modul-Datei includen.



Der Teil mit MFUNC ... MFEND muss in der Hauptdatei stehen, und
MFreturn und noch ein paar andere, eher seltener benutzte Makros sind
auch nur dort möglich. Du kannst aber natürlich Routinen in einzelnen
anderen Dateien definieren und von der Hauptdatei aus ansprechen.

3. Kann man eine Prozedur, die als Parameter übergeben wurd, an einen
C-Funktionszeiger binden? So könnte man auf MFcall verzichten und
direkt in C die Funktion aufrufen.



Nein. Das sind Zeiger auf MuPAD-Strukturen, nicht auf C-Funktionen.

4. Etwas allgemeinere Frage. Wie sieht es eigentlich mit der
Weiterentwicklung des Interfaces für Dynamische Module aus? Das Buch
von Andreas Sorgatz ist nicht mehr zu bestellen und wurde für die
Version 1.4 von MuPAD geschrieben, wo inzwischen schon die 4.
veröffentlicht wurde.



Es hat sich kaum etwas geàndert in diesem Bereich.

if all this stuff was simple, we'd
probably be doing something else. -- Daniel Lichtblau, s.m.symbolic

Ähnliche fragen