La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 01/06/2024 09:00:20


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 10/09/2006 22:34:41 Sujet du message : libraire de gestion de tableaux à 2 dimensions - Essai

Salut à tous,

Je reprends du service pour nwn2 et je commence donc à me remettre au nwnScript, à faire des essais, à récupérer le plus de matos que je peux pour le projet de l'équipe avec laquelle je suis... Bref comme beaucoup de monde : )

Hier je me suis trouvé dans la nécessité de devoir utiliser des tableaux. Et je me suis rendu compte après quelques recherches qu'il n'y a rien d'acceptable à ce niveau ni sur le vault, ni sur les forums français que j'ai l'habitude de fréquenter. Alors j'ai ptet mal cherché mébon en tout cas j'ai rien trouvé de satisfaisant.

Je me suis donc mis à écrire cette librairie pour gérer des tableaux à 2 dimensions, des vrais tableaux avec 1 à n colonnes.

Je viens de terminer et les possibilités sont les suivantes :

Créer un tableau bien sûr : )
Ajouter une ligne à la fin d'un tableau
Insérer une ligne à une position définie.
Ecraser une ligne par une autre à une position définie
Retrouver une cellule selon des coordonnées X, Y (Colonne et Ligne)
Retrouver une ligne selon une position.
Enregistrer un tableau en variable locale.
Retrouver un tableau en variable locale.
Trier un tableau sur une colonne avec l'algorithme de tri par insertion.
Trier un tableau sur une colonne avec l'algorithme de tri par sélection.

Voilà, tout ça est testé et fonctionne.

Mais, je me heurte à des limitations qui sont probablement dues à des erreurs de conception dans mes algorithmes.

Pour mes tests, je me suis basé sur un tableau à 3 colonnes, avec des lignes ayant des cellules de dimensions variables mais pas trop grosses non plus.

Les problèmes arrivent lorsqu'on veut utiliser ce tableau :

Pour le remplissage et l'affichage, au delà de 70/80 lignes, never me retourne un TOO MANY INSTRUCTION.
Pour les tris là j'ai pu monter maxi à 14 lignes. Ce qui est vraiment peu et rend les tris pratiquement inexploitables.

Le TOO MANY INSTRUCTION n'est pas du à une erreur de codage sinon il renvoierait ça à chaque exécution. C'est donc vraisemblablement qu'à partir d'une certaine taille pour le tableau il jette l'éponge.

Donc voilà, je me tourne vers la communauté et ses nombreux talents histoire de voir si quelqu'un a pas une idée pour améliorer ce système en terme de performances : )

Des tableaux ça peut toujours servir non ? : )
Voici le lien pour télécharger le module qui m'a servit pour les tests.
[Je mettrai le lien quand j'aurai trouvé comment on fait maintenant avec orange Confused]

Je post à la suite de ce message les 2 libraires utilisées.

J'attends vos remarques et critiques avec impatience ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 10/09/2006 22:35:22 Sujet du message :

Librairie 1

EDIT : MAJ - Contient des fonctions qui n'ont pas trait au système de tableaux
mébon je laisse quand même ça peut toujours servir à quelqu'un.
A noter que toutes les fonctions ne sont pas de moi, certaines ont été prises
à droite à gauche, d'autres ont été largement modifiées. Dsl de pas avoir
mis les noms des auteurs originel mais j'étais pas censé publier ça au départ
et si je commence à mettre les noms des auteurs dans les libraires de notre
futur mod nwn2 ça va être le bordel yena déjà bien assez comme ça Smile

Bref, MEA CULPA MAXIMA pour les auteurs Smile

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :

//:Confused//////////////////////////////////////////////
//:: Name
//:: FileName inc_string
//:: Copyright (c) 2006 MOW Corp.
//:Confused/////////////////////////////////////////////
/*
Bibliotheque de fonctions de gestion des strings

Ce script est une bibliotheque.
Il contient des fonctions additionnelles a celles
de Bioware pour gerer les strings.

*/
//:Confused/////////////////////////////////////////////
//:: Created By: Marco & un peut tout le monde ^^
//:: Created On: 10/09/2006
//:Confused/////////////////////////////////////////////

////////////////////////////////////////////////
//DECLARATIONS DES FONCTIONS & DES PROCEDURES//
//////////////////////////////////////////////

//Retourne une string en fonction du separateur et de la position du separateur dans la string
//Retourne la chaine situee avant la position du separateur.
string GetSubStringBySeparator(string sString, string sSeparator, int nSeparator);

//Insere sString dans sDestination a la position nSeparateur de sSeparateur
//Retourne la nouvelle chaine ou une chaine vide en cas d'erreur.
string InsertStringBySeparator(string sDestination, string sString, string sSeparator,int nSeparator);

//Insere & REMPLACE la ligne qui etait a l'indice nSeparator par sString dans sDestination
string ReplaceStringBySeparator(string sDestination, string sString, string sSeparator, int nSeparator);

//Complete la string sStringToComplete avec le caractere sCaractereUseToComplete jusqu'a ce
//que sStringToComplete mesure nMaxSize
string CompleteString(string sStringToComplete, string sCaractereUseToComplete, int nMaxSize);

//Remplace une morceau de sString par sStringToReplace d'une longueur egale a celle
//de sStringToReplace a partir de nPosition dans sString
string ReplaceString(string sString, string sStringToReplace, int nPosition);

//Supprime le caractere sStringToDelete de la chaine sString
//Retourne la nouvelle sString.
string SupprimeUnString(string sString, string sStringToDelete);

//Cette fonction recherche toutes les occurences de sOldStr dans
//sStr et les remplace par des sNewStr, puis elle renvoie la chaîne
//de caractère modifiée.
//NON TESTE
string ReplaceStringByString(string sOldStr, string sNewStr, string sStr);

////////////////////////////////////////////////////
//IMPLEMENTATION DES FONCTIONS & DES PROCEDURES Confused/
//////////////////////////////////////////////////


string GetSubStringBySeparator(string sString, string sSeparator, int nSeparator)
{
string sWorkingString = sString;
int nPosSeparator, nLong;
int nCount = 1;
while(sWorkingString != "")
{ //trouve le 1er separateur a partir de la gauche.
nPosSeparator = FindSubString(sWorkingString, sSeparator);
if (nPosSeparator == -1)
{
return ""; //erreur, on renvoi une chaine vide.
}
else
{
if (nCount == nSeparator)//on est sur le bon separateur
{ //on renvoit le resultat
return GetStringLeft(sWorkingString,(nPosSeparator));
}
else
{
nLong = (GetStringLength(sWorkingString)-nPosSeparator);
sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
nCount++;
}
}
}
return ""; //erreur, on renvoi une chaine vide.
}

//******************************************************************************

string InsertStringBySeparator(string sDestination, string sString, string sSeparator,int nSeparator)
{
string sWorkingString = sDestination;
string sTampon = "";
int nPosSeparator, nLong;

if (nSeparator == 1) //si la position d'insertion est 1
{//on se prend pas la tete
return sString+sDestination;
}

int nCount = 1;
while(sWorkingString != "")
{ //trouve le 1er separateur a partir de la gauche.
nPosSeparator = FindSubString(sWorkingString, sSeparator);
if (nPosSeparator == -1)
{
//si on trouve pas le separateur c'est qu'on est au bout donc on fait un ajout
//On part du principe que la chaine est correctement formatee donc pas de traitement d'erreur
//si la nCount = nSeparator, alors c'est que l'insertion doit etre en fait un simple
//ajout de ligne !!!
if (nCount == (nSeparator))
{
return sDestination+sString;
} //Note : On gere cette possibilite pour pouvoir coder les fonctions de tri.
}
else
{
if (nCount == nSeparator)//on est sur le bon separateur
{
return sTampon+sString+sWorkingString;
}
else
{
nLong = (GetStringLength(sWorkingString)-nPosSeparator);
sTampon += GetStringLeft(sWorkingString,(nPosSeparator+1));
sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
nCount++;
}
}
}
//On arrive ici quand sWorkingString est vide, on est a nSeparator
//si ici nCount = nSeparator, alors c'est que l'insertion doit etre en fait un simple
//ajout de ligne !!!
if (nCount == (nSeparator))
{
return sDestination+sString;
}

//Pour la compil :
return "";
}

//******************************************************************************

string ReplaceStringBySeparator(string sDestination, string sString, string sSeparator, int nSeparator)
{
string sWorkingString = sDestination;
string sTampon = "";
int nPosSeparator, nLong;

int nCount = 1;
while(sWorkingString != "")
{ //trouve le 1er separateur a partir de la gauche.
nPosSeparator = FindSubString(sWorkingString, sSeparator);
if (nPosSeparator == -1)
{
return ""; //erreur, on renvoi une chaine vide.
}
else
{
if (nCount == nSeparator)//on est sur le bon separateur
{ //on renvoit le resultat
nLong = (GetStringLength(sWorkingString)-nPosSeparator);
sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);

return sTampon+sString+sWorkingString;
}
else
{
nLong = (GetStringLength(sWorkingString)-nPosSeparator);
sTampon += GetStringLeft(sWorkingString,(nPosSeparator+1));
sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
nCount++;
}
}
}
return ""; //erreur, on renvoi une chaine vide.
}

