Schrift
[thread]6669[/thread]

(Referenzen auf) CVs per Hand erzeugen: geht das? geht das in purem Perl? (Seite 2)



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
murphy
 2005-01-29 02:42
#51383 #51383
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@betterworld: Siehst du schon richtig -- allerdings hatte ich es zunächst nicht für ein Problem gehalten, da es das auch in diversen anderen Skriptsprachen nicht ist.
When C++ is your hammer, every problem looks like your thumb.
esskar
 2005-01-29 10:57
#51384 #51384
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmmm...
du kannst ddoch jedem funktionspointer unendliche viele parameter mitgeben; ob die eigentliche funktion damit fertig wird, ist ne andere frage....
murphy
 2005-01-29 14:12
#51385 #51385
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@esskar: Ich kann nicht auf jeder Architektur einer Funktion beliebig viele Parameter mitgeben, die sie gar nicht will. Das mag vielleicht unter ix86-Linux funktionieren, ist aber eindeutig als übler Hack einzustufen. Ich weiß auch, dass es unter ix86-Win32 nicht funktioniert.

Zum Beispiel könnte die im System verwendete Aufrufkonvention so etwas verbieten, oder der Kernel könnte aus Sicherheitsgründen ein solches Vorgehen abfangen, etc.

Abgesehen davon, hast du, glaube ich, den Kern des eigentlichen Problemes gar nicht verstanden: Es ist einfach nicht möglich, in Standard C, C++ oder XSUB eine Funktion zu schreiben, die einen Funktionszeiger mit variabel vielen und variabel typisierten Argumenten aufruft, wobei beide Variablen erst zur Laufzeit bestimmt werden. C-Compiler kennen einfach keine Konstrukte, um so etwas auszudrücken. Selbst die Features von <stdarg.h> benötigen auf der Aufruferseite zur Kompilationszeit das Wissen über Anzahl und Typ der Parameter und auf der aufgerufenen Seite besonderen Code, weshalb dieser Mechanismus auch nicht nachträglich einbaubar ist, wenn man die vorhandenen Funktionen nicht ändern kann.

Wenn man also nicht das ganze Problem für alle existierenden Architekturen und Betriebssysteme von Hand in Assembler lösen will, gibt es meines Wissens nur einen wirklich portablen Ansatz und das ist die besagte libffi, die als Anhängsel zum GCC entwickelt wird. Auch diese Bibliothek greift natürlich auf Assemblercode zurück, aber da muss man sich die Arbeit nicht mehr selber machen, weil die GCC Entwickler schon so freundlich waren...
When C++ is your hammer, every problem looks like your thumb.
esskar
 2005-01-29 17:42
#51386 #51386
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay...jetzt weiß ich was du meinst.... und was dein problem ist.
esskar
 2005-01-29 19:43
#51387 #51387
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
typedef int(*func)(void *, ...);

int main(int argc, char *argv[])
{
func pointer = 0;

(pointer)(0, "a", "b", "c");

return 0;
}


bringt auch nix, oder?\n\n

<!--EDIT|esskar|1107020661-->
esskar
 2005-01-29 19:51
#51388 #51388
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nein, tut es nich6t...
bleibt ja alles statisch :)
kabel
 2005-01-30 16:40
#51389 #51389
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
[quote=murphy,29.01.2005, 01:42]@betterworld: Siehst du schon richtig -- allerdings hatte ich es zunächst nicht für ein Problem gehalten, da es das auch in diversen anderen Skriptsprachen nicht ist.[/quote]
welche?
-- stefan
murphy
 2005-01-30 18:02
#51390 #51390
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=kabel,30.01.2005, 15:40][quote=murphy,29.01.2005, 01:42]@betterworld: Siehst du schon richtig -- allerdings hatte ich es zunächst nicht für ein Problem gehalten, da es das auch in diversen anderen Skriptsprachen nicht ist.[/quote]
welche?[/quote]
Sicher weiß ich es von newlisp und guile. CHICKEN, Python und Java (zumindest mit der GNU Java Bibliothek) können es, glaube ich, auch.

Aber ich wollte ja keine anderen Sprachen propagieren -- ich wunderte mich nur, dass Perl mal etwas nicht kann, was nicht mit meinem lieblings Steckenpferd für fehlende Features (Continuations) zu tun hat ;)
When C++ is your hammer, every problem looks like your thumb.
kabel
 2005-01-30 19:19
#51391 #51391
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
hmm. ich kann im guile reference manual nichts dazu finden ...
es gibt zwar ne section über dynamic linking, aber das hält sich ziemlich stark an die C ld api.
oder heisst die nötige funktion zufällig gh_new_procedure? gh ist aber deprecated ...

ich möchte das problem noch einmal rekapitulieren, um zu sehen, ob ichs wirklich verstanden habe:
- irgendwo in deinem perl code hast du eine pointer variable auf eine funktion
- du kennst die signatur + abi
- das alles steht erst aber zur laufzeit zur verfügung.
- du suchst einen weg das ganze schön in perl aufzurufen.
-- stefan
murphy
 2005-01-30 21:18
#51392 #51392
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@esskar: Richtig. Da der Code, den ich da gerade zusammenschustere aber sowieso XSUBs enthält, werde ich das ganze nun mit Hilfe der libffi lösen.

edit: Unter guile ging das mit G-Wrap -- habe ich aber schon ewig nicht mehr verwendet.\n\n

<!--EDIT|murphy|1107112878-->
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-01-27 19:35.