Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[script]Emuler un tableau

Par Azrael07 le 2/12/2002 à 18:14:40 (#2694947)

devant l'extrème paresse de tynril ;) j'ai pris la lourde tache:D de faire un script pour émuler un tableau

Bon le tableau pour ceux qui connaissent pas, c'est un principe fondamental de la programation qui consiste a regrouper plusieurs variables en un ... ben tableau.

je m'explique : dison qu'on veux faire un morpion. Le morpion est fait de 9 cases, 3x3. on va donc faire un tableau de dimentions 3x3 pour y indiquer l'état de la case correspondante : par exemple, 0 pour vide, 1 pour une croix et 2 pour un rond. La syntaxe en C du tableau s'ecrirait donc comme ca :

int nTableau[3, 3];

et pour acceder a l'une de ces variables,

nTableau[1, 2] par exemple.

Seulement ce principe d'une utilité évidente n'a pas été exploité sous neverwinter nights, d'où l'idée de Tynril d'en émuler un. Voici donc le travail final, qui même si ce n'est pas testé (seulement compilé) doit marcher, y'apa de raison

les commentaires sont réduits, si des commentaires + détaillés interessent quelqu'un, qu'il m'en fasse part


////////////////////////////////////
//Emulateur de tableaux
//Par Azrael07
////////////////////////////////////

/*
L'utilisation finale du script est relativement simple :
CreateTab( TypeDeDonnee, TailleDuTableauAuxAbscisses)

TypeDeDonnée : la taille en octet de chaques éléments du tableau, c'est a dire le nombre de caractères que l'on peut assigner a chaques donnés

TailleDuTableauAuxAbscisses : Ben si votre tableau fait 3*4, se sera 3 (la taille aux ordonnés n'est pas necessaire compte tenu de la non limitation de la taille maximale des string)

ex : struct tab tTableau = CreateTab( 5, 3);

SetTabElement( tableau, coordonnée X, coordonnée Y, contenus)

les donnés tombent relativement sous le sens, juste un exemple :

SetTabElement( struct tab tTableau, 2, 1, 132);

GetTabElement(tableau, coordonnée X, coordonnée Y)

idem, un exemple :

string Element = GetTagElement( struct tab tTableau, 2, 1);

les deux dernières fonctions sont utilisés pour placer le tableau en mémoire pour une utilisation dans d'autres script, l'utilisation est donc la meme que pour les autres variables :

SetLocalTab( OBJECT_SELF, "Tableau", struct tab tTableau);
et
struct tab tTab = GetLocalTab( OBJECT_SELF, "Tableau");

voila j'espère que c'est clair
*/

string AdjustDecimal(string sNumber, int nNumberOfDecimal = 3)
{
//iDecimal : Passage en revu de toutes les decimales
int iDecimal;
//iInsertDecimal : Passage en revu des decimales entre iDecimal et
//nNumberOfDecimal
int iInsertDecimal;
//Passage en revue de toutes les decimales demandees par nNumberOfDecimal
for(iDecimal = 1; iDecimal <= nNumberOfDecimal; iDecimal++)
{
//Si nNumber est plus petit que 10^iDecimal,
//nNumberOfDecimal - iDecimal est le nombre de zeros a ajouter
if (StringToInt(sNumber) < 10^iDecimal)
{
//Passage en revu des zeros a ajouter
for (iInsertDecimal = 1;
iInsertDecimal tTab.ElementSize ) sElement = "0";
int nLength = GetStringLength(tTab.sData);
int nPosition = ((nCoorY - 1 ) * tTab.nSizeX + nCoorX - 1) * tTab.nElementSize;
string sTemp = GetSubString( tTab.sData, 1, nPosition - 1 ) + AdjustDecimal( sElement, tTab.nElementSize) + GetSubString( tTab.sData, nPosition + tTab.nElementSize, nLength - nPosition - tTab.nElementSize - 1);
tTab.sData = sTemp;
}

string GetTabElement( struct tab tTab, int nCoorX, int nCoorY)
{
string sElement = GetSubString( tTab.sData,((nCoorY - 1) * tTab.nElementSize + nCoorX - 1) * tTab.nElementSize, tTab.nElementSize);
return sElement;
}

void SetLocalTab( object oObject, string sVarName, struct tab tTab)
{
string sTemp = AdjustDecimal( IntToString( tTab.nElementSize), 5) +
AdjustDecimal( IntToString( tTab.nSizeX), 5) +
tTab.sData;
SetLocalString( oObject, sVarName, sTemp);
}

struct tab GetLocalTab( object oObject, string sVarName)
{
string sTemp = GetLocalString( oObject, sVarName);
struct tab tTab;
tTab.nElementSize = StringToInt( GetSubString( sTemp, 0, 5));
tTab.nSizeX = StringToInt( GetSubString( sTemp, 1, 5));
tTab.sData = GetSubString( sTemp, 10, GetStringLength( sTemp) - 11);
return tTab;
}


EDIT : Correction d'un petit bug au niveau de la fonction SetTabElement
et pis un autre due a mon incompétence (j'espère que maintenant ca marche

Par Jedaï le 2/12/2002 à 20:56:55 (#2696520)

Impressionnant !:eek:

Toi qui parlais de code clair, tu donne le bon exemple.:cool:

En tout cas, il est vraiment excellent ce tableau. Par ailleurs tu aurais pu le faire depuis longtemps : le problème des struct n'avait lieu que si la struct comprenait deux strings....:rolleyes:

Par coolstar le 2/12/2002 à 21:08:36 (#2696618)

I l m'épate, il m'épate !! :D

Par Azrael07 le 2/12/2002 à 21:31:49 (#2696847)

oulala je suis très flatté, je m'attendais pas à un tel succet :ange: :ange:

merci merci pour les fans les autographes c'est de 21h à 23h

Quoi je prend la grosse tête ???

désolé :bouffon: :bouffon: :bouffon:

bon j'en profite en douce pour corriger un petit bug..... que personne n'as vu ^_^

Par Jedaï le 2/12/2002 à 21:41:27 (#2696929)

:) Autres petits bugs à corriger : les chaînes commencent à 0, donc pour GetSubString() et tout ça...
Tu peux me faire confiance pour ça, j'en ai bouffé des strings pour ma bibliothèque ! :mdr:

Par Azrael07 le 2/12/2002 à 21:48:22 (#2696987)

ah bon ????????

alors la :eek: :eek: :eek:

bon ben écoutez honte sur moi jusqu'aux 500 générations a venir je ferais mieux d'aller me coucher....

aie les chaines commencent a 0 alors :/

bon ben je vais corriger ca si tu le dis je te crois

Par Tynril le 2/12/2002 à 21:56:06 (#2697070)

Merci, j'avais pas vraiment le temps, ni l'envie d'ailleurs :D

Par Azrael07 le 2/12/2002 à 22:02:34 (#2697125)

ben je vais quand meme te demander un truc, comment toi tu prevoit de faire ca en utilisant la pile ?

bon je voix bien des solutions, mais pas vraimnet aventageuses... Je me trompe ?

Par coolstar le 2/12/2002 à 22:37:00 (#2697400)

Tu comptes combien de décennies par Génération ? 2? 3?? parce que là c un peu dur sinon 10 000 à 15 000 ans de malédiction (genre Divine, quoi!)... :D :D :D

Par Azrael07 le 2/12/2002 à 22:55:42 (#2697547)

ben atta, t'as vu quand meme, ct vraiment une erreur infame la non ????

bouuuuuuuuuuuuuh je ne suis qu'un être pitoyable

:sanglote: :sanglote: :sanglote:

Par coolstar le 2/12/2002 à 22:59:08 (#2697574)

[Oups!]]Dallaaas! Ton univers pitoyable!!![/Oups!]

Par Jedaï le 2/12/2002 à 23:20:19 (#2697735)

D'ailleurs tu as des fonctions GetStringLeft()/Right() qui peuvent très bien servir ici :


struct tab SetTabElement(struct tab tTab, int nCoorX, int nCoorY, string sElement)
{
if( GetStringLength(sElement) > tTab.ElementSize ) sElement = "0";
int nLength = GetStringLength(tTab.sData);
int nPosition = ((nCoorY - 1 ) * tTab.nSizeX + nCoorX - 1) * tTab.nElementSize;
string sTemp = GetStringLeft( tTab.sData, nPosition ) + AdjustDecimal( sElement, tTab.nElementSize) + GetStringRight( tTab.sData, nLength - nPosition - tTab.nElementSize);
tTab.sData = sTemp;
return tTab
}


De plus je corrige ici une Grosse erreur dont je ne m'étais pas rendu compte : le NWScript ne permettant pas le passage de paramètres par référence ni les pointeurs, aucune fonction ne peut modifier ses paramètres. Ta fonction ne faisait donc rien...
A moins que je me trompe :o !
De plus, cette fonction ne peut marcher que s'il existe déjà une string de la bonne longueur (sinon les instruction GetString...() feront n'importe quoi !), je pense donc qu'il va être obligatoire de rigidifier un peu la structure de ton script, notamment en modifiant le CreateTab() :( :(


struct tab
{
string sData;
int nElementSize;
int nSizeX;
int nSizeY;
};

struct tab CreateTab(int nElementSize, int nSizeX, int nSizeY)
{
struct tab tTab;
tTab.nElementSize = nElementSize;
tTab.nSizeX = nSizeX;
tTab.nSizeY = nSizeY;

int nSize = nSizeX * nSizeY * nElementSize;
string sTab = ";
for(nSize;nSize>0;nSize--)
sTab += "0"
return tTab;
}


Ce qui implique de rajouter cette information dans les ...Local... :


void SetLocalTab( object oObject, string sVarName, struct tab tTab)
{
string sTemp = AdjustDecimal( IntToString( tTab.nElementSize), 5) +
AdjustDecimal( IntToString( tTab.nSizeX), 5) +
AdjustDecimal( IntToString( tTab.nSizeY), 5) +
tTab.sData;
SetLocalString( oObject, sVarName, sTemp);
}

struct tab GetLocalTab( object oObject, string sVarName)
{
string sTemp = GetLocalString( oObject, sVarName);
struct tab tTab;
tTab.nElementSize = StringToInt( GetSubString( sTemp, 0, 5));
tTab.nSizeX = StringToInt( GetSubString( sTemp, 5, 5));
tTab.nSizeY = StringToInt( GetSubString( sTemp, 10, 5));
tTab.sData = GetSubString( sTemp, 15, GetStringLength( sTemp) - 15);
return tTab;
}


Par ailleurs, petite erreur dans le GetElement(), étourderie probablement, tu multiplie nCoorY - 1 par nElementSize alors que c'est nCoorY-1 * nSizeX qu'il faudrait multiplier comme tu l'as fais dans le SetElement() :


string GetTabElement( struct tab tTab, int nCoorX, int nCoorY)
{
string sElement = GetSubString( tTab.sData,((nCoorY - 1) * tTab.nSizeX + nCoorX - 1) * tTab.nElementSize, tTab.nElementSize);
return sElement;
}


Voilà, c'est tout pour le moment... :( Ca serait bien si tu trouvais une solution alternative pour la création sans nSizeY mais il faudrait alors dynamiquement créer les lignes supplémentaires nécessaires dans le SetTabElement() ?:confus: C'est faisable, je pense mais ça va alourdir sévèrement le code...

Par Azrael07 le 2/12/2002 à 23:43:35 (#2697918)

ben ma foi vu l'heure je vais pas m'attarder sur ce que tu propose, mais tu doit avoir raison...
ct un peu fait a la vavite je doit l'avouer (surtout il fo pas dire que je l'ai fait en cours de bio)

merci de repasser derrière moi ;)

Par Jedaï le 2/12/2002 à 23:48:39 (#2697963)

Pas de problème, j'ai moi-même fait une erreur con dans le CreateTab() : corrigé :


struct tab CreateTab(int nElementSize, int nSizeX, int nSizeY)
{
struct tab tTab;
tTab.nElementSize = nElementSize;
tTab.nSizeX = nSizeX;
tTab.nSizeY = nSizeY;

int nSize = nSizeX * nSizeY * nElementSize;
string sTab = ";
for(nSize;nSize>0;nSize--)
sTab += "0";

tTab.sData = sTab;
return tTab;
}

Par Jedaï le 3/12/2002 à 22:53:10 (#2705726)

Bon, finalement il est assez facile de modifier dynamiquement la taille en Y d'un tableau, pour faciliter les corrections, je vous met ici la version revue et corrigée dans son entier, c'est à utiliser comme bibliothèque :


////////////////////////////////////
//Emulateur de tableaux
//Par Azrael07
//(revision et correction par Jedai)
////////////////////////////////////

/*
L'utilisation finale du script est relativement simple :
CreateTab( TypeDeDonnee, TailleDuTableauAuxAbscisses)

TypeDeDonnée : la taille en octet de chaques éléments du tableau, c'est a dire le nombre de caractères que l'on peut assigner a chaques donnés

TailleDuTableauAuxAbscisses : Ben si votre tableau fait 3*4, se sera 3 (la taille aux ordonnés n'est pas necessaire compte tenu de la non limitation de la taille maximale des string)

ex : struct tab tTableau = CreateTab( 5, 3);

SetTabElement( tableau, coordonnée X, coordonnée Y, contenus)

les donnés tombent relativement sous le sens, juste un exemple :

SetTabElement( struct tab tTableau, 2, 1, 132);

GetTabElement(tableau, coordonnée X, coordonnée Y)

idem, un exemple :

string Element = GetTagElement( struct tab tTableau, 2, 1);

les deux dernières fonctions sont utilisés pour placer le tableau en mémoire pour une utilisation dans d'autres script, l'utilisation est donc la meme que pour les autres variables :

SetLocalTab( OBJECT_SELF, "Tableau", struct tab tTableau);
et
struct tab tTab = GetLocalTab( OBJECT_SELF, "Tableau");

voila j'espère que c'est clair
*/

string AdjustDecimal(string sNumber, int nNumberOfDecimal = 3)
{
sNumber = IntToString(StringToInt(sNumber));
int nL = GetStringLength(sNumber);

nL = nL - nNumberOfDecimal;

if (nL<0)
{
string sR = ";
for (nL = 0; nL < nNumberOfDecimal;nL++)
sR += "0";
return sR;
}

for (nNumberOfDecimal = 0; nNumberOfDecimal 0;nSize--)
sTab += "0";
return tTab;
}

void SetTabElement(struct tab tTab, int nCoorX, int nCoorY, string sElement)
{
if (nCoorY - tTab.nSizeY > 0)
{
int n;
for(n = 0; n < nCoorY - tTab.nSizeY; n++)
{
for(n = 0; n tTab.nElementSize ) sElement = "0";
int nLength = GetStringLength(tTab.sData);
int nPosition = ((nCoorY - 1 ) * tTab.nSizeX + nCoorX - 1) * tTab.nElementSize;
string sTemp = GetStringLeft( tTab.sData, nPosition) + AdjustDecimal( sElement, tTab.nElementSize) + GetStringRight( tTab.sData, nLength - nPosition - tTab.nElementSize);
tTab.sData = sTemp;
}

string GetTabElement( struct tab tTab, int nCoorX, int nCoorY)
{
string sElement = GetSubString( tTab.sData,((nCoorY - 1) * tTab.nSizeX + nCoorX - 1) * tTab.nElementSize, tTab.nElementSize);
return sElement;
}

void SetLocalTab( object oObject, string sVarName, struct tab tTab)
{
string sTemp = AdjustDecimal( IntToString( tTab.nElementSize), 5) +
AdjustDecimal( IntToString( tTab.nSizeX), 5) +
AdjustDecimal( IntToString( tTab.nSizeY), 5) +
tTab.sData;
SetLocalString( oObject, sVarName, sTemp);
}

struct tab GetLocalTab( object oObject, string sVarName)
{
string sTemp = GetLocalString( oObject, sVarName);
struct tab tTab;
tTab.nElementSize = StringToInt( GetSubString( sTemp, 0, 5));
tTab.nSizeX = StringToInt( GetSubString( sTemp, 5, 5));
tTab.nSizeY = StringToInt( GetSubString( sTemp, 10, 5));
tTab.sData = GetSubString( sTemp, 15, GetStringLength( sTemp) - 15);
return tTab;
}

//void main(){}


Ca compile, reste à savoir si ça marche....:maboule:

Des échos, des suggestions, des bugs ?:)

Vive Azrael07 ! :merci: :merci:

Par Azrael07 le 3/12/2002 à 23:28:30 (#2705954)

Vive Azrael07 !


ben écoute je te remercie, mais bon au final c pas un peu toi qui as tout fait la ??? :bouffon: :bouffon:

Par Jedaï le 3/12/2002 à 23:36:42 (#2706008)

Ben non :o
C'est ton idée, c'est tes fonctions !:p

Débugguer un script demande beaucoup moins de compétence que de concrétiser une idée (déjà faut l'avoir !)...;)

Donc, c'est ta bibliothèque !:)

Par Azrael07 le 3/12/2002 à 23:41:10 (#2706033)

mouai bon ben si tu le dit, en tout cas merci a toi pour ton soutient, mais c'est peu etre mes fonctions, mais c pas mon idée, c celle de tynril ;)

Par coolstar le 4/12/2002 à 1:11:17 (#2706549)

Rhô les Modestes... C un travail d'équipe quoi!!! :D

Par coolstar le 4/12/2002 à 1:14:58 (#2706559)

Provient du message de Jedaï
Ben non :o
C'est ton idée, c'est tes fonctions !:p

Débugguer un script demande beaucoup moins de compétence que de concrétiser une idée (déjà faut l'avoir !)...;)

Donc, c'est ta bibliothèque !:)
Tout à fait! d'ailleurs je sais faire que reprendre et hallucine devant ce que certains comme vous peuvent pondre... :D


;)

Par Tynril le 4/12/2002 à 12:33:12 (#2708438)

Vous battez pas, c'est moi la star.




*sort :D*

Par Azrael07 le 4/12/2002 à 13:37:30 (#2708918)

ben je dis pas le contraire, encore heureux que t'es flemmard sinon on aurais plus qu'a se mettre au chomage ^_^

looooooooooooooooool

Par Jedaï le 4/12/2002 à 15:09:19 (#2709769)

Bon, c'est pas tout de jouer les stars :D

Testez donc ces tableaux à la place, j'aimerais bien savoir si ils marchent !:cool:

Non, je n'ai toujours pas changé mon lecteur CD qui a grillé, donc je peux pas tester...:mdr:

JOL Archives 1.0.1
@ JOL / JeuxOnLine