//******************************************************************************

string CompleteString(string sStringToComplete, string sCaractereUseToComplete, int nMaxSize)
{
int nTaille = nMaxSize - GetStringLength(sStringToComplete);
int nI = 1;

while(nI <= nTaille)
{
sStringToComplete += sCaractereUseToComplete;
nI++;
}
return sStringToComplete;
}

//******************************************************************************

string ReplaceString(string sString, string sStringToReplace, int nPosition)
{
int nLongToReplace = GetStringLength(sStringToReplace);
int nLongTotale = GetStringLength(sString);

//si sStringToReplace plus grand que sString ---> erreur
if (nLongToReplace > nLongTotale)
{
return "";
}

//Combien de positions dans sString ?
int nNbPosition = nLongTotale / nLongToReplace;

//si on veut inserer a une position > nb de positions totale, erreur
if (nPosition > nNbPosition)
{
return "";
}

int nLongDebut, nPosFin, nLongFin;
nLongDebut = (nLongToReplace * (nPosition - 1)) ;
nPosFin = nNbPosition - nPosition;
nLongFin = nPosFin * nLongToReplace;

string sDebut = GetStringLeft(sString, nLongDebut);
string sFin = GetStringRight(sString, nLongFin);

return sDebut + sStringToReplace + sFin;

}

//******************************************************************************

string SupprimeUnString(string sString, string sStringToDelete)
{
if(GetStringLength(sStringToDelete) > 1)
{ //un seul caractere autorise pour sStringToDelete
return "";
}

int nI = 0;
int nLong = GetStringLength(sString);
string sNewString = "";
string sTest = "";

while(nI < nLong)
{
sTest = GetSubString(sString, nI, 1);
if(sTest != sStringToDelete)
{
sNewString += sTest;
}
sTest = "";
nI++;
}

return sNewString;
}

//******************************************************************************

string ReplaceStringByString(string sOldStr, string sNewStr, string sStr)
{
if (sOldStr == "")
return "";

int nTemp;
int nL = GetStringLength(sStr);
int nLength = GetStringLength(sOldStr);
string sTemp;
string sR = "";

while ((nTemp = FindSubString(sStr, sOldStr)) >= 0)
{
sTemp = GetStringLeft(sStr, nTemp);
sStr = GetStringRight(sStr, nL - nLength - nTemp);
sR = sR + sTemp + sNewStr;
nL = GetStringLength(sStr);
}
sR+=sStr;

return sR;
}

//******************************************************************************

//void main() {}

Dernière édition par Kétil Dimzad le 27/09/2006 19:08:08; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 10/09/2006 22:36:12 Sujet du message :

La librairie principale :

EDIT : La dernière version.

Il parait qu'il faut poster les longs scripts en spoilers, comme je suis pas contrariant
je poste en spoilers :

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :

//:Confused//////////////////////////////////////////////
//:: Name
//:: FileName inc_tableaux
//:: Copyright (c) 2006 MOW Corp.
//:Confused/////////////////////////////////////////////
/*
Bibliotheque de fonctions de gestion des tableaux

Ce script est une bibliotheque.
Il contient toutes les fonctions utilisees pour
emuler des tableaux a 2 dimensions avec le nwnScript.

Limitations :
- 1 a n colonnes dans le tableau. (plus on en mets, moins faut mettre de lignes normal )
- nb de lignes 60 lignes pour un tableau 4 colonnes de 32 caracteres par cellules.
On peut ptet pousser au dela mais a 75-80 ---> TOO MANY INSTRUCTIONS, nwn jette l'eponge.
- Oblige de passer par des strings. Donc si une colonne
ne contient que des int ou des floats il ne faudra pas
oublier de faire les conversions.
- Les Tris : Necessite des tableaux 2 a 3 fois moins gros que ce qui est dit
juste au dessus sinon TOO MANY INSTRUCTIONS
*/
//:Confused/////////////////////////////////////////////
//:: Created By: Marco
//:: Created On: 09/09/2006
//:Confused/////////////////////////////////////////////

#include "inc_string"

///////////////////////////////
//DECLARATION DES STRUCTURES//
/////////////////////////////
//La ligne d'indice 1 d'un tableau est la premiere ligne.
struct Tableau {
string sData; //La chaine contenant les donnees
int nCol; //Le nb de colonnes (aucune utilite pour le moment. Mis a la creation, pas touche depuis)
int nLignes; //Le nb de lignes (seule utilite, connaitre le nb de ligne tres vite)
int nTailleMaxCellule; //Taille maxi de chaque cellule.
string sCaractereToComplete; //Caractere utilise pour completer les donnees des cellules.
};

///////////////////////////////
//DECLARATION DES CONSTANTES//
/////////////////////////////



/////////////////////////////////////////////////
//REGLE DE CONSTRUCTION DES DONNEES DU TABLEAU//
///////////////////////////////////////////////
/*

La taille des cellules est limitee a la creation du tableau.(cf la structure)
Ainsi, a chaque fois qu'une donnee est ajoutee dans une cellule, elle est
complete avec un caractere pre-defini (cf la structure) pour aller jusqu'a
la taille max de la cellule.

Cette methode permet d'eviter toutes les boucles de la version precedente
de inc_tableaux ou l'on construisait les cellules puis les lignes avec des
separateurs.

Je trouve pas de systeme pour donner aux cellules une taille dynamique tout en
evitant au maximum les boucles. Si quelqu'un a idee je suis preneur, ca reduirait
encore + les ressources necessaire...

*/


////////////////////////////////////////////////
//DECLARATIONS DES FONCTIONS & DES PROCEDURES//
//////////////////////////////////////////////

//Cree un tableau. Le tableau est en fait une structure composee de :
//string sData :...................une chaine qui contient toutes les donnees
//int nNbCol :...................le nombre de colonnes du tableau
//int nNbLignes :...................le nombre de lignes
//int nTailleMaxCellule :...........taille maxi de chaque cellule du tableau
//string sCaractereToComplete :.....le caractere qui sert a completer les cellules
//Retourne le tableau cree.
struct Tableau Tab_CreateTableau(string sData, int nNbCol, int nNbLignes, int nTailleMaxCellule, string sCaractereToComplete);

//Retourne la cellule (AVEC les caracteres qui completent) place dans le tableau :
//a l'indice nIndiceCol pour les X
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabCelluleComplete(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne);

//Retourne la ligne (AVEC les caracteres qui completent) placee dans le tableau :
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabLigneComplete(struct Tableau MonTableau, int nIndiceLigne);

//Retourne la cellule (SANS les caracteres qui completent) place dans le tableau :
//a l'indice nIndiceCol pour les X
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabCellule(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne);

//Retourne la ligne (SANS les caracteres qui completent) placee dans le tableau :
//a l'indice nIndiceLigne pour les Y
string Tab_GetTableLigne(struct Tableau MonTableau, int nIndiceLigne);

//Remplace une ligne du tableau a l'indice nIndiceToReplace avec la ligne sLigneToReplace
//Retourne le nouveau tableau
struct Tableau Tab_ReplaceLigne(struct Tableau MonTableau, string sLigneToReplace, int nIndiceToReplace);

//Utilisee pour construire une ligne. Ajoute une cellule a la ligne que l'ont veut construire.
//Les caracteres manquants sont completes pour arriver a MonTableau.nTailleMaxCellule
//sNewLigne = Chaine vide pour la 1ere cellule de la ligne.
//Retourne sNewLigne construite.
string Tab_SetNewCellule(string sNewLigne, string sNewCellule, string sCaractereUseToComplete ,int nMaxSize);

//Ecrit une nouvelle ligne dans le tableau a la fin du tableau
//La ligne doit etre formatee correctement. Pour construire une ligne, utiliser la fonction
//Tab_SetNewCellule et boucler dessus jusqu'a avoir le nb de cellule composant la ligne.
//Retourne le nouveau tableau.
struct Tableau Tab_SetNewLigne(struct Tableau MonTableau, string sNewLigne);

//Insere une ligne sNewLigne a la position nIndiceInsertion
//Retourne le nouveau tableau.
struct Tableau Tab_InsertNewLigne(struct Tableau MonTableau, string sNewLigne, int nIndiceInsertion);

//Supprime la ligne d'indice nIndiceToDelete du tableau MonTableau
//Retourne le nouveau tableau.
//ATTENTION : Supprimer une ligne decale tous les indices > nIndiceToDelete de -1
struct Tableau Tab_DeleteLigne(struct Tableau MonTableau, int nIndiceToDelete);


/////////////////////////////////////////
//*** FONCTIONS DE TRI DES TABLEAUX Confused
///////////////////////////////////////

//Fonction interne du tri Tab_TrieTableauParInsertion
struct Tableau DecaleTabTriParInsertion(struct Tableau MonTableau, int nPosition, int nIndiceCol);

//Trie le tableau
//Algorithme utilise : Tri par insertion (pas Dychotomique car certaines structures de controle indisponibles en nwnScript(ex : Do... While)
//struct Tableau MonTableau : Le tableau a trier
//int nNumCol : defini sur quel numero de colonne on trie le tableau
//******************************************************************
//NOTE_1 : On ne peut trier que sur des int (ptet des floats mais pas essaye) donc
//il faut faire attention sur la colonne a trier sinon ca renvoie vide ("").
//NOTE_2 : A preferer au tri par selection si tableau partiellement trié
//Retourne le nouveau tableau trié.
struct Tableau Tab_TrieTableauParInsertion(struct Tableau MonTableau, int nNumCol);

//Fonction interne de Tab_TrieTableauParSelection
struct Tableau EchangeTabTriParSelection(struct Tableau MonTableau, int nI, int nJ, int nIndiceCol);

//Fonction interne de Tab_TrieTableauParSelection
struct Tableau PlusPetitTabTriParSelection(struct Tableau MonTableau, int nPd, int nN, int nIndiceCol);

//Trie le tableau
//Algorithme utilise : Tri par selection (pas Dychotomique car certaines structures de controle indisponibles en nwnScript(ex : Do... While)
//struct Tableau MonTableau : Le tableau a trier
//int nNumCol : defini sur quel numero de colonne on trie le tableau
//******************************************************************
//NOTE_1 : On ne peut trier que sur des int (ptet des floats mais pas essaye) donc
//il faut faire attention sur la colonne a trier sinon ca renvoie vide ("").
//NOTE_2 : A preferer au tri par insertion si tableau totalement desordonne
//Retourne le nouveau tableau trié.
struct Tableau Tab_TrieTableauParSelection(struct Tableau MonTableau, int nNumCol);


/////////////////////////////////////////////////////
//*** GESTION EN VARIABLES LOCALES DES TABLEAUX Confused
///////////////////////////////////////////////////

//Enregistre le Tableau MonTableau de nom sVarName sur l'objet oObject.
void SetLocalTableau(object oObject, string sVarName, struct Tableau MonTableau);

//Renvoi une structure Tableau nommee sVarName.
//Retourne une structure vide en cas d'erreur.
struct Tableau GetLocalTableau(object oObject, string sVarName);

//Supprime le tableau de nom sVarName stocke sur oObject.
void DeleteLocalTableau(object oObject, string sVarName);


////////////////////////////////////////////////////
//IMPLEMENTATION DES FONCTIONS & DES PROCEDURES Confused/
//////////////////////////////////////////////////

struct Tableau Tab_CreateTableau(string sData, int nNbCol, int nNbLignes, int nTailleMaxCellule, string sCaractereToComplete)
{
struct Tableau MonTableau; //Declaration de la structure

MonTableau.sData = sData; //La chaine contenant les donnees
MonTableau.nCol = nNbCol; //Le nb de colonnes
MonTableau.nLignes = nNbLignes; //Le nb de lignes
MonTableau.nTailleMaxCellule = nTailleMaxCellule; //Taille max des cellules
MonTableau.sCaractereToComplete = sCaractereToComplete; //Caract. pour completer les cells.

return MonTableau; //On a cree le tableau, et on le retourne
}

//******************************************************************************

string Tab_GetTabCelluleComplete(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne)
{
string sCellule, sLigne;
int nStart, nCount;
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

nCount = MonTableau.nTailleMaxCellule;
nStart = (nIndiceCol-1) * nCount;

sLigne = Tab_GetTabLigneComplete(MonTableau, nIndiceLigne);

sCellule = GetSubString(sLigne, nStart, nCount);

return sCellule;
}

//******************************************************************************

string Tab_GetTabLigneComplete(struct Tableau MonTableau, int nIndiceLigne)
{
int nStart, nCount;
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

nStart = (nIndiceLigne-1) * nLongLigne;

string sLigne = GetSubString(MonTableau.sData, nStart, nLongLigne);

return sLigne;
}

//******************************************************************************

string Tab_GetTabCellule(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne)
{
string sCellule, sLigne;
int nStart, nCount;
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

nCount = MonTableau.nTailleMaxCellule;
nStart = (nIndiceCol-1) * nCount;

sLigne = Tab_GetTabLigneComplete(MonTableau, nIndiceLigne);

sCellule = SupprimeUnString(GetSubString(sLigne, nStart, nCount), MonTableau.sCaractereToComplete);

return sCellule;
}

//******************************************************************************

string Tab_GetTableLigne(struct Tableau MonTableau, int nIndiceLigne)
{
int nStart, nCount;
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

nStart = (nIndiceLigne-1) * nLongLigne;

string sLigne = SupprimeUnString(GetSubString(MonTableau.sData, nStart, nLongLigne), MonTableau.sCaractereToComplete);

return sLigne;
}

//******************************************************************************

struct Tableau Tab_ReplaceLigne(struct Tableau MonTableau, string sLigneToReplace, int nIndiceToReplace)
{
string sDataTab = ReplaceString(MonTableau.sData, sLigneToReplace, nIndiceToReplace);
MonTableau.sData = sDataTab;

return MonTableau;
}

