JeuxOnLineForumsPlusCréer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Répondre
Partager Outils Rechercher
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de Prince Nexus
 
Question

Appel de fonction

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
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
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);
Lien direct vers le message - Vieux
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de Prince Nexus
 
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 !)
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
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.
Lien direct vers le message - Vieux
Avatar de Taern
Taern
Alpha & Oméga
 
Avatar de Taern
 
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.
Lien direct vers le message - Vieux
Avatar de Taern
Taern
Alpha & Oméga
 
Avatar de Taern
 
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é.
Lien direct vers le message - Vieux
Sire Pom-pom
Roi
 
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 .
Lien direct vers le message - Vieux
Avatar de Taern
Taern
Alpha & Oméga
 
Avatar de Taern
 
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.
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > appel de fonction
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 17h30.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite