Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/10/2006, 19h19   #1
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
Par défaut nom de l'indice de boucle plante ma page!Si i ca plante, pas si j!

Bonjour,

J'ai un comportement super bizzare dans mon programme !
J'ai une boucle for, si je nomme l'indice "i" , ca plante ma page, si je nomme l'indice de boucle "j", ca marche nickel. Lorsque j'ai une erreur le code est :
[quote]
Objet Response error 'ASP 0104 : 80070057'

Opération non autorisée

/rep1/rep2/ma_page.asp, line 0
[/code]
Alors vous allez me dire que c'est certainement parce que ma boucle for se situe dans une autre boucle dont l'indice est déjà i, ou que j'ai déjà une variable nommée i quelque part, et bien même pas !
Je vous résume comment se compose ma page
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
'inclusion d'un fichier qui declare des classes
action=Request("action")
'creation chargement d'un objet
select case action
  case "add"
    'requete pour recuperer la variable max_importance
    for i=1 to max_importance+1
      if i=Cint(rs_get_categorie("Importance")) then
        selected="selected"
      else
        selected=""
      end if
      response.write("<option value="""&i&""" "&selected&">"&i&"</option>")
   next
end select
 
MonObjet.Display()
C'est en gros la structure de ma page, je précise que la méthode "Display()" de mon objet fonctionne parfaitement, je l'utilise sur plein d'autre page et je n'ai aucun probleme avec. En résumé mon objet est en permanence affiché en bas de la page par appel de la méthode Display, j'ai un select en haut du code qui effectue des opérations en fonction de la variable "action". Lorsque l'action est "add", il y a une boucle for qui est executée et c'est elle qui pose problème.
Dans cette page, lorsque l'action est "add", j'obiens l'erreur. Si je met en commentaire le code de la boucle for , ca marche nickel , et pire si je renomme simplement l'indice de boucle en l'appelant j au lieu de i, ca marche nickel et c'est la que je ne comprends pas !!!
Ca n'a aucun sens, nulle part je ne fais appel a une boucle for dans mon code, sauf dans la méthode Display de ma classe, et ca ne peut pas interferer puisque je suis dans un objet et en plus l'appel de la méthode Display se fait de toutes manières à l'extérieur de ma boucle for !

Donc, j'ai la solution, il me suffit de nommer mon indice j au lieu de i, mais ce que je voudrais c'est comprendre pourquoi ?

Avez vous une idée de ce qui se passe pour que j'obtienne un tel résultat ?

Merci
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2006, 08h18   #2
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 810
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 810
Points : 3 011
Points : 3 011
Bonjour,

max_importance correspond à quoi ?
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2006, 09h52   #3
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
max_importance correspond a une variable integer qui est instanciée plus haut dans le code a partir d'un champ de la base de donné (celui dont la valeur du champ importance est la plus elevée) de la façon suivante :
Code :
1
2
 
max_importance=Cint(rs_get_categorie("Importance"))
J'ai bien testé sa valeur, il n'y avait aucun problème dessus ; j'ai même carrément remplacé max_importance dans la boucle par un chiffre entier
et le problème reste le même.
Idem j'ai testé ce qu'il y a à l'intérieur de la boucle des fois que ça vienne de mon recordset, mais, le problème reste le même, même si je place dans la boucle un simple response.write("toto") ca ne fonctionne pas

Enfin je te remercie de te pencher sur mon problème parce que c'est vrai que la je comprends vraiment pas !
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2006, 11h24   #4
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 810
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 810
Points : 3 011
Points : 3 011
Re,

Cette ligne me gene un peu :

Code :
1
2
 
selected="selected"
Je crois que selected est un mot réservé

Extrait de MSDN
Citation:
Selected, propriété


Renvoie ou définit l'état de sélection d'un élément dans un contrôle FileListBox ou ListBox. Cette propriété est un tableau de valeurs booléennes comprenant le même nombre d'éléments que la propriété List. Cette propriété n'est pas disponible aumoment de la création.
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2006, 11h28   #5
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
[edit] desolé j'avais pas vu ton poste, je tapais le miens en même temps, pour selected je savais pas mais dans tous les cas ca n'est pas lui qui plante la page, lit la suite de mon poste tu verras c'est trop bizzare !

ok, je viens de faire quelques tests, c'est encore plus fort que prévu ! J'ai fait une page de test dans laquelle il n'y a que 20 lignes : une boucle for i et l'appelle de la méthode display de mon objet, ca donne ca :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<%
Set monObjet=New maClasse
	monObjet.Load 10  'id d'un champ dans la base
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Nouvelle page 1</title>
</head>
<body>
<%
for i=1 to 5
	response.write("toto")
next
if isObject(monObjet) then
	monObjet.Display()
end if
%>
</body>
</html>
Voila et donc avec ce code, j'ai le même plantage avec une boucle for i et par contre ca marche nickel avec une boucle for j.

Je viens de pousser les tests un peu plus loin ; j'explique un peu ce qu'est mon objet et ce que fait la méthode display avant :
monObjet correspond a un questionnaire et il contient un tableau d'objet correspondant aux questions du questionnaires.
La methode display affiche l'intitulé du questionnaire et parcours les questions pour les afficher.
Si j'ai une boucle for i ca plante des l'instant ou mon questionnaire contient plus de 1 questions
Si j'ai une boucle for j, ca fonctionne même si il contient un nombre important de questions.
Ca m'embrouille de plus en plus, pourquoi le nombre de questions influe sur le plantage ? en plus au bout de 2 questions ca plante, ca me parait incroyable alors qu'avec une boucle for j je peux en mettre autant que je veux sans que ca plante !
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2006, 22h20   #6
Expert Confirmé Sénior

 
Avatar de Immobilis
 
Inscription : mars 2004
Messages : 5 849
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 5 849
Points : 5 965
Points : 5 965
Salut,

As-tu essayé les autres lettres de l'alphabet?

Est-ce que tu utilise "Option explicit"?

A+
Immobilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2006, 13h25   #7
Membre éprouvé
 
Inscription : septembre 2004
Messages : 368
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 368
Points : 402
Points : 402
Citation:
Envoyé par Immobilis
Salut,

As-tu essayé les autres lettres de l'alphabet?

Est-ce que tu utilise "Option explicit"?

A+
Oui bien vu ! ca etre un truc dans le genre

ou une variable globale i déclarée dans un include
Gwenn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2006, 13h15   #8
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
Merci pour vos réponses
effectivement ca passe avec toutes les autres lettres sauf, i. Il semble que le "i" soit reconnu comme une variable globale !

On dirait bien qu'il se passe quelque chose du style, car j'ai eu exactement le même probleme dans une autre page, j'ai un classe tableau qui simule les méthodes de gestion des tableaux en PHP (vu qu'en VBScript il n'existe rien du genre) avec methodes "Push" "Pop", "In_Array", etc. J'avais le code suivant :
Code :
1
2
3
4
5
6
7
 
for i=0 to Dependance_A_Verifier.offset-1
  champ=Dependance_A_Verifier.Value(i)
  if champChecked.In_Array(Dico_Dependance.Item(champ)) then
 
  end if
next
Dependance_A_Verifier et champChecked sont des tableaux de ma classe Tableau. Dans Dependance_A_Verifier il y avait 4 ou 5 éléments mais la boucle s'arretait direct au premier (je verifiais avec des response.write) ; je renomme l'indice en "j", tous les 5 éléments étaient alors bien parcourus. Cela était du a la méthode "In_Array" qui execute aussi une boucle For i ; parce que si j'inverse et que dans la boucle For du In_Array, j'utilise l'indice "j" , et dans ma boucle for principale j'utilise "i" alors je n'ai pas de probleme. J'ai uniquement un probleme si les 2 indices ont le meme nom.
Il semble donc qu'effecitvement l'utilisation d'une boucle For i dans ma page déclare "i" comme variable globale qui ensuite est reconnue a l'interieur des procédures utilisant des boucles For "i". Je suis donc obligé dans mes procédures de déclarer "Dim i" pour bien préciser que je travaille sur des variables locales.
Si c'est bien ca, c'est trop la galère que des variables utilisées dans la section principale soit reconnues comme globales dans les procédures , ca ne fonctionne pas de la même manière dans d'autres langages (comme le PHP auquel je suis bien plus habitué) alors ca m'embrouille complétement ! D'habitude si on veut qu'une variable soit globale il faut le spécifier, le simple fait de l'utiliser ne suffit pas !

Immobilis, peux tu m'en dire plus sur "Option explicit" , je ne sais pas du tout a quoi cela correspond.
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2006, 13h25   #9
Membre éprouvé
 
Inscription : septembre 2004
Messages : 368
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 368
Points : 402
Points : 402
ca oblige la déclaration explicite des variables. Puisqu'en vb il est possible d'utiliser des variables sans les avoir déclarées
Gwenn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 09h58   #10
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
Merci pour l'info, effectivement c'est pas plus mal de devoir les déclarer, a l'avenir j'utiliserais le Option Explicit, je viens du PHP alors je suis plus qu'habitué à la non-déclaration des variables ; par contre vu qu'en VBScript, les variables non déclarée ont une portée globale, ca me semble carrement génant de ne pas les déclarer ! (le preuve je me retrouve avec un indice de boucle qui a une portée globale, d'ailleurs je trouve ca assez hallucinant que les variables non déclarées aient une portée globale !).

Mon problème est à nouveau résolu, merci pour votre aide !
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 20h39   #11
Expert Confirmé Sénior

 
Avatar de Immobilis
 
Inscription : mars 2004
Messages : 5 849
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 5 849
Points : 5 965
Points : 5 965
Citation:
Envoyé par Matth_S
par contre vu qu'en VBScript, les variables non déclarée ont une portée globale
Pas du tout!!!
Une variable est "gobale" si elle est déclarée en dehors de toute procédure ou fonction ou classe etc... Exemple:
Code :
1
2
3
4
5
6
7
 
Dim MaVariableGlobale ' valable pour toute ma page ASP
 
Sub toto
      Dim MaVariableLocale ' Ne sortira pas de toto
      MaVariableLocale = MaVariableGlobale + 2
End sub
A+
Immobilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2006, 18h35   #12
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
(desolé pour la réponse tardive, vacances )
C'est la que je ne comprend pas justement, en gros moi je ne déclare(ais) jamais les variables (pour cause je viens du PHP), donc en gros mon code ce résume à

Code :
1
2
3
4
5
6
7
8
9
 
MaVariableNonDeclaree="tata"
 
Sub toto
      MaVariableNonDeclaree="toto"
End sub
 
toto()
response.write(MaVariableNonDeclaree)   'm'affichera toto
C'est ce que j'entend par variable non déclarée a une portée globale, nulle part je n'écris "Dim MaVariableNonDeclaree" dans ma page, mais le fait de l'utiliser dans la section principale (donc en dehors de procédures ou fonctions) et de ne pas la rédéclarer dans ma fonction fait que c'est la même variable qui est utilisée. Ca me plante TOUS mes indices de boucles dans les fonctions pour peu que j'ai une boucle utilisant le même indice dans la section principale. C'est l'horreur pour s'y retrouver ! C'est pour ca que je trouve ca super galère, d'autant plus que je ne le savais pas en commencant a développer en ASP, donc j'ai maintenant des 10 aines de pages dans lequelles il faut faire gaffe au nom des variables, et puis même maintenant que je le sais c'est un peu dur de perdre 3 ans d'habitude de non déclaration des variables acquis en PHP (surtout que je comprends pas trop le but de déclarer des variables non typées).
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2006, 22h09   #13
Expert Confirmé Sénior

 
Avatar de Immobilis
 
Inscription : mars 2004
Messages : 5 849
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 5 849
Points : 5 965
Points : 5 965
Peut-être cela peut-il t'aider à comprendre mieux la portée des variables
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim MaVariableNonDeclaree
MaVariableNonDeclaree="tata"
 
response.write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")   'm'affichera toto
 
Sub toto
	Dim MaVariableNonDeclaree
	response.Write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")
	MaVariableNonDeclaree = "toto"
	response.Write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")
End sub
 
toto()
response.write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")   'm'affichera toto
A+
Immobilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2006, 10h20   #14
Membre régulier
 
Inscription : décembre 2005
Messages : 177
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 177
Points : 85
Points : 85
salut!
Je viens de tester ton code. J'ai pense que j'ai bien compris le concept de variable globale en ASP et c'est ce concept qui me gene : mon probleme vient justement du fait que je ne déclare pas du tout mes variables, en gros c'est ton code mais sans les Dim de déclaration :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
MaVariableNonDeclaree="tata"
 
response.write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")   'm'affichera tata
 
Sub toto
	response.Write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")
	MaVariableNonDeclaree = "toto"
	response.Write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")
End sub
 
toto()
response.write("MaVariableNonDeclaree : " & MaVariableNonDeclaree & "<br>")   'm'affichera toto
Toi tu redéclares ta variable dans ta procédure avec Dim MaVariableNonDeclarée, ce n'est donc pas ta variable globale qui est utilisée mais une nouvelle variable locale ; moi je n'ai jamais déclarée mes variables, du coup ce sera MaVariableNonDeclaree (globale, cad utilisée dans la section principale) qui sera utilisée ; ce qui perturbe pas mal le code. Ce qui m'embette d'autant plus c'est que même sans déclarer la variable (sans utiliser le Dim MaVariableNonDeclaree) dans la section principale , ca simple utilisation dans la section principale la fait reconnaitre comme globale, d'ou un gros probleme au niveau des indices de boucle que je ne déclare pas ! Essaye ceci par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
sub toto
  for i=1 to 15
    'un traitement
  next
end sub
 
for i=0 to 10
  'un traitement
  toto()
next
L'indice de boucle i est globale ! C'est ca que je trouve hallucinant, je n'ai rien eu a faire a part l'utiliser, et hop il est globale ! Ca te crée un max d'erreurs :
- Par exemple, ta boucle principale va de 0 a la taille d'un tableau, et dans ta boucle tu lis le tableau, mais dans ta procédure, ta boucle for i va au dela de la taille du tableau, comme c'est le même i qui sera utilisé, tu auras une erreur en depassant la taille de ton tableau. Et ca peut poser plein d'autres types d'erreurs ou de confusion, je suppose que tu imagines !

Maintenant c'est clair que a chaque procédure, je déclare toutes les variables qui seront utilisées pour être sur qu'elles soient locales, mais en attendant j'ai pas mal de pages qui peuvent potentiellement avoir ce probleme. Je ne comprends pas que la non déclaration des variables soient autorisées si ca entraine par exemple des indices de boucles globaux !
Matth_S est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h46.


 
 
 
 
Partenaires

Hébergement Web