Conserver le résultat d'une commande incrémentée dans autant...
Résolu
Swiss Knight
Messages postés
1956
Date d'inscription
Statut
Membre
Dernière intervention
-
Swiss Knight Messages postés 1956 Date d'inscription Statut Membre Dernière intervention -
Swiss Knight Messages postés 1956 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Conserver le résultat d'une commande incrémentée dans autant...
- Invite de commande - Guide
- Commande terminal mac - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Commande dism - Guide
- Lexer resultat - Télécharger - Sport
4 réponses
#!/bin/bash n=3 h=900 w=1200 A="171 169 171 52 45 44 187 186 187 131 129 128 79 67 63 164 162 162 159 130 115 182 134 105 205 206 207" a=( $A ) exec {foo}< <(for ((i=0;i<${#a[@]};i+=n)); do echo ${a[@]:$i:$n}; done) for j in $(seq 1 $n) do qcx[j]=$(( (2 * j-1) * w /(2*n) )) for k in $(seq 1 $n) do qcy[k]=$(( (2 * k-1) * h /(2*n) )) m=$j$k qc[m]="${qcx[j]},${qcy[k]}" read -u $foo qqch B[m]="$qqch" done done
Merci pour ta réponse qqchquicommenceparQ,
1. J'essaie de la décortiquer pour bien comprendre :
a=( $A ) transforme la variable A en un tableau a ?
exec {foo}< <(for ((i=0;i<${#a[@]};i+=n)); do echo ${a[@]:$i:$n}; done)
définit une fonction "foo" ?
read -u $foo qqch
B[m]="$qqch"
ça je ne comprends pas très bien ce que ça fait
______________________
2.
il y a un petit couac avec a=( $A ) : le tout premier nombre de la variable A est un zéro. Je ne le retrouve pas dans a. Ça commence directement à 255.
! Merci !
1. J'essaie de la décortiquer pour bien comprendre :
a=( $A ) transforme la variable A en un tableau a ?
exec {foo}< <(for ((i=0;i<${#a[@]};i+=n)); do echo ${a[@]:$i:$n}; done)
définit une fonction "foo" ?
read -u $foo qqch
B[m]="$qqch"
ça je ne comprends pas très bien ce que ça fait
______________________
2.
il y a un petit couac avec a=( $A ) : le tout premier nombre de la variable A est un zéro. Je ne le retrouve pas dans a. Ça commence directement à 255.
! Merci !
Très bien, merci. Ce sont des notions qui me dépassent légèrement, mais j'ai réussi grâce à vos précieux conseils.
Après avoir changé les seq, je n'ai plus eu de problème au niveau du premier zéro. Peut-être était-ce lié ? Peut-être que j'ai changé d'autres trucs entre deux, j'en sais plus trop rien à vrai dire mais ça joue maintenant.
Merci infiniment.
Après avoir changé les seq, je n'ai plus eu de problème au niveau du premier zéro. Peut-être était-ce lié ? Peut-être que j'ai changé d'autres trucs entre deux, j'en sais plus trop rien à vrai dire mais ça joue maintenant.
Merci infiniment.
Re Bonjour,
Il y a un petit problème... ;) :
les dimensions de l'espaces sont confondues avec les dimensions de la grille !
Si n=2 je n'ai pas un triplet, mais un doublet de nombres dans B[jk], si n=5 j'en ai 5, etc.
Et pour n>3, une fois tous les nombres de A épuisés, il n'y a plus rien à stocker !
Or ce sont toujours des triplets qu'il faut conserver dans les cellules de B.
Exemple :
n=4
A="171 169 171 52 45 44 187 186 187 131 129 128 79 67 63 164 162 162 159 130 115 182 134 105 205 206 207 150 201 204 251 241 222 120 124 158"
h=900
w=1200
a=( $A )
exec {foo}< <(for ((i=0;i<${#a[@]};i+=3)); do echo ${a[@]:$i:$n}; done)
for j in $(seq 1 $n)
do
qcx[j]=$(( (2 * j-1) * w /(2*n) ))
for k in $(seq 1 $n)
do
qcy[k]=$(( (2 * k-1) * h /(2*n) ))
m=$j$k
qc[m]="${qcx[j]},${qcy[k]}"
read -u $foo qqch
B[m]="$qqch"
done
done
$ echo ${B[11]}
171 169 171 52
alors qu'il devrait toujours valoir 171 169 171.
>> je pense qu'il faut corriger la ligne :
exec {foo}< <(for ((i=0;i<${#a[@]};i+=n)); do echo ${a[@]:$i:$n}; done)
en
exec {foo}< <(for ((i=0;i<${#a[@]};i+=3)); do echo ${a[@]:$i:3}; done)
je vais tester ça...
Il y a un petit problème... ;) :
les dimensions de l'espaces sont confondues avec les dimensions de la grille !
Si n=2 je n'ai pas un triplet, mais un doublet de nombres dans B[jk], si n=5 j'en ai 5, etc.
Et pour n>3, une fois tous les nombres de A épuisés, il n'y a plus rien à stocker !
Or ce sont toujours des triplets qu'il faut conserver dans les cellules de B.
Exemple :
n=4
A="171 169 171 52 45 44 187 186 187 131 129 128 79 67 63 164 162 162 159 130 115 182 134 105 205 206 207 150 201 204 251 241 222 120 124 158"
h=900
w=1200
a=( $A )
exec {foo}< <(for ((i=0;i<${#a[@]};i+=3)); do echo ${a[@]:$i:$n}; done)
for j in $(seq 1 $n)
do
qcx[j]=$(( (2 * j-1) * w /(2*n) ))
for k in $(seq 1 $n)
do
qcy[k]=$(( (2 * k-1) * h /(2*n) ))
m=$j$k
qc[m]="${qcx[j]},${qcy[k]}"
read -u $foo qqch
B[m]="$qqch"
done
done
$ echo ${B[11]}
171 169 171 52
alors qu'il devrait toujours valoir 171 169 171.
>> je pense qu'il faut corriger la ligne :
exec {foo}< <(for ((i=0;i<${#a[@]};i+=n)); do echo ${a[@]:$i:$n}; done)
en
exec {foo}< <(for ((i=0;i<${#a[@]};i+=3)); do echo ${a[@]:$i:3}; done)
je vais tester ça...
Je signale juste un sérieux bug lorsque xx ou yy dépasse 9, l'indice du tableau part en sucette je crois... il ne sait plus faire la différence entre certaines cellules ; par exemple, 10;1 et 1;01, ou 11;2 et 1;12, etc.
J'essaye de trouver une alternative.
ce truc fonctionne bien :
https://www.commandlinefu.com/commands/view/7921/tricky-implementation-of-two-dimensional-array-in-bash.
"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
J'essaye de trouver une alternative.
ce truc fonctionne bien :
https://www.commandlinefu.com/commands/view/7921/tricky-implementation-of-two-dimensional-array-in-bash.
for xx in $(seq 1 ${n} ); do qcx[${xx}*100]=$[(2*(xx)-1)*w/(2*n)]; for yy in $(seq 1 ${n} ); do qcy[${yy}]=$[(2*(yy)-1)*h/(2*n)]; qc[${xx}*100+${yy}]=${qcx[${xx}*100]},${qcy[${yy}]}; read -u ${descripteur} table A[${xx}*100+${yy}]="${table}" B[${xx}*100+${yy}]='echo ${A[${xx}*100+${yy}]} | sed 's/\( \)/,/g'' myvar+='echo "${qc[${xx}*100+${yy}]}"' Aa('"${B[${xx}*100+${yy}]}"') '' done done
"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
Tu devrais sérieusement envisager d'utiliser un langage qui supporte réellement les tableaux multidimensionnels (tu te causeras moins d'ennuis).
Si tu persistes à vouloir utiliser un langage simple, alors tu devrais passer par un tableau associatif (en bash, ksh, ou awk) dont l'indice comportera un séparateur quelconque, ou prédéfini (pour awk), pour distinguer abscisses et ordonnées.
Je préférerais awk.
bien sûr, on peut aussi se servir d'un tournevis pour couper du papier.
Tu devrais sérieusement envisager d'utiliser un langage qui supporte réellement les tableaux multidimensionnels.
Si tu persistes à vouloir utiliser un langage simple, alors tu devrais passer par un tableau associatif (en bash, ksh, ou awk) dont l'indice comportera un séparateur quelconque, ou prédéfini (pour awk), pour distinguer abscisses et ordonnées.
Je préférerais awk.
bien sûr, on peut aussi se servir d'un tournevis pour couper du papier.
Tu devrais sérieusement envisager d'utiliser un langage qui supporte réellement les tableaux multidimensionnels.
for j in $(seq 1 $n)
Il m'avait cru comprendre qu' avec bash seq était inutile et qu'il valait mieux utiliser l'évaluation arithmétique... ;-\
mais, j'aurais dû corriger ça aussi ;)