Newsgroup: it.comp.lang.javascript
Titolo: variabili dinamiche

salve,
ho dato uno sguardo alla man, ma non riesco a trovare come creare variabili
dinamiche del tipo:
for(x=0;x<100;x++){
    c_x = x;
}
in questo caso specifico quindi si creerebbero le varibili
c_0=0;
c_1=1;
c_2=2;
ecc. ecc.
grazie in anticipo
max

Scusa se ho capito bene, vuoi poter usufruire di un numero variabile di
variabili, dinamicamente giusto?
A parte la terminologia che forse non è appropriata ma non entro in merito
perchè non sono di certo io a  poter giudicare, hai provato con gli ARRAY?
Array o strutture dinamiche come la classe Vector o la classe HashTable o
HarrayList di JAVA.
Io non conosco JavaScript, quindi non so se esistono classi come Vector etc.
ma penso che sicuramente esistono gli array.
Controlla sulla documentazione la voce array.
Gli array fanno parte dell'informatica di base.
Sono particolari strutture omogenee (qualche linguaggio permette anche array
non omogenei con le dovute limitazioni ma questa è un'altra storia) quindi
che contengono dati dello stesso tipo.
esempio Java
public int [] preparaDati(int numeroDiDati)
{
    int dati[] = new int[numerodiDati]  // crea un numero di locazioni pari
al numero che passi alla funzione
    for(int index=0; index<numerodiDati; index++)
        dati[index] = (int)Math.random()*10; // genera numeri casuali
compresi tra 0 e 10
    return dati;
}
Spero che l'esempio sia sufficentemente chiaro.
Tieni conto che gli array in Java e in altri linguaggi hanno gli indici che
vanno da 0 n-1(anche il C/C++ ha questa caratteristica il Pascal no parte da
1 e arriva ad n)
Se guardi l'esempio dichiaro una struttura di n dati, ma la scorro da 0 a
n-1.
Ora se questo è quello che cercavi, devi controllare sulle manualistiche
come vengono gestite in javaScript queste cose, anche se penso che siano
molto simili, spero di non sbagliare!!!!!!!!!!
Ciao e fammi sapere

Forse non è la soluzione elegante alla questione [ammetto i miei limiti
:) ] ma si potrebbe provare a lavorare con un vettore a cui aggiungi
elementi.
Potresti identificare gli elementi del vettore con delle label invece
che con degli indici numerici.
In questo caso considera che nomeVettore,length non funziona.
Passando alle cose pratiche ...
<html>
   <head>
     <title>generazione dinamica di variabili</title>
     <script language="JavaScript">
     <!--
      function dynVar(){
       var variabili = new Array();
       var prefisso = 'c_';
       var numVar = 10;
       var label = '';
       for(i=0; i<numVar; i++){
        label = prefisso + i;
        variabili[label] = i;
       }
       var rep='';
       var caporiga = '\n';
       var linea = '-------------------------';
       for(j in variabili){
        rep += 'nome variabile: '+ j + caporiga;
        rep += 'valore variabile: ' + variabili[j];
        rep += caporiga + linea + caporiga;
       }
       alert(rep);
      }
     //-->
     </script>
   </head>
   <body bgcolor="#ffffff" color="#333333" link="#990000" alink="#ff0000"
vlink="#550000">
     <a href="javascript:void(0)" onClick=dynVar()>genera</a>
   </body>
</html>
testato con NN4.76, NN6, IE5.5 su Win98
Ciao!  Daniele



Perfetto, quello che cercavo.
grazie
max

 In questo caso considera che nomeVettore,length non funziona.
