appel de fonction

Répondre
Partager Rechercher
Salut a vous,

voila, j'ai une serie de fonction type :

Code PHP:

object GetObject1(object oPNJ);
object GetObject2(object oPNJ);
... 
et je voudrais les appeler dans un script de la maniere suivante :

Code PHP:

int iNum 1;
object oPC GetPCSpeaker();
object oPNJ OBJECT_SELF;
SetLocalObject(oPC,"objet",GetObject(iNum)(oPNJ)); 
Mais, ca ne fonctionne pas. Je sais qu'il existe pour les scripts la commande executescript() mais elle ne convient pas ici. Il n'y aurait pas son equivalent pour les fonctions ? (Au pire, je peux tjs me demerder avec des if()..., mais bon, c'est lourd et le nombre de fonction GetObject(Numero) est tres grand.)

Merci pour vos reponses,

Prince Nexus
Malheureusement il n'y a pas encore de pointeur vers des fonctions en NWSCRIPT .

Voilà ce que tu pourrais faire:
en plus des fonctions que tu as déjà définies ajoute:
Code:
 

object GetObject(int i, object oPNJ)
{
     switch(i)
     {
           case 1:
                 return GetObject1(oPNJ);
           case 2:
                 return GetObject2(oPNJ);
           // etc

           default:
                 SendDebug("GetObject(i, PNJ): i est incorrecte");
                 return OBJECT_INVALID;
     }
}
SendDebug est bien sûr optionnelle, tu pourrais l'avoir défini comme étant:
SendMessageToPC(GetFirstPC(), szMessage);
Mouarf, c'est bien ce que je craignais... Merci Pom-Pom, je vais adopter ta solution. Euh sinon, ils ne prevoient pas d'en creer un, pointeur vers les fonctions, les Biowaresmen ? (ce serait tout de meme bien utile !)
Oh non, y a déjà assez de bug comme ça sans donner à l'utilisateur la possibilité de tout casser. Un pointeur c'est une adresse mémoire, je sais pas trop pourquoi je parlais de ça d'ailleurs, sinon pour faire le malin...
Mais je pense que la solution en question est bonne. Tu as un minimum de perte processeur: un appel de fonction, et un switch, très rapide. Et tu n'as qu'à définir cette fonction une fois.
C'est vrai, les pointeurs sont vitaux dans des languages élaborés ou tu ne peux pas te permettre de dupliquer 36 fois une valeur

Mais là, c'est vraiment pas utile, vraiment.
On peu même simplifier la solution au-dessus :

Code PHP:

object GetObject(int iobject oPNJ)
{
     switch(
i)
     {
           case 
1:
                 
// trucmuche
           
case 2:
                 
// bla bla
     
}

Je vois pas où est le problème.
Et puis maintenant que j'y repense : ce que Prince Nexus proposait, c'était vraiment un pointeur ? Moi j'aurais plutôt dit que c'était une espèce de bidouille pour gagner du temps
D'ailleurs je n'ai jamais rencontré ça : normalement les premières parenthèses encadrent les arguments, rien d'autre.
A la limite :
Code PHP:

GetObject[iNum](oPNJ
Mais là encore, je ne vois vraiment pas de quel langage ça pourrait être inspiré.
bon c'est vraiment parce que tu le demandes
ceci est valide en C:
Code:
void foo1(char* message)
{
	printf("foo1: %s\n", message);
}
void foo2(char* message)
{
	printf("foo2: %s\n", message);
}

typedef void (*FOO)(char*);

FOO foo (int i)
{
	switch(i)
	{
		case 1:
			return foo1;
		case 2:
		        return foo2;
	}
	printf("erreur: foo%d n'est pas definie, utilisera foo1\n", i);
	return foo1;
}

int main(void)
{
	foo(1)("message");
	foo(2)("message");
	foo(3)("message");
        return 0;
}
résultat affiché:
foo1: message
foo2: message
erreur: foo3 n'est pas définie, utilisera foo1
foo1: message

je reconnais que l'on y gagne pas grand chose (i.e. rien), mais ça a le mérite d'être rigolo..

Pour ce qui est d'enlever le default c'est pas une bonne idée, il faut que ta fonction retourne quelque chose dans tous les cas (tu peux aussi retourner à l'extérieur du switch comme dans foo ci-dessus, cela revient au même), si l'appel est incorrecte un message d'erreur est le bien venu aussi, ça fait gagner du temp au débuggage. En C, on l'elliminerait de la compilation finale par un #ifdef , malheureusement cela n'existe pas en NWSCRIPT (pas même avec les extensions du compilateur de Torlack je crois).

PS:
Ce n'est valide que depuis la norme ANSI machin (je ne sais plus laquelle)

avant, notamment en K&R, les appels par pointeur vers une fonction devaient se faire ainsi:
(*foo(1))("message");
maintenant les deux sont valides
Donc si tu utilises un compilateur nostalgique tu auras peut-être un problème .
Ah merci, je comprend mieux (enfin plus ou moins à vrai dire mais bon)
Ma connaissance du C laisse un peu à désirer

Enfin quoiqu'il en soit, ce genre de chose est totalement inutile et inconcevable dans le NWscript D'abord pas de pointeurs, et surtout pas de typedef.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés