PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → boucle tant que
boucle tant que
Started by cedric, Mar., 30 2006 4:35 PM - 13 replies
Posted on March, 30 2006 - 4:35 PM
j'ai un petit probleme avec une boucle "tant que": au début de mon prog j'ai déclaré 2 tableaux de dimensions 10, ensuite j'ai une variable j initialisée a 1 et quand je rentre dans ma boucle "tant que" j'ai une erreur de ce genre :
"La dimension 1 du tableau possède 10 élément(s) et vous tentez d'accéder à l'élément 11."

voici mon code si cela peut vous aider : ( probleme au niveau de 2 eme tant que )

CONNEXION est une chaîne
CONNEXION = SQLConnecte("CODIF", "sa", "sa", "CODIF", "hODBC")

REQ est une chaîne = [
SELECT login, mdp FROM Login
]
SQLExec(REQ, "AUTH")
tabVar_pseudo est un tableau fixe de 10 chaînes
tabVar_mdp est un tableau fixe de 10 chaînes
i est un entier = 0

TANTQUE SQLAvance("AUTH") = 0
i++
tabVar_pseudo[i] = SQLLitCol("AUTH",1)
tabVar_mdp[i] = SQLLitCol("AUTH",2)
FIN

j est un entier = 1
TANTQUE ((tabVar_pseudo[j] <> SAIS_PSEUDO ET tabVar_mdp[j] <> SAIS_MDP) OU j<=i)
j++
FIN

SI (tabVar_pseudo[j] = SAIS_PSEUDO ET tabVar_mdp[j] = SAIS_MDP) ALORS
Info(" Bienvenue dans CODIF !")
SINON
Info(" Login et/ou mot de passe erroné(s) !")
FIN

SQLFerme("AUTH")
Posted on March, 30 2006 - 4:45 PM
tu as plus de 10 logins
passe sur des tableaux dynamiques

cedric a exprimé avec précision :
j'ai un petit probleme avec une boucle "tant que": au début de mon prog j'ai
déclaré 2 tableaux de dimensions 10, ensuite j'ai une variable j initialisée
a 1 et quand je rentre dans ma boucle "tant que" j'ai une erreur de ce genre :
"La dimension 1 du tableau possède 10 élément(s) et vous tentez d'accéder à
l'élément 11."

voici mon code si cela peut vous aider : ( probleme au niveau de 2 eme tant
que )

CONNEXION est une chaîne
CONNEXION = SQLConnecte("CODIF", "sa", "sa", "CODIF", "hODBC")

REQ est une chaîne = [
SELECT login, mdp FROM Login
]
SQLExec(REQ, "AUTH")
tabVar_pseudo est un tableau fixe de 10 chaînes
tabVar_mdp est un tableau fixe de 10 chaînes
i est un entier = 0

TANTQUE SQLAvance("AUTH") = 0
i++
tabVar_pseudo[i] = SQLLitCol("AUTH",1)
tabVar_mdp[i] = SQLLitCol("AUTH",2)
FIN

j est un entier = 1
TANTQUE ((tabVar_pseudo[j] <> SAIS_PSEUDO ET tabVar_mdp[j] <> SAIS_MDP) OU
j<=i) j++
FIN

SI (tabVar_pseudo[j] = SAIS_PSEUDO ET tabVar_mdp[j] = SAIS_MDP) ALORS
Info(" Bienvenue dans CODIF !")
SINON
Info(" Login et/ou mot de passe erroné(s) !")
FIN

SQLFerme("AUTH")


--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Posted on March, 30 2006 - 5:01 PM
Je n'ai qu'actuellement 2 logins ( logins de test pour mon prog )
Posted on March, 30 2006 - 5:01 PM
Dans sa contribution <442d2082$1@news.pcsoft.fr>, boucherc@info.iut-amiens.fr racontait :

j'ai un petit probleme avec une boucle "tant que": au début de mon prog j'ai déclaré 2 tableaux de dimensions 10, ensuite j'ai une variable j initialisée a 1 et quand je rentre dans ma boucle "tant que" j'ai une erreur de ce genre :
"La dimension 1 du tableau possède 10 élément(s) et vous tentez d'accéder à l'élément 11."

voici mon code si cela peut vous aider : ( probleme au niveau de 2 eme tant que )

CONNEXION est une chaîne
CONNEXION = SQLConnecte("CODIF", "sa", "sa", "CODIF", "hODBC")

REQ est une chaîne = [
SELECT login, mdp FROM Login
]
SQLExec(REQ, "AUTH")
tabVar_pseudo est un tableau fixe de 10 chaînes
tabVar_mdp est un tableau fixe de 10 chaînes
i est un entier = 0

TANTQUE SQLAvance("AUTH") = 0
i++
tabVar_pseudo[i] = SQLLitCol("AUTH",1)
tabVar_mdp[i] = SQLLitCol("AUTH",2)
FIN

j est un entier = 1
TANTQUE ((tabVar_pseudo[j] <> SAIS_PSEUDO ET tabVar_mdp[j] <> SAIS_MDP) OU j<=i)
j++
FIN

SI (tabVar_pseudo[j] = SAIS_PSEUDO ET tabVar_mdp[j] = SAIS_MDP) ALORS
Info(" Bienvenue dans CODIF !")
SINON
Info(" Login et/ou mot de passe erroné(s) !")
FIN

SQLFerme("AUTH")


Deja 2 réponses postées a ta premiere demande !

--
Lionel

mailto:lionel.breil*NOSPAM*@gmail.com
(retirer *NOSPAM* pour m'écrire)
Posted on March, 30 2006 - 5:36 PM
TANTQUE ((tabVar_pseudo[j] <> SAIS_PSEUDO ET tabVar_mdp[j] <> SAIS_MDP) OU j<=i)
j++
FIN

quaund i on a j< donc j+1 donc 11

il faut dire
TANTQUE ((tabVar_pseudo[j] <> SAIS_PSEUDO ET tabVar_mdp[j] <> SAIS_MDP) OU j<i)
j++
FIN

faire 1 decalage de -1
Posted on March, 30 2006 - 6:37 PM
Remplace le "OU" par "ET"
Posted on March, 30 2006 - 7:16 PM
"ou" par "et" ou "et" par "ou"? lol
Posted on March, 30 2006 - 7:47 PM
Si je comprends bien, 2 conditions doivent être remplies pour vérifier le login:
tabVar_pseudo[j]=SAIS_PSEUDO ET tabVar_mdp[j] = SAIS_MDP
Alors personnellement, je ferais comme ceci:
// On vérifie la condition 1:
j est un entier = 1
TANTQUE (tabVar_pseudo[j] <> SAIS_PSEUDO ET j<=i)
--j++
FIN
SI tabVar_pseudo[j]=SAIS_PSEUDO Alors // Condition 1 ok
--// On va vérifier la n°2 :
--J=1
--TANTQUE (tabVar_mdp[j] <> SAIS_MDP) ET j<=i)
----j++
--FIN
--SI tabVar_mdp[j] = SAIS_MDP Alors // Condition 2 ok aussi
----Info(" Bienvenue dans CODIF !")
--SINON // Condition 1 ok mais condition 2 ko
----Erreur(«Login erroné »)
--FIN
SINON
--Erreur(«Login erroné ») // Condition 1 ko. Pas la peine de vérifier la n°2
FIN
Quand tu joues avec des tableaux dans une boucle avec incrémentation de l'indice, il faut toujours ajouter à tes conditions de base ... ET Indice<= Borne max
Posted on April, 03 2006 - 11:04 AM
Dans sa contribution <442d4d9f$1@news.pcsoft.fr>, daniel.cavrenne@scarlet.be racontait :


Si je comprends bien, 2 conditions doivent être remplies pour vérifier le login:
tabVar_pseudo[j]=SAIS_PSEUDO ET tabVar_mdp[j] = SAIS_MDP
Alors personnellement, je ferais comme ceci:
// On vérifie la condition 1:
j est un entier = 1
TANTQUE (tabVar_pseudo[j] <> SAIS_PSEUDO ET j<=i)
--j++
FIN
SI tabVar_pseudo[j]=SAIS_PSEUDO Alors // Condition 1 ok
--// On va vérifier la n°2 :
--J=1
--TANTQUE (tabVar_mdp[j] <> SAIS_MDP) ET j<=i)
----j++
--FIN
--SI tabVar_mdp[j] = SAIS_MDP Alors // Condition 2 ok aussi
----Info(" Bienvenue dans CODIF !")
--SINON // Condition 1 ok mais condition 2 ko
----Erreur(«Login erroné »)
--FIN
SINON
--Erreur(«Login erroné ») // Condition 1 ko. Pas la peine de vérifier la n°2
FIN
Quand tu joues avec des tableaux dans une boucle avec incrémentation de l'indice, il faut toujours ajouter à tes conditions de base ... ET Indice<= Borne max


Si je ne me trompe pas, ton algorithme remet a 0 l'indice de parcours...
Donc en fait on cherche si on a le login dans le tableau, si on a le login on cherche si on a le mot de passe quelque part dans le tableau (ici aucune corrélation entre les 2...), et si on a le login d'un coté, et le mot de passe de l'autre, alors on
valide. Si le couple (login,mdp) = (utilisateurA, mdpB) se présente, alors ton systeme va autoriser l'utilisateur a entrer il me semble.
C'est une méthode originale, je trouve :D
Je ne pense pas que la décomposition soit ici la meilleure des solutions, mais un "tableaucherche" aurait peut etre été plus efficace...

Dans tous les cas je maintiens que l'utilisation d'une requete pour tester directement dans la base de données est encore la meilleure solution (pas de récupération de mot de passe, donc pas de risque de hacking)

--
Lionel

mailto:lionel.breil*NOSPAM*@gmail.com
(retirer *NOSPAM* pour m'écrire)
Posted on April, 03 2006 - 11:55 AM
bonjour et merci de votre coopération!

j'ai toujours un problème avec cette authentification, plus précisement avec cette boucle "tant que" : si je tape un utilisateur existant dans ma base, la boucle continue de tourner pour me retourner à la fin une de mes erreurs personnalisées!

voici mon code:

CONNEXION est une chaîne
CONNEXION = SQLConnecte("CODIF", "sa", "sa", "CODIF", "hODBC")

REQ est une chaîne = [
SELECT login, mdp FROM Login
]
SQLExec(REQ, "AUTH")
Var_pseudo est un tableau fixe de 10 chaînes
Var_mdp est un tableau fixe de 10 chaînes
i est un entier = 0

TANTQUE SQLAvance("AUTH") = 0
i++
Var_pseudo[i] = SQLLitCol("AUTH",1)
Var_mdp[i] = SQLLitCol("AUTH",2)
FIN
k est un entier
POUR k = 1 A i// affichage du tablo, ca, ca marche!
Info("login : " +Var_pseudo[k]+k)
Info("mdp : " +Var_mdp[k]+k)
FIN

lim est un entier = i
i = 1
TANTQUE (Var_pseudo[i] <> SAIS_PSEUDO ET i<=lim)// test de la boucle, ici, ca merde!
Info("pseudo saisi : " +SAIS_PSEUDO)
Info(Var_pseudo[i]+i)
i++
FIN

SI Var_pseudo[i] = SAIS_PSEUDO ALORS
SI Var_mdp[i] = SAIS_MDP ALORS
Info(" Bienvenue dans CODIF !")
SINON
Erreur("Mot de passe erroné")
FIN
SINON
Erreur("Login erroné")
FIN

SQLFerme("AUTH")
Posted on April, 03 2006 - 12:15 PM
->LIONEL

non en fait dans ma base, j'ai une table login avec 2 colonnes:
1 -> login
2 -> mdp ( associé au login )

au début je faisais une requete qui cherché dans la base si il existait un enregistrement ( une ligne ) qui correspondait au login et au mdp tapés dans ma fenetre d'authentification,
si c'etait ok il m'affiché mon message de bienvenue, etc...

apres j'ai testé vos codes mais toujours le meme blem' : meme si je tape un utilisateur connu dans la base, ca e retourne mon message d'erreur : utilisateur inconnu ....

je suis en train de pété un plomb, sur un truc qui d'ordinaire est vraiment simple!! lol
Posted on April, 03 2006 - 12:32 PM
Et avec ça:
VarTab est un tableau de 10 par 2 chaînes
Indice est un entier
Trouve est un booleen
1. Tu garnis le tableau en mettant login dans colonne 1 et mot de passe dans colonne 2
Indice=1
TANTQUE ...
--VarTab[Indice,1]=...
--VarTab[Indice,2]=...
--Indice++
Fin
2. Recherche proprement dite:
Indice=1
Trouve=Faux
TantQue pas Trouve et Indice<
--Si VarTab[Indice,1]=LoginDonné et VarTab[Indice,2]=MDPDonné Alors
----Trouve=Vrai
--Sinon
----Indice++
--Fin
Fin
Si Trouve Alors ...
Posted on April, 03 2006 - 1:03 PM
c'est bon ca marche! j'ai trouvé :
quand j'ai tabpseudo[i]=sais_pseudo avec c'est 2 variables égales à par exemple " cedric ", le " = " merde alors qu'en mettant " ~= " ca marche!

merci à tous!
Posted on April, 03 2006 - 1:41 PM
Dans son message, cedric racontait :

->LIONEL

non en fait dans ma base, j'ai une table login avec 2 colonnes:
1 -> login
2 -> mdp ( associé au login )


Jusque la OK

au début je faisais une requete qui cherché dans la base si il existait un enregistrement ( une ligne ) qui correspondait au login et au mdp tapés dans ma fenetre d'authentification,
si c'etait ok il m'affiché mon message de bienvenue, etc...


Que répondait la requete ? Un enregistrement était-il retourné ? Quelle est la version d'hyperfile que tu utilises (5.5 ou 7) ? Les champs sont-ils complétés par des espaces ou non ?
Normalement la requete que je t'avais fournie aurait du marcher...
Je la réécris pour plus de clarté

REQ est une chaîne = [
SELECT Login.login FROM Login
WHERE Login.login = '%1'
AND Login.mdp = '%2'
]

REQ = chaineconstruit(REQ, SAIS_PSEUDO, SAIS_MDP)
req_executee est booleen = SQLExec(REQ, "AUTH")
SQLInfoGene("AUTH")
SI PAS req_executee ALORS
-- Info("Erreur lors de l'execution de la requete : "+SQL.MesErreur)
FIN

SI SQL.NbLig = 0 ALORS
-- Erreur("Utilisateur inexistant, ou mot de passe incorrect")
FIN

SI SQL.NbLig <> 0 ALORS
-- SI SQLAvance("AUTH") <> 0 ALORS
-- -- Erreur("Erreur lors du parcours")
-- SINON
-- -- var_login est chaine = SQLLitCol("AUTH", 1)
-- -- Info("Utilisateur authentifié : "+var_login)
-- FIN
FIN
SQLFerme("AUTH")

> apres j'ai testé vos codes mais toujours le meme blem' : meme si je tape un utilisateur connu dans la base, ca e retourne mon message d'erreur : utilisateur inconnu ....

Memes questions qu'au dessus... Y a-t-il un enregistrement retourné quand meme ? (auquel cas ca serait ton parcours de tableau qui serait en erreur)

je suis en train de pété un plomb, sur un truc qui d'ordinaire est vraiment simple!! lol


C'est sur que c'est rageant de galérer sur ce genre de problemes ^^'

Tiens moi au courant si ca a marché ou pas cette fois

--
Lionel

mailto:lionel.breil*NOSPAM*@gmail.com
(retirer *NOSPAM* pour m'écrire)