//******************************************************************************

string Tab_SetNewCellule(string sNewLigne, string sNewCellule,
string sCaractereUseToComplete ,int nMaxSize)
{
sNewLigne += CompleteString(sNewCellule, sCaractereUseToComplete, nMaxSize);
return sNewLigne;
}

//******************************************************************************

struct Tableau Tab_SetNewLigne(struct Tableau MonTableau, string sNewLigne)
{
int nNbLignes = MonTableau.nLignes;
nNbLignes++;
MonTableau.nLignes = nNbLignes;

string sDataTab = MonTableau.sData;
sDataTab += sNewLigne;
MonTableau.sData = sDataTab;

return MonTableau;
}

//******************************************************************************

struct Tableau Tab_InsertNewLigne(struct Tableau MonTableau, string sNewLigne, int nIndiceInsertion)
{
int nNbLignes = MonTableau.nLignes;
nNbLignes++;
MonTableau.nLignes = nNbLignes;

int nPosition;
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

nPosition = (nIndiceInsertion-1) * nLongLigne;

MonTableau.sData = InsertString(MonTableau.sData, sNewLigne, nPosition);

return MonTableau;
}

//******************************************************************************

struct Tableau Tab_DeleteLigne(struct Tableau MonTableau, int nIndiceToDelete)
{
int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;
string sDataGauche = "";
string sDataDroite = "";
int nTailleData = GetStringLength(MonTableau.sData);
int nNbPositions = nTailleData / nLongLigne;
int nCountGauche = ((nIndiceToDelete - 1) * nLongLigne);
int nCountDroite = ((nNbPositions - nIndiceToDelete) * nLongLigne);
if (nCountGauche < 0)
{
nCountGauche = 0;
}
if (nCountDroite < 0)
{
nCountDroite = 0;
}

sDataGauche = GetStringLeft(MonTableau.sData, nCountGauche);

sDataDroite = GetStringRight(MonTableau.sData, nCountDroite);

MonTableau.sData = sDataGauche + sDataDroite;

return MonTableau;
}

//******************************************************************************

struct Tableau DecaleTabTriParInsertion(struct Tableau MonTableau, int nPosition, int nIndiceCol)
{
int nDpg = nPosition-1;
struct Tableau WorkingTableau = MonTableau;

string sTamponCellule = Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nPosition);
string sTamponLigne = Tab_GetTabLigneComplete(WorkingTableau, nPosition);

while ( ( StringToInt((Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nDpg))) > StringToInt(sTamponCellule) ) && (nDpg >= 0) )
{
WorkingTableau = Tab_ReplaceLigne(WorkingTableau, (Tab_GetTabLigneComplete(WorkingTableau, nDpg)),(nDpg+1));
nDpg--;
}
WorkingTableau = Tab_ReplaceLigne(WorkingTableau, sTamponLigne, (nDpg+1));
return WorkingTableau;
}

//******************************************************************************

struct Tableau Tab_TrieTableauParInsertion(struct Tableau MonTableau, int nNumCol)
{
struct Tableau WorkingTableau = MonTableau;
int nPosition;
for(nPosition = 1; nPosition < WorkingTableau.nLignes+1; nPosition++)
{
WorkingTableau = DecaleTabTriParInsertion(WorkingTableau, nPosition, nNumCol);
}
return WorkingTableau;
}

//******************************************************************************

struct Tableau EchangeTabTriParSelection(struct Tableau MonTableau, int nI, int nJ, int nIndiceCol)
{
struct Tableau WorkingTableau = MonTableau;
string sTamponCellule = Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nI);
string sTamponLigne = Tab_GetTabLigneComplete(WorkingTableau, nI);

WorkingTableau = Tab_ReplaceLigne(WorkingTableau, (Tab_GetTabLigneComplete(WorkingTableau, nJ)),(nI));
WorkingTableau = Tab_ReplaceLigne(WorkingTableau, sTamponLigne, nJ);

return WorkingTableau;
}
//******************************************************************************

struct Tableau PlusPetitTabTriParSelection(struct Tableau MonTableau, int nPd, int nN, int nIndiceCol)
{
struct Tableau WorkingTableau = MonTableau;

int nI;
int nPp = nPd;

for(nI = nPd+1; nI < nN; nI++)
{
if ( StringToInt(Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nI)) < StringToInt(Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nPp)) )
{
nPp = nI;
}
}

WorkingTableau = EchangeTabTriParSelection(WorkingTableau, nPp, nPd, nIndiceCol);

return WorkingTableau;
}
//******************************************************************************

struct Tableau Tab_TrieTableauParSelection(struct Tableau MonTableau, int nNumCol)
{
struct Tableau WorkingTableau = MonTableau;

int nPd;
int nN = WorkingTableau.nLignes+1;

for(nPd = 1; nPd < (nN-1); nPd++)
{
WorkingTableau = PlusPetitTabTriParSelection(WorkingTableau, nPd, nN, nNumCol);
}

return WorkingTableau;
}

//******************************************************************************

void SetLocalTableau(object oObject, string sVarName, struct Tableau MonTableau)
{
string sDataVarName = sVarName + "String"; //Pour sData
string sLignesVarName = sVarName + "Lignes"; //Pour sLignes
string sColVarName = sVarName + "Col"; //Pour sCol
string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule"; //Taille maxi de chaque cellule
string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

SetLocalString(oObject, sDataVarName, MonTableau.sData);
SetLocalInt(oObject, sLignesVarName, MonTableau.nLignes);
SetLocalInt(oObject, sColVarName, MonTableau.nCol);
SetLocalInt(oObject, sTailleMaxCelluleVarName, MonTableau.nTailleMaxCellule);
SetLocalString(oObject, sCaractereToCompleteVarName, MonTableau.sCaractereToComplete);

}

//******************************************************************************

struct Tableau GetLocalTableau(object oObject, string sVarName)
{
struct Tableau MonTableau;
string sDataVarName = sVarName + "String"; //Pour sData
string sLignesVarName = sVarName + "Lignes"; //Pour sLignes
string sColVarName = sVarName + "Col"; //Pour sCol
string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule"; //Taille maxi de chaque cellule
string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

MonTableau = Tab_CreateTableau(GetLocalString(oObject, sDataVarName),
GetLocalInt(oObject, sColVarName),
GetLocalInt(oObject, sLignesVarName),
GetLocalInt(oObject, sTailleMaxCelluleVarName),
GetLocalString(oObject, sCaractereToCompleteVarName));

return MonTableau;
}

//******************************************************************************

void DeleteLocalTableau(object oObject, string sVarName)
{
string sDataVarName = sVarName + "String"; //Pour sData
string sLignesVarName = sVarName + "Lignes"; //Pour sLignes
string sColVarName = sVarName + "Col"; //Pour sCol
string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule"; //Taille maxi de chaque cellule
string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

DeleteLocalString(oObject, sDataVarName);
DeleteLocalInt(oObject, sLignesVarName);
DeleteLocalInt(oObject, sColVarName);
DeleteLocalInt(oObject, sTailleMaxCelluleVarName);
DeleteLocalString(oObject, sCaractereToCompleteVarName);
}

//******************************************************************************

//void main(){}

Dernière édition par Kétil Dimzad le 27/09/2006 19:04:56; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 10/09/2006 22:38:04 Sujet du message :

Voilà, c'est un peu long mais je pense que ça vaut le coup de creuser la question.

Sinon ici au moins le forum il marche bien Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique
Répondre en citant
Posté le : 11/09/2006 00:44:42 Sujet du message :

NWNX ajoute des fonctions de tableaux il me semble : [http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 11/09/2006 08:21:16 Sujet du message :

Ué, alors si tu parles des hashsets (sinon je sais pas de quoi tu parles Razz ), c'est pour récupérer les résultats d'une requête qui renvoit plusieurs lignes.

Je vois pas trop comment l'utiliser pour définir et utiliser un tableau de donnée en mémoire. Enfin un vrai tableau quoi Smile C'est ptet possible je sais pas.

En tout cas l'implémentation des fonctions de la lib "hashset_nwnx" est "externe" au nwnScript, donc si effectivement on peut manipuler des tableaux ça doit être vachement plus rapide.

Maintenant faudrait que je vois un exemple, autant pour récupérer une requête ça a pas l'air trop complexe, autant pour créer un tableau et le manipuler je vois pas, si quelqu'un a un exemple je suis preneur Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique
Répondre en citant
Posté le : 11/09/2006 11:35:15 Sujet du message :

Je sais pas je l'ai jamais testé, si ça ne correpond pas à ce que tu cherches et que tu as des connaissances en c(voir cpp j'ai pas bien regardé les sources), nwnx propose un tutoriel pour faire ton propre plugin il me semble. Personnelement je n'ai jamais eu besoin de tableaux à 2 dimension ou alors de grande taille et persistant à ce moment j'utilise nwnx connecté à une MySQL.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 12/09/2006 19:17:42 Sujet du message :

Effectivement, mais l'interet de ces libs c'est justement de ne pas avoir à passer
par une BDD, en stockant les infos sur un item no drop dans l'inventaire du PJ, ça
devient persistant, et les variables locales sont bien plus rapides que NWNX même si les traitements doivent être légers Smile

Donc ça peut être utile pour certains système. Enfin pour moi c'est utile Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 12/09/2006 19:18:50 Sujet du message :

Une nouvelle version , 3 à 4 fois plus rapide.

Si quelqu'un voit comment améliorer encore les possibilités je suis tout ouïe Smile

NWScript :

//:Confused///////////////////////// /////////////////////
//:: Name
//:: FileName  inc_string
//:: Copyright (c) 2006 MOW Corp.
//:Confused///////////////////////// ////////////////////
/*
  Bibliotheque de fonctions de gestion des strings

  Ce script est une bibliotheque.
  Il contient des fonctions additionnelles a celles
  de Bioware pour gerer les strings.

*/

//:Confused///////////////////////// ////////////////////
//:: Created By:    Marco
//:: Created On:    10/09/2006
//:Confused///////////////////////// ////////////////////

////////////////////////////// //////////////////
//DECLARATIONS DES FONCTIONS &amp; DES PROCEDURES//
////////////////////////////// ////////////////

//Retourne une string en fonction du separateur et de la position du separateur dans la string
//Retourne la chaine situee avant la position du separateur.
string GetSubStringBySeparator(string sString, string sSeparator, int nSeparator);

//Insere sString dans sDestination a la position nSeparateur de sSeparateur
//Retourne la nouvelle chaine ou une chaine vide en cas d'erreur.
string InsertStringBySeparator(string sDestination, string sString, string sSeparator,int nSeparator);

//Insere &amp; REMPLACE la ligne qui etait a l'indice nSeparator par sString dans sDestination
string ReplaceStringBySeparator(string sDestination, string sString, string sSeparator, int nSeparator);

//Complete la string sStringToComplete avec le caractere sCaractereUseToComplete jusqu'a ce
//que sStringToComplete mesure nMaxSize
string CompleteString(string sStringToComplete, string sCaractereUseToComplete, int nMaxSize);

//Remplace une morceau de sString par sStringToReplace d'une longueur egale a celle
//de sStringToReplace a partir de nPosition dans sString
string ReplaceString(string sString, string sStringToReplace, int nPosition);

//Supprime le caractere sStringToDelete de la chaine sString
//Retourne la nouvelle sString.
string SupprimeUnString(string sString, string sStringToDelete);

////////////////////////////// //////////////////////
//IMPLEMENTATION DES FONCTIONS &amp; DES PROCEDURES Confused/
////////////////////////////// ////////////////////


string GetSubStringBySeparator(string sString, string sSeparator, int nSeparator)
{
    string sWorkingString = sString;

    int nCount = 1;
    while(sWorkingString != "")
        { //trouve le 1er separateur a partir de la gauche.
            int nPosSeparator = FindSubString(sWorkingString, sSeparator);
            if (nPosSeparator == -1)
                {
                    return ""; //erreur, on renvoi une chaine vide.
                }
            else
                {
                    if (nCount == nSeparator)//on est sur le bon separateur
                        { //on renvoit le resultat
                            return GetStringLeft(sWorkingString,(nPosSeparator));
                        }
                    else
                        {
                            int nLong = (GetStringLength(sWorkingString)-nPosSeparator);
                            sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
                            nCount++;
                        }
                }
        }
    return ""; //erreur, on renvoi une chaine vide.
}

//**************************** ****************************** ********************

string InsertStringBySeparator(string sDestination, string sString, string sSeparator,int nSeparator)
{
    string sWorkingString = sDestination;
    string sTampon = "";

    if (nSeparator == 1) //si la position d'insertion est 1
    {//on se prend pas la tete
        return sString+sDestination;
    }

    int nCount = 1;
    while(sWorkingString != "")
        { //trouve le 1er separateur a partir de la gauche.
            int nPosSeparator = FindSubString(sWorkingString, sSeparator);
            if (nPosSeparator == -1)
                {
                    //si on trouve pas le separateur c'est qu'on est au bout donc on fait un ajout
                    //On part du principe que la chaine est correctement formatee donc pas de traitement d'erreur
                    //si la nCount = nSeparator, alors c'est que l'insertion doit etre en fait un simple
                    //ajout de ligne !!!
                    if (nCount == (nSeparator))
                    {
                        return sDestination+sString;
                    } //Note : On gere cette possibilite pour pouvoir coder les fonctions de tri.
                }
            else
                {
                    if (nCount == nSeparator)//on est sur le bon separateur
                        {
                            return sTampon+sString+sWorkingString;
                        }
                    else
                        {
                            int nLong = (GetStringLength(sWorkingString)-nPosSeparator);
                            sTampon += GetStringLeft(sWorkingString,(nPosSeparator+1));
                            sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
                            nCount++;
                        }
                }
        }
    //On arrive ici quand sWorkingString est vide, on est a nSeparator
    //si ici nCount = nSeparator, alors c'est que l'insertion doit etre en fait un simple
    //ajout de ligne !!!
    if (nCount == (nSeparator))
    {
        return sDestination+sString;
    }

    //Pour la compil :
    return "";
}

//**************************** ****************************** ********************

string ReplaceStringBySeparator(string sDestination, string sString, string sSeparator, int nSeparator)
{
    string sWorkingString = sDestination;
    string sTampon = "";

    int nCount = 1;
    while(sWorkingString != "")
        { //trouve le 1er separateur a partir de la gauche.
            int nPosSeparator = FindSubString(sWorkingString, sSeparator);
            if (nPosSeparator == -1)
                {
                    return ""; //erreur, on renvoi une chaine vide.
                }
            else
                {
                    if (nCount == nSeparator)//on est sur le bon separateur
                        { //on renvoit le resultat
                            int nLong = (GetStringLength(sWorkingString)-nPosSeparator);
                            sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);

                            return sTampon+sString+sWorkingString;
                        }
                    else
                        {
                            int nLong = (GetStringLength(sWorkingString)-nPosSeparator);
                            sTampon += GetStringLeft(sWorkingString,(nPosSeparator+1));
                            sWorkingString = GetSubString(sWorkingString, nPosSeparator+1, nLong);
                            nCount++;
                        }
                }
        }
    return ""; //erreur, on renvoi une chaine vide.
}

//**************************** ****************************** ********************

string CompleteString(string sStringToComplete, string sCaractereUseToComplete, int nMaxSize)
{
    int nTaille = GetStringLength(sStringToComplete);
    int nI = 1;

    while(nI <= (nMaxSize-nTaille))
    {
        sStringToComplete += sCaractereUseToComplete;
        nI++;
    }
    return sStringToComplete;
}

//**************************** ****************************** ********************

string ReplaceString(string sString, string sStringToReplace, int nPosition)
{
    int nLongToReplace = GetStringLength(sStringToReplace);
    int nLongTotale = GetStringLength(sString);

    //si sStringToReplace plus grand que sString ---&gt; erreur
    if (nLongToReplace > nLongTotale)
    {
        return "";
    }

    //Combien de positions dans sString ?
    int nNbPosition = nLongTotale / nLongToReplace;

    //si on veut inserer a une position &gt; nb de positions totale, erreur
    if (nPosition > nNbPosition)
    {
        return "";
    }

    int nLongDebut, nPosFin, nLongFin;
    nLongDebut = (nLongToReplace * (nPosition - 1)) ;
    nPosFin = nNbPosition - nPosition;
    nLongFin = nPosFin * nLongToReplace;

    string sDebut = GetStringLeft(sString, nLongDebut);
    string sFin = GetStringRight(sString, nLongFin);

    return sDebut + sStringToReplace + sFin;

}

//**************************** ****************************** ********************

string SupprimeUnString(string sString, string sStringToDelete)
{
    if(GetStringLength(sStringToDelete) > 1)
    { //un seul caractere autorise pour sStringToDelete
        return "";
    }

    int nI = 0;
    int nLong = GetStringLength(sString);
    string sNewString = "";
    string sTest = "";

    while(nI < nLong)
    {
        sTest = GetSubString(sString, nI, 1);
        if(sTest != sStringToDelete)
        {
            sNewString += sTest;
        }
        sTest = "";
        nI++;
    }

    return sNewString;
}


//void main() {}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 12/09/2006 19:20:26 Sujet du message :

Ca c'était des fonctions pour gérer les strings, dont certaines ( les 3 premières sont devenues inutiles au système m'enfin ça peut toujours être utile pour autre chose je sais pas alors je laisse Smile )

Donc la suite : (c'est un peu long mébon...)

NWScript :

//:Confused//////////////////////////////////////////////
//:: Name
//:: FileName  inc_tableaux
//:: Copyright (c) 2006 MOW Corp.
//:Confused/////////////////////////////////////////////
/*
  Bibliotheque de fonctions de gestion des tableaux

  Ce script est une bibliotheque.
  Il contient toutes les fonctions utilisees pour
  emuler des tableaux a 2 dimensions avec le nwnScript.

  Limitations :
  - 1 a n colonnes dans le tableau. (plus on en mets, moins faut mettre de lignes normal )
  - nb de lignes 60 lignes pour un tableau 4 colonnes de 32 caracteres par cellules.
    On peut ptet pousser au dela mais a 75-80 ---> TOO MANY INSTRUCTIONS, nwn jette l'eponge.
  - Oblige de passer par des strings. Donc si une colonne
    ne contient que des int ou des floats il ne faudra pas
    oublier de faire les conversions.
  - Les Tris : Necessite des tableaux 2 a 3 fois moins gros que ce qui est dit
    juste au dessus sinon TOO MANY INSTRUCTIONS
*/
//:Confused/////////////////////////////////////////////
//:: Created By:    Marco
//:: Created On:    09/09/2006
//:Confused/////////////////////////////////////////////

#include "inc_string"

///////////////////////////////
//DECLARATION DES STRUCTURES//
/////////////////////////////
//La ligne d'indice 1 d'un tableau est la premiere ligne.
struct Tableau {
    string sData; //La chaine contenant les donnees
    int nCol;    //Le nb de colonnes (aucune utilite pour le moment. Mis a la creation, pas touche depuis)
    int nLignes;  //Le nb de lignes (seule utilite, connaitre le nb de ligne tres vite)
    int nTailleMaxCellule;  //Taille maxi de chaque cellule.
    string sCaractereToComplete; //Caractere utilise pour completer les donnees des cellules.
};

///////////////////////////////
//DECLARATION DES CONSTANTES//
/////////////////////////////



/////////////////////////////////////////////////
//REGLE DE CONSTRUCTION DES DONNEES DU TABLEAU//
///////////////////////////////////////////////
/*

La taille des cellules est limitee a la creation du tableau.(cf la structure)
Ainsi, a chaque fois qu'une donnee est ajoutee dans une cellule, elle est
complete avec un caractere pre-defini (cf la structure) pour aller jusqu'a
la taille max de la cellule.

Cette methode permet d'eviter toutes les boucles de la version precedente
de inc_tableaux ou l'on construisait les cellules puis les lignes avec des
separateurs.

Je trouve pas de systeme pour donner aux cellules une taille dynamique tout en
evitant au maximum les boucles. Si quelqu'un a idee je suis preneur, ca reduirait
encore + les ressources necessaire...

*/


////////////////////////////////////////////////
//DECLARATIONS DES FONCTIONS & DES PROCEDURES//
//////////////////////////////////////////////

//Cree un tableau. Le tableau est en fait une structure composee de :
//string sData  :...................une chaine qui contient toutes les donnees
//int nNbCol    :...................le nombre de colonnes du tableau
//int nNbLignes :...................le nombre de lignes
//int nTailleMaxCellule :...........taille maxi de chaque cellule du tableau
//string sCaractereToComplete :.....le caractere qui sert a completer les cellules
//Retourne le tableau cree.
struct Tableau Tab_CreateTableau(string sData, int nNbCol, int nNbLignes, int nTailleMaxCellule, string sCaractereToComplete);

//Retourne la cellule (AVEC les caracteres qui completent) place dans le tableau :
//a l'indice nIndiceCol pour les X
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabCelluleComplete(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne);

//Retourne la ligne (AVEC les caracteres qui completent) placee dans le tableau :
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabLigneComplete(struct Tableau MonTableau, int nIndiceLigne);

//Retourne la cellule (SANS les caracteres qui completent) place dans le tableau :
//a l'indice nIndiceCol pour les X
//a l'indice nIndiceLigne pour les Y
string Tab_GetTabCellule(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne);

//Retourne la ligne (SANS les caracteres qui completent) placee dans le tableau :
//a l'indice nIndiceLigne pour les Y
string Tab_GetTableLigne(struct Tableau MonTableau, int nIndiceLigne);

//Remplace une ligne du tableau a l'indice nIndiceToReplace avec la ligne sLigneToReplace
//Retourne le nouveau tableau
struct Tableau Tab_ReplaceLigne(struct Tableau MonTableau, string sLigneToReplace, int nIndiceToReplace);

//Utilisee pour construire une ligne. Ajoute une cellule a la ligne que l'ont veut construire.
//Les caracteres manquants sont completes pour arriver a MonTableau.nTailleMaxCellule
//sNewLigne = Chaine vide pour la 1ere cellule de la ligne.
//Retourne sNewLigne construite.
string Tab_SetNewCellule(string sNewLigne, string sNewCellule, string sCaractereUseToComplete ,int nMaxSize);

//Ecrit une nouvelle ligne dans le tableau a la fin du tableau
//La ligne doit etre formatee correctement. Pour construire une ligne, utiliser la fonction
//Tab_SetNewCellule et boucler dessus jusqu'a avoir le nb de cellule composant la ligne.
//Retourne le nouveau tableau.
struct Tableau Tab_SetNewLigne(struct Tableau MonTableau, string sNewLigne);

//Insere une ligne sNewLigne a la position nIndiceInsertion
//Retourne le nouveau tableau.
struct Tableau Tab_InsertNewLigne(struct Tableau MonTableau, string sNewLigne, int nIndiceInsertion);

//Supprime la ligne d'indice nIndiceToDelete du tableau MonTableau
//Retourne le nouveau tableau.
//ATTENTION : Supprimer une ligne decale tous les indices > nIndiceToDelete de -1
struct Tableau Tab_DeleteLigne(struct Tableau MonTableau, int nIndiceToDelete);


/////////////////////////////////////////
//***  FONCTIONS DE TRI DES TABLEAUX Confused
///////////////////////////////////////

//Fonction interne du tri Tab_TrieTableauParInsertion
struct Tableau DecaleTabTriParInsertion(struct Tableau MonTableau, int nPosition, int nIndiceCol);

//Trie le tableau
//Algorithme utilise : Tri par insertion (pas Dychotomique car certaines structures de controle indisponibles en nwnScript(ex : Do... While)
//struct Tableau MonTableau : Le tableau a trier
//int nNumCol : defini sur quel numero de colonne on trie le tableau
//******************************************************************
//NOTE_1 : On ne peut trier que sur des int (ptet des floats mais pas essaye) donc
//il faut faire attention sur la colonne a trier sinon ca renvoie vide ("").
//NOTE_2 : A preferer au tri par selection si tableau partiellement trié
//Retourne le nouveau tableau trié.
struct Tableau Tab_TrieTableauParInsertion(struct Tableau MonTableau, int nNumCol);

//Fonction interne de Tab_TrieTableauParSelection
struct Tableau EchangeTabTriParSelection(struct Tableau MonTableau, int nI, int nJ, int nIndiceCol);

//Fonction interne de Tab_TrieTableauParSelection
struct Tableau PlusPetitTabTriParSelection(struct Tableau MonTableau, int nPd, int nN, int nIndiceCol);

//Trie le tableau
//Algorithme utilise : Tri par selection (pas Dychotomique car certaines structures de controle indisponibles en nwnScript(ex : Do... While)
//struct Tableau MonTableau : Le tableau a trier
//int nNumCol : defini sur quel numero de colonne on trie le tableau
//******************************************************************
//NOTE_1 : On ne peut trier que sur des int (ptet des floats mais pas essaye) donc
//il faut faire attention sur la colonne a trier sinon ca renvoie vide ("").
//NOTE_2 : A preferer au tri par insertion si tableau totalement desordonne
//Retourne le nouveau tableau trié.
struct Tableau Tab_TrieTableauParSelection(struct Tableau MonTableau, int nNumCol);


/////////////////////////////////////////////////////
//***  GESTION EN VARIABLES LOCALES DES TABLEAUX Confused
///////////////////////////////////////////////////

//Enregistre le Tableau MonTableau de nom sVarName sur l'objet oObject.
void SetLocalTableau(object oObject, string sVarName, struct Tableau MonTableau);

//Renvoi une structure Tableau nommee sVarName.
//Retourne une structure vide en cas d'erreur.
struct Tableau GetLocalTableau(object oObject, string sVarName);

//Supprime le tableau de nom sVarName stocke sur oObject.
void DeleteLocalTableau(object oObject, string sVarName);


////////////////////////////////////////////////////
//IMPLEMENTATION DES FONCTIONS & DES PROCEDURES Confused/
//////////////////////////////////////////////////

struct Tableau Tab_CreateTableau(string sData, int nNbCol, int nNbLignes, int nTailleMaxCellule, string sCaractereToComplete)
{
    struct Tableau MonTableau;  //Declaration de la structure

    MonTableau.sData = sData; //La chaine contenant les donnees
    MonTableau.nCol = nNbCol;    //Le nb de colonnes
    MonTableau.nLignes = nNbLignes;  //Le nb de lignes
    MonTableau.nTailleMaxCellule = nTailleMaxCellule; //Taille max des cellules
    MonTableau.sCaractereToComplete = sCaractereToComplete; //Caract. pour completer les cells.

    return MonTableau;  //On a cree le tableau, et on le retourne
}

//******************************************************************************

string Tab_GetTabCelluleComplete(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne)
{
    string sCellule, sLigne;
    int nStart, nCount;
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

    nCount = MonTableau.nTailleMaxCellule;
    nStart = (nIndiceCol-1) * nCount;

    sLigne = Tab_GetTabLigneComplete(MonTableau, nIndiceLigne);

    sCellule = GetSubString(sLigne, nStart, nCount);

    return sCellule;
}

//******************************************************************************

string Tab_GetTabLigneComplete(struct Tableau MonTableau, int nIndiceLigne)
{
    int nStart, nCount;
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

    nStart = (nIndiceLigne-1) * nLongLigne;

    string sLigne = GetSubString(MonTableau.sData, nStart, nLongLigne);

    return sLigne;
}

//******************************************************************************

string Tab_GetTabCellule(struct Tableau MonTableau, int nIndiceCol, int nIndiceLigne)
{
    string sCellule, sLigne;
    int nStart, nCount;
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

    nCount = MonTableau.nTailleMaxCellule;
    nStart = (nIndiceCol-1) * nCount;

    sLigne = Tab_GetTabLigneComplete(MonTableau, nIndiceLigne);

    sCellule = SupprimeUnString(GetSubString(sLigne, nStart, nCount), MonTableau.sCaractereToComplete);

    return sCellule;
}

//******************************************************************************

string Tab_GetTableLigne(struct Tableau MonTableau, int nIndiceLigne)
{
    int nStart, nCount;
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

    nStart = (nIndiceLigne-1) * nLongLigne;

    string sLigne = SupprimeUnString(GetSubString(MonTableau.sData, nStart, nLongLigne), MonTableau.sCaractereToComplete);

    return sLigne;
}

//******************************************************************************

struct Tableau Tab_ReplaceLigne(struct Tableau MonTableau, string sLigneToReplace, int nIndiceToReplace)
{
    string sDataTab = ReplaceString(MonTableau.sData, sLigneToReplace, nIndiceToReplace);
    MonTableau.sData = sDataTab;

    return MonTableau;
}

//******************************************************************************

string Tab_SetNewCellule(string sNewLigne, string sNewCellule,
                        string sCaractereUseToComplete ,int nMaxSize)
{
    sNewLigne += CompleteString(sNewCellule, sCaractereUseToComplete, nMaxSize);
    return sNewLigne;
}

//******************************************************************************

struct Tableau Tab_SetNewLigne(struct Tableau MonTableau, string sNewLigne)
{
    int nNbLignes = MonTableau.nLignes;
    nNbLignes++;
    MonTableau.nLignes = nNbLignes;

    string sDataTab = MonTableau.sData;
    sDataTab += sNewLigne;
    MonTableau.sData = sDataTab;

    return MonTableau;
}

//******************************************************************************

struct Tableau Tab_InsertNewLigne(struct Tableau MonTableau, string sNewLigne, int nIndiceInsertion)
{
    int nNbLignes = MonTableau.nLignes;
    nNbLignes++;
    MonTableau.nLignes = nNbLignes;

    int nPosition;
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;

    nPosition = (nIndiceInsertion-1) * nLongLigne;

    MonTableau.sData = InsertString(MonTableau.sData, sNewLigne, nPosition);

    return MonTableau;
}

//******************************************************************************

struct Tableau Tab_DeleteLigne(struct Tableau MonTableau, int nIndiceToDelete)
{
    int nLongLigne = MonTableau.nTailleMaxCellule * MonTableau.nCol;
    string sDataGauche = "";
    string sDataDroite = "";
    int nTailleData = GetStringLength(MonTableau.sData);
    int nNbPositions = nTailleData / nLongLigne;
    int nCountGauche = ((nIndiceToDelete - 1) * nLongLigne);
    int nCountDroite = ((nNbPositions - nIndiceToDelete) * nLongLigne);
    if (nCountGauche < 0)
    {
        nCountGauche = 0;
    }
    if (nCountDroite < 0)
    {
        nCountDroite = 0;
    }

    sDataGauche = GetStringLeft(MonTableau.sData, nCountGauche);

    sDataDroite = GetStringRight(MonTableau.sData, nCountDroite);

    MonTableau.sData = sDataGauche + sDataDroite;

    return MonTableau;
}

//******************************************************************************

struct Tableau DecaleTabTriParInsertion(struct Tableau MonTableau, int nPosition, int nIndiceCol)
{
    int nDpg = nPosition-1;
    struct Tableau WorkingTableau = MonTableau;

    string sTamponCellule = Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nPosition);
    string sTamponLigne = Tab_GetTabLigneComplete(WorkingTableau, nPosition);

    while ( ( StringToInt((Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nDpg))) > StringToInt(sTamponCellule) ) && (nDpg >= 0) )
    {
        WorkingTableau = Tab_ReplaceLigne(WorkingTableau, (Tab_GetTabLigneComplete(WorkingTableau, nDpg)),(nDpg+1));
        nDpg--;
    }
    WorkingTableau = Tab_ReplaceLigne(WorkingTableau, sTamponLigne, (nDpg+1));
    return WorkingTableau;
}