[snip]
... hmm, approfitto della tua cortesia per un'ultima cosa .... questa di
seguito:
function protidi(cosa){
  if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
    somma=0;
    for(x=1;x<=limite;x++){
         if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
           somma +=(eval(cosa)[x][0] / 100) * document.dieta.elements[cosa +
'[' + x + ']'].value;
       }
    }
    window.alert(somma);
}
mi restutisce errore alla riga successiva se provo a fare un
for(x=1;x<cosa.length;x++){ ...
al posto di
for(x=1;x<limite;x++){ ...
(in altri termini una conta degli elementi dell'array) ..... domanda: è un
prob di sintassi o mi sfugge qualcosa?
grazie in anticipo
max

}
soluzione brutta che fa esattamente quello che vuoi:
for(x = 0; x < 100; x ++){
    eval("c_" + x + " = " + x);
}
soluzione migliore ma leggermente diversa:
var c = new Array();
for(x = 0; x < 100; x ++){
    c[x] = x;
}
puoi accedere alle variabili cosě create usando la sintassi c[0], c[1],
eccetera
-- 
Posted from 
smtp.technorail.com
 [195.103.144.19] (may be forged) 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

"n e t b r a i n" <max@NO_SPAM_net-brain.net> ha scritto nel messaggio
news:jqDB6.5185$s93.3...@news.infostrada.it...

Non dovrebbe dare errore ma semplicemente saltare tutto il ciclo for
dato che cosa.length=1
Secondo il tuo codice cosa e' una variabile con lunghezza 1 e valore 'p'
o 'c' diventa riferimento all'array di array con il comando
eval(.........
Quindi dovresti scrivere:
for(x=1;x<eval(cosa).length;x++){
Se posti il codice si puo' controllare meglio.
Saluti, Paolo

 Se posti il codice si puo' controllare meglio.
se può servire ....
Da notare:
$cosa è una var passata sul onclick di un bottone (es: .....
onclick="protidi('c');"> ...); $limite è la var contenente il valore intero
che mi limita il loop dato che non riesco a contare gli elementi dell'array
in argomento ...
grazie in anticipo
max
<script language="JavaScript">
 var c = new Array();
 c[1]=new Array(3.1,1.8,4.4,41,120,0.03,1);
 c[2]=new Array(3.4,0.2,4.7,33,120,0.03,1);
 c[3]=new Array(3.6,0.5,4,33,120,0,0);
 c[4]=new Array(3.8,3.7,4,63,120,0.1,0);
 c[5]=new Array(35.9,23.2,0,397,1277,0.9,0);
 c[6]=new Array(8.5,24.3,2,260,189,0.5,0.6);
 c[7]=new Array(11,0,0,44,20,0.1,0);
 c[8]=new Array(12.2,12.7,56.5,390,0,0,0);
 c[9]=new Array(28,4.6,0,153,23,2,0);
 c[10]=new Array(21.2,36.4,0.8,415,18,0.9,0);
 c[11]=new Array(0.8,0,8.6,35,35,0.3,51);
 c[12]=new Array(1.2,0.2,20.9,85,9,0.7,8);
 c[13]=new Array(0.4,0,10.8,42,13,0.2,4);
 c[14]=new Array(0.2,0,12,46,7,0.4,2);
 c[15]=new Array(0.6,0,6.2,25,17,0.3,40);
 c[16]=new Array(2.3,2.1,53.9,214,186,3,0);
 c[17]=new Array(16.6,67.7,3.2,687,90,2.3,2);
 c[18]=new Array(2.2,0.7,70.5,279,41,1,2);
 c[19]=new Array(0.8,0,55.8,212,18,0.8,1);
 c[20]=new Array(0.9,0,54.4,207,21,1.7,17);
 c[21]=new Array(0.7,0,11.3,33,12,0.2,50);
 c[22]=new Array(0.6,0,80.3,303,5,1.2,4);
 c[23]=new Array(0,0,99.5,373,0,0,0);
 c[24]=new Array(24.5,20.2,2.5,320,100,11,0);
 c[25]=new Array(8.7,13.2,0,464,0,0,0);
 c[26]=new Array(11.3,6,2.2,413,55,3.8,0);
 c[27]=new Array(8.7,0.2,1.5,293,13,1.4,0);
 c[28]=new Array(7.8,0.3,1.7,252,20,1.5,0);
 c[29]=new Array(6.5,1,0,361,10,0.7,0);
 var p=new Array();
 p[1]=new Array(16.9,22,0,265,280,0.7,0);
 p[2]=new Array(35.9,23.2,0,397,1277,0.9,0);
 p[3]=new Array(21.3,4.6,0,127,11,2.6,0);
 p[4]=new Array(8.5,24.3,2,260,189,0.5,0.6);
 p[5]=new Array(11,0,0,44,20,0.1,0);
 p[6]=new Array(12.9,11.3,0,153,51,6.3,0);
 p[7]=new Array(20.8,3.8,0.5,120,12,0.1,0);
 p[8]=new Array(19.8,4.6,0.4,122,17,2.1,1);
 p[9]=new Array(19.4,4.8,0.5,123,11,2.4,0);
 p[10]=new Array(20.5,5.7,0,133,13,1.4,2);
 p[11]=new Array(22.3,3.4,0,120,19,1.6,2);
 p[12]=new Array(21.3,6.7,0.2,146,21,2.6,0);
 p[13]=new Array(28,4.6,0,153,23,2,0);
 p[14]=new Array(21.2,36.4,0.8,415,18,0.9,0);
 p[15]=new Array(17.9,0.7,0.6,80,0,0,0);
 p[16]=new Array(16.7,3.6,0.7,101,0,0,0);
 p[17]=new Array(13.9,2.6,0.8,82,28,0.6,0);
 p[18]=new Array(16,1.2,1.4,79,0,0,0);
 p[19]=new Array(16.9,4.2,1,109,0,0,0);
 p[20]=new Array(16.3,1.3,1.3,81,0,0,0);
 p[21]=new Array(15.9,1.7,0.9,82,30,0.8,0);
 p[22]=new Array(20.5,4.2,0.6,121,24,1,0);
 p[23]=new Array(13.9,3,0,82,0,0,0);
 p[24]=new Array(29,5.8,0,168,21,1,0);
 p[25]=new Array(1.3,0.3,4.5,24,11,0.7,21);
 p[26]=new Array(1.2,0.5,2.6,19,10,0.4,15);
 p[27]=new Array(11.5,1.5,74.6,373,17,1.6,0);
 p[28]=new Array(14.7,2.7,67.9,368,22,2.1,0);
 p[29]=new Array(11.3,1.2,69.6,348,16,1,0);
 p[30]=new Array(22.3,1.9,44.5,308,157,6.4,0);
 p[31]=new Array(6.5,0.6,7.2,79,30,1.6,0);
 p[32]=new Array(2.3,0.2,14.9,66,9,0.4,25);
 p[33]=new Array(0,100,0,900,0,0,0);
 p[34]=new Array(0.3,0,3.2,32,6,0.1,1);
function azzera(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 for(r=1;r<=limite;r++){
  if(document.dieta.elements[cosa + '[' + r + ']'].value != 0){
   document.dieta.elements[cosa + '[' + r + ']'].value=0;
  }
 }
}
/* protidi,lipidi,glicidi,calorie,calcio,ferro,vit_c */
// 0   1  2   3   4  5   6
function protidi(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][0] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function lipidi(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][1] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function glicidi(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][2] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function calorie(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][3] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function calcio(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][4] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function ferro(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][5] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
function vitc(cosa){
 if(cosa=='c'){limite=29;}else if(cosa=='p'){limite=34;}
 somma=0;
 for(x=1;x<=limite;x++){
  if(document.dieta.elements[cosa + '[' + x + ']'].value > 0){
   somma +=(eval(cosa)[x][6] / 100) * document.dieta.elements[cosa + '[' + x
+ ']'].value;
  }
 }
 window.alert(somma);
}
</script>

 se puň servire ....
[]
Manca la parte HTML !!
Il tuo codice funziona se i campi del modulo sono 29 con name
"c[1]".."c[2]" ecc e 33 con name "p[1]"..
se invece i campi sono  nominati solo 'c' e 'p' il codice va cambiato
cosi':
-------------
function protidi(cosa){
 somma=0;
 for(x=1;x<eval(cosa).length;x++){
  if(document.forms.dieta.elements[cosa][x-1].value > 0){
   somma +=(eval(cosa)[x][0] / 100) *
document.dieta.elements[cosa][x-1].value;
  }
 }
 window.alert(somma);
}
-------------
 document.dieta.elements[cosa]      // si riferisce a l'array, in base
0, contenente tutti i campi con nome 'c' o 'p' e quindi per riferirsi al
singolo campo : document.dieta.elements[cosa][x-1]
Se, come sembra, il numero dei campi corrisponde al numero di componenti
dell'array puoi anche misurare il ciclo sulla lunghezza dell'array dei
campi.
Saluti, Paolo
p.s. e' preferibile utilizzare nomi diversi per array e campi, generano
meno confusione e spesso nomi identici possono interferire negli script.

 meno confusione e spesso nomi identici possono interferire negli script.
puň essere, ma nel mio caso ho dei motivi per fare cosě ...
ciao e grazie
max