Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > [script]Emuler un tableau
[script]Emuler un tableau
Par Azrael07 le 2/12/2002 à 18:14:40 (#2694947)
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)
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)
Par Azrael07 le 2/12/2002 à 21:31:49 (#2696847)
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)
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)
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)
Par Azrael07 le 2/12/2002 à 22:02:34 (#2697125)
bon je voix bien des solutions, mais pas vraimnet aventageuses... Je me trompe ?
Par coolstar le 2/12/2002 à 22:37:00 (#2697400)
Par Azrael07 le 2/12/2002 à 22:55:42 (#2697547)
bouuuuuuuuuuuuuh je ne suis qu'un être pitoyable
:sanglote: :sanglote: :sanglote:
Par coolstar le 2/12/2002 à 22:59:08 (#2697574)
Par Jedaï le 2/12/2002 à 23:20:19 (#2697735)
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)
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)
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)
////////////////////////////////////
//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)
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)
Par coolstar le 4/12/2002 à 1:11:17 (#2706549)
Par coolstar le 4/12/2002 à 1:14:58 (#2706559)
Provient du message de Jedaï
Tout à fait! d'ailleurs je sais faire que reprendre et hallucine devant ce que certains comme vous peuvent pondre... :D
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 Tynril le 4/12/2002 à 12:33:12 (#2708438)
*sort :D*
Par Azrael07 le 4/12/2002 à 13:37:30 (#2708918)
looooooooooooooooool
Par Jedaï le 4/12/2002 à 15:09:19 (#2709769)
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