Newsgroup: it.comp.lang.pascal
Titolo: [?] Domanda credo impossibile: eseguire funzione da variabile

Ciao a tutti,
ho una variabile A che contiene il nome di una funzione (che viene indicata
a runtime).
Esiste un modo per eseguire la funzione contenuta in A?
Ovviamente potrei fare un if ...then di tutte le funzioni possibili, ma
vorrei cercare di creare una procedura generica (l'utente digita il nome
della funzione e viene eseguita quella funzione).
Spero di essermi spiegato; secondo me è impossibile, sentiamo se invece
qualcuno mi dice il contrario...
Grazie in anticipo.

 qualcuno mi dice il contrario...
Ciao,
         non hai specificato che compilatore usi...
Se usi TP non so dirti con precisione se si possa o no...
Ti posso invece dire che, se usi un compilatore che ti permette di accedere
alle API di Win [Delphi, FreePascalCompiler ecc ecc], puoi usare la
GetProcAddress in combinazione cone la GetModuleHandle (ovviamente prima
dovrai esportare le funzioni/procedure dal tuo eseguibile utilizzando la
convenzione standard di chiamata [stdcall], alla fine sarà una cosa così:
var procedura: procedure;
       nomeProc:string;
begin
nomeProc:='NomeProceduraDaChiamare';
procedura:=GetProcAddress(GetModuleHandle(nil),pchar(nomeProc));
Procedura;
le cose si complicano se hai di mezzo i parametri... dovresti dichiarare un
tipo +o - così:
type MieProc=procedure(param1:string);
ovvio che se le tue proc richiedono un numero di parametri diverso dovrai
comunque farti un bel if .... then .... e controllare _quale_ procedura
vuole _quali_ parametri e _quanti_...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

Scusami, hai ragione, niente win (uso bp sotto Dos 6.2).
Forse quanto sotto è sostituibile inserendo codice assembler per beccare
l'indirizzo di inizio della procedura, ma non lavoro in assembler da 10 anni
e non saprei da che parte cominciare...
Grazie.

Cristiano Larghi Micronix2 <C.La...@Micronix.it> wrote in message
84suf2$jvk$1...@fe1.cs.interbusiness.it...

Non so come aiutarti...
Conosco troppo poco l'asm per darti consiglio, me la cavo meglio con le API
di Win32...


Non devi fare altro che definire un tipo funzionale o procedurale .
Es.
type procedure (var x:integer)=proc {definisce il tipo proc}
type function (x:real):real=funz {def. un tipo funzionale}
Un modo che io conosco di usare questi tipi è quello di passerli come
parametri ad altre funzioni.
Es.
type function (x:real):real=funz {def. un tipo funzionale};
function seno(x:real):real;far;
begin
   seno:=sin(x);
end;
{far indica che verrà pasato come parametro}
procedure Esempio(f:funz; x:real);
begin
   writeln(f(x));
end;
La potenza consiste nel fatto che tu puoi defire infinite funzioni di tipo
funz e usarle tutte con la stessa funzione Esempio.
begin
   Esempio(seno,2);
   Esempio(coseno,4);
    ...........
..........
.........
.
........
end.

    Esempio(coseno,4);
Eh, no... lui chiedeva come fare una cosa del tipo:
var s:string;
s:='seno';
Esempio(s,2);


Corretto, questo č ciň che sto cercando di fare (anche se temo appunto che
non sia fattibile).
Grazie comunque a Carmageddon per la risposta.