//******************************************************************************

struct Tableau Tab_TrieTableauParInsertion(struct Tableau MonTableau, int nNumCol)
{
    struct Tableau WorkingTableau = MonTableau;
    int nPosition;
    for(nPosition = 1; nPosition < WorkingTableau.nLignes+1; nPosition++)
    {
        WorkingTableau = DecaleTabTriParInsertion(WorkingTableau, nPosition, nNumCol);
    }
    return WorkingTableau;
}

//******************************************************************************

struct Tableau EchangeTabTriParSelection(struct Tableau MonTableau, int nI, int nJ, int nIndiceCol)
{
    struct Tableau WorkingTableau = MonTableau;
    string sTamponCellule = Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nI);
    string sTamponLigne = Tab_GetTabLigneComplete(WorkingTableau, nI);

    WorkingTableau = Tab_ReplaceLigne(WorkingTableau, (Tab_GetTabLigneComplete(WorkingTableau, nJ)),(nI));
    WorkingTableau = Tab_ReplaceLigne(WorkingTableau, sTamponLigne, nJ);

    return WorkingTableau;
}
//******************************************************************************

struct Tableau PlusPetitTabTriParSelection(struct Tableau MonTableau, int nPd, int nN, int nIndiceCol)
{
    struct Tableau WorkingTableau = MonTableau;

    int nI;
    int nPp = nPd;

    for(nI = nPd+1; nI < nN; nI++)
        {
            if ( StringToInt(Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nI)) < StringToInt(Tab_GetTabCelluleComplete(WorkingTableau, nIndiceCol, nPp)) )
            {
                nPp = nI;
            }
        }

    WorkingTableau = EchangeTabTriParSelection(WorkingTableau, nPp, nPd, nIndiceCol);

    return WorkingTableau;
}
//******************************************************************************

struct Tableau Tab_TrieTableauParSelection(struct Tableau MonTableau, int nNumCol)
{
    struct Tableau WorkingTableau = MonTableau;

    int nPd;
    int nN = WorkingTableau.nLignes+1;

    for(nPd = 1; nPd < (nN-1); nPd++)
    {
        WorkingTableau = PlusPetitTabTriParSelection(WorkingTableau, nPd, nN, nNumCol);
    }

    return WorkingTableau;
}

//******************************************************************************

void SetLocalTableau(object oObject, string sVarName, struct Tableau MonTableau)
{
    string sDataVarName = sVarName + "String";                        //Pour sData
    string sLignesVarName = sVarName + "Lignes";                      //Pour sLignes
    string sColVarName = sVarName + "Col";                            //Pour sCol
    string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule";  //Taille maxi de chaque cellule
    string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

    SetLocalString(oObject, sDataVarName, MonTableau.sData);
    SetLocalInt(oObject, sLignesVarName, MonTableau.nLignes);
    SetLocalInt(oObject, sColVarName, MonTableau.nCol);
    SetLocalInt(oObject, sTailleMaxCelluleVarName, MonTableau.nTailleMaxCellule);
    SetLocalString(oObject, sCaractereToCompleteVarName, MonTableau.sCaractereToComplete);

}

//******************************************************************************

struct Tableau GetLocalTableau(object oObject, string sVarName)
{
    struct Tableau MonTableau;
    string sDataVarName = sVarName + "String";      //Pour sData
    string sLignesVarName = sVarName + "Lignes";    //Pour sLignes
    string sColVarName = sVarName + "Col";          //Pour sCol
    string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule";  //Taille maxi de chaque cellule
    string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

    MonTableau = Tab_CreateTableau(GetLocalString(oObject, sDataVarName),
                                  GetLocalInt(oObject, sColVarName),
                                  GetLocalInt(oObject, sLignesVarName),
                                  GetLocalInt(oObject, sTailleMaxCelluleVarName),
                                  GetLocalString(oObject, sCaractereToCompleteVarName));

    return MonTableau;
}

//******************************************************************************

void DeleteLocalTableau(object oObject, string sVarName)
{
    string sDataVarName = sVarName + "String";      //Pour sData
    string sLignesVarName = sVarName + "Lignes";    //Pour sLignes
    string sColVarName = sVarName + "Col";          //Pour sCol
    string sTailleMaxCelluleVarName = sVarName + "TailleMaxCellule";  //Taille maxi de chaque cellule
    string sCaractereToCompleteVarName = sVarName + "CaractCompletion";//Caractere de completion

    DeleteLocalString(oObject, sDataVarName);
    DeleteLocalInt(oObject, sLignesVarName);
    DeleteLocalInt(oObject, sColVarName);
    DeleteLocalInt(oObject, sTailleMaxCelluleVarName);
    DeleteLocalString(oObject, sCaractereToCompleteVarName);
}

//******************************************************************************

//void main(){}

Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 18/09/2006 12:47:35 Sujet du message :

- Nwn étant un jeu temps réel : il y a une limite au nombre maximal d'instructions / temps d'éxécution d'un script.
- Il serait avisé de mettre tes longs scripts en mode spoiler.
- Une petite suggestion technique à explorer :
la campaign database nwn est indexée, bien qu'elle soit super-lente d'accès c'est une possibilité d'optimisation pour une recherche lorsqu'elle est conjuguée à un RAM-disk

NWScript :
GetCampaignInt("ARRAY","C"+IntToString(i))
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


"C"+IntToString(i) (ou même IntToString(i) tout court) sera rapidement retrouvé par l'indexation.
Donc à fortiori la recherche d'une variable de la forme IntToString(i) + "Separateur" + IntToString(j) utile pour un tableau T(i,j)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Kétil Dimzad
Ecuyer
Inscrit le: 10 Oct 2003
Messages: 62
Localisation: Fijj'Bool City
Répondre en citant
Posté le : 24/09/2006 15:40:55 Sujet du message :

Je t'avouerai que je comprends pas où est le bénéfice dans la mesure où il faut d'abord écrire avant de lire Smile

Dsl je comprends pas l'intérêt.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Numéro ICQ Ignorer l'utilisateur
 
Macadam
Grand Chevalier
Inscrit le: 07 Avr 2006
Messages: 132
Répondre en citant
Posté le : 25/09/2006 10:39:48 Sujet du message :

personnellement je t'avouerais que je lis pas les scripts ecrits en mode spoiler, jamais compris l'intéret non plus Embarassed
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 30/09/2006 01:00:58 Sujet du message :

Parce que c'est poli de penser à la mise en page tudieu !
En général on met la partie technique en annexe (ici spoiler) pour se concentrer sur la discussion.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 76.795ms