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


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 12/05/2007 18:55:35 Sujet du message : FindSubString et GetSubString

Bonjour.

Je suis bloqué a un telle point que j'fais 1 script pour verifier plein de truc, mais j'ai l'impression que c'est deux fonctions sont completement buggué !

Bon je vous explique mon problème ;

Dans mon module j'autorise que les lettres de :
- A à Z
- a à z
- 1 à 9
- ', _ et -
C'est règle son mise pour pouvoir detruire les fichiers.bic sans trop soucis.

Bref, j'ai donc fait un script pour convertir le nom du joueur en fichier.bic à savoir que un fichier.bic c'est :
- Pas plus de 16 lettres
- Petites lettres
- Les caracteres que j'ai autorisé

voici mon script (c'est une fonction) :

NWScript :
string NF_GetFileBicName(object oPC)
{
string sName = GetName(oPC);
sName = GetStringLowerCase(sName);
string sCheck = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ123456789'_-";
string sBic;
int i = 1;
int iLenght = GetStringLength(sName);
    while(i <= iLenght)
    {
        if(FindSubString(sName, GetSubString(sCheck, i, 1)) != -1)
        {
        sBic += GetSubString(sName, i, 1);
        }
        else
        {
        sBic += "";
        }
    i++;
    }
    if(GetStringLength(sBic) > 16)
    {
    sBic =GetSubString(sBic, 0, 16);
    }
return sBic;
}
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.


Donc on regarde chaque lettre de sName grâce a tout ce que j'ai autorisé (on regarde les autorisations dans sCheck). Bein pas moyen, ça bug ! Il accepte tout, même les caractères que je veux pas...

Pourtant à ma connaissance -1 siginifie : n'est pas dedans.

Donc j'ai fait un script pour verifier ... bein la c'est pire que ce que je croyais :

NWScript :
void main()
{
object oPC = GetLastUsedBy();
string sName = GetName(oPC);
string sRefu = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ123456789'_-";
int i = 0;
int iLength = GetStringLength(sName);
    while(i <= iLength)
    {
        if(FindSubString(sName, GetSubString(sRefu, i, 1)) == -1)
        {
        SendMessageToPC(oPC, "F(-1) : "+GetSubString(sName, i, 1));
        }
        else if(FindSubString(sName, GetSubString(sRefu, i, 1)) == 0)
        {
        SendMessageToPC(oPC, "F(0) : "+GetSubString(sName, i, 1));
        }
        else if(FindSubString(sName, GetSubString(sRefu, i, 1)) == 1)
        {
        SendMessageToPC(oPC, "F(1) : "+GetSubString(sName, i, 1));
        }
        else if(FindSubString(sName, GetSubString(sRefu, i, 1)) == 2)
        {
        SendMessageToPC(oPC, "F(2) : "+GetSubString(sName, i, 1));
        }
        else if(FindSubString(sName, GetSubString(sRefu, i, 1)) == 3)
        {
        SendMessageToPC(oPC, "F(3) : "+GetSubString(sName, i, 1));
        }
        else if(FindSubString(sName, GetSubString(sRefu, i, 1)) == -2)
        {
        SendMessageToPC(oPC, "F(-2) : "+GetSubString(sName, i, 1));
        }
        else
        {
        SendMessageToPC(oPC, "Ta mere");
        }
    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.


Et bien... je sais pas, défois ça va dans -1 défois dans 0 défois dans 2 et même 1 fois ça m'a dit "Ta mere" Razz (je savais pas quoi mettre -.-)

Quelqu'un peut m'expliquer précisément cette fonction très chiante ??

Merci
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 12/05/2007 22:01:05 Sujet du message :

Je vois plusieurs problème à première vue, après je sais pas si ça vient de là.

En premier :
Code :
 int i = 0;
 // Et non pas :
 int i = 1;

Ce n'est pas bon, car tu l'utilise pour faire une recherche (avec GetSubString) après en prenant i comme référence dans la chaîne de caractère, mais il faut savoir que ça commence à 0 une chaîne, donc tu loupera le premier caractère.


Ensuite :
Code :
 string sName = GetName(oPC);
 sName = GetStringLowerCase(sName);

 string sCheck = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ123456789'_-";

Bon rien de grave, mais tu fait un LowerCase et dans ta variable de sCheck tu as mit des majuscules, juste pour dire que c'est inutile.


Après :
NWScript :
while(i <= iLenght)
{
  if(FindSubString(sName, GetSubString(sCheck, i, 1)) != -1)
  {
  sBic += GetSubString(sName, i, 1);
  }
  else
  {
  sBic += "";
  }
  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.

Alors là je vais essayer d'être clair, pour celà on va prendre un exemple de nom :
- Sunândrim Olentasse
- sunândrim olentasse//Après le LowerCase
- iLenght = 19 caractères

Si on prend ta boucle tel quel (en prenant en compte mon changement de i=0), dans un premier temps du test si i < 19, donc si oui (attention tout se passe là ^^) :

Tu test dans sName si tu trouve le caractère à la position i dans sCheck.
Donc dans le cas présent tu test :
- au 1er passage si il y a "a" dans sName
- au 2em passage si il y a "A" dans sName
- au 3em passage si il y a "b" dans sName
- ...
- au 18em passage si il y a "I" dans sName
- au 19em passage si il y a "j" dans sName

Tu devrais plutôt tester dans sCheck si tu trouve le caractère à la position i dans sName.
Du coup tu test :
- au 1er passage si il y a "s" dans sCheck
- au 2em passage si il y a "u" dans sCheck
- au 3em passage si il y a "n" dans sCheck
- ...
- au 17em passage si il y a "s" dans sCheck
- au 18em passage si il y a "s" dans sCheck
- au 19em passage si il y a "e" dans sCheck

Du coup on trouvera "sunndrimolentass" car :
- le â etant exclu.
- l'espace étant exclu aussi.
- le e de la fin supprimer sinon on fesait 17 caractères.

Sinon tu peux supprimer ça :
Code :
  else
  {
   sBic += "";
  }


Voilà voilou (pas facile d'expliquer des boucles ;p)
_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 13/05/2007 09:11:44 Sujet du message :

Merci de ta longue explication =)

J'ai remarqué que vaut mieux mettre aussi : < 0 pour dire "ne possede pas" et >= 0 pour dire "possede".

Par contre truc vraiment très louche : les fichiers.bic la, ils sont pas un peu nommé au pif? Parce que moi j'ai mit un nom comme ça

Cham""'-'--Smith

quand je regarde le fichier.bic c'est : cham""'-'èè.bic

Logique??

Merci

EDIT:

NWScript :
while(i <= iLenght)
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.


Il faut mettre à la place iLength - 1 car j'ai aussi un script NF_HasValidName(object oPC); et comme i = 0 il fait ce calcule :

De 0 pour aller a iLenght : il compte le zéro donc si iLength = 10 lui il va compté 11.

Voilou Wink
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 13/05/2007 10:58:41 Sujet du message :

C'est bien pour ça que j'avais juste mit < et non <=


Ivellios a écrit :
du test si i < 19

_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger 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 53.394ms