[R] Pointeur Tableau 2D

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
killshout
Niveau 2
Niveau 2
Messages : 21
Enregistré le : ven. 04 sept. 2009 18:54
Status : Hors ligne

[R] Pointeur Tableau 2D

#1

Message par killshout »

Bonjour,

J'utilise dans une fonction un tableau 1D ($TableauReponses) :

Code : Tout sélectionner

Func [color=#008000]PageSondage[/color]([color=#BF0000]$TableauReponses[/color])
    Global $Form1 = GUICreate("Feuille1", 593, 443, 192, 124)

    Global $Label1 = GUICtrlCreateLabel("Outils de sondage", 160, 24, 267, 46)

    GUICtrlSetFont(-1, 26, 800, 0, "Calibri")

    Global $Suivant = GUICtrlCreateButton("Suivant", 225, 368, 100, 30, $BS_FLAT)
    Global $Resultat = GUICtrlCreateButton("Résultat", 100, 368, 100, 30, $BS_FLAT)
    Global $Quitter = GUICtrlCreateButton("Quitter", 356, 368, 100, 30, $BS_FLAT)

    Global $Groupe = GuiCtrlCreateGroup([color=#BF0000]$TableauReponses[/color][0],65, 130, 130,100)
    Global $Radio1 = GUICtrlCreateRadio([color=#BF0000]$TableauReponses[/color][1], 72, 144, 113, 17)
    Global $Radio2 = GUICtrlCreateRadio([color=#BF0000]$TableauReponses[/color][2], 72, 160, 113, 17)
    Global $Radio3 = GUICtrlCreateRadio([color=#BF0000]$TableauReponses[/color][3], 72, 176, 113, 17)
    Global $Radio4 = GUICtrlCreateRadio([color=#BF0000]$TableauReponses[/color][4], 72, 192, 113, 17)

GUICtrlSetState($Radio1, $GUI_CHECKED)

EndFunc
Et comme je veux faire appel plusieurs fois a cette fonction j'ai fais un tableau 2D :

Code : Tout sélectionner

Local [color=#BF0000]$Tableau2D[/color][2][5]
Donc Tableau2D[0][x] (x allant de 0 à 4) sont les données que j'veux envoyer à la fonction la première fois
Tableau2D[1][x] (x allant de 0 à 4) sont les données que j'veux envoyer à la fonction la deuxieme fois

Sauf que j'pensais que $TableauReponses[0] etait un pointeur donc j'appellais la fonction comme ceci :

Code : Tout sélectionner

[color=#008000]PageSondage[/color]([color=#BF0000]$Tableau2D[/color][0])
Sauf que j'ai l'erreur suivantes :
xxx.au3 (21) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

J'ai essayez plusieurs truc mais ca n'a pas fonctionné.

Pourriez vous m'aider ?

Merci de vos réponses.
Modifié en dernier par killshout le mer. 21 oct. 2009 19:50, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#2

Message par orax »

Il vous met cette erreur puisque $Tableau2D est de 2 dimensions, pour lire la première valeur ça serait $Tableau2D[0][0] et non $Tableau2D[0]. Si par contre vous voulez passer en paramètre tout le tableau, il ne faut pas à mettre des crochets.
Un exemple sera plus causant je crois :

Code : Tout sélectionner

Global $MonTableau2D[2][5]
$MonTableau2D[0][0]="test" ; première valeur du tableau 2D
PageSondage($MonTableau2D) ; sans les crochets

Func PageSondage(Const ByRef $Tableau2D)
    MsgBox(0,"",$Tableau2D[0][0])
EndFunc
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
killshout
Niveau 2
Niveau 2
Messages : 21
Enregistré le : ven. 04 sept. 2009 18:54
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#3

Message par killshout »

En faite dans ma fonction je prend un tableau 1D donc je veux lui envoyé deux fois mes deux tableau 1D contenu dans mon tableau 2D : $Tableau2D[0] et $Tableau2D[1] qui sont tout les deux des tableaux 1D issu d'un tableau 2D $Tableau2D
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#4

Message par Tlem »

Dans un tableau 1D, vous avez une seule dimension soit une colonne. Donc si vous voulez afficher la première valeur de ce tableau il vous suffit de faire $Tableau[0] qui représente la ligne 0 de la colonne 0.

Par contre dans un tableau 2D comme le votre vous avez deux colonnes et pour afficher une des valeurs de ce tableau, il faut dire à AutoIt ou ce trouve la valeur et donc vous devez prendre en compte les deux colonnes.
Vous devez lui dire que la valeur qui vous intéresse ce trouve dans tel colonne à telle ligne et donc il vous faut lui indiquer deux 'coordonnées' : $Tableau[0][0]

Voilà, j'espère avoir été le plus clair possible. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
killshout
Niveau 2
Niveau 2
Messages : 21
Enregistré le : ven. 04 sept. 2009 18:54
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#5

Message par killshout »

Nan c'est pas ca mon problème je sais comment avoir des valeurs dans des tableau2D.
Ce que je veux envoyer a ma fonction c'est un tableau1D.
Donc il me faut plusieurs tableau1D. Pour ca je crée un tableau 2D : soit tableau[5][5] par exemple.
Ce que ma fonction veux ce sont les paramètres : tableau[0][0], tableau[0][1], tableau[0][2], tableau[0][3], tableau[0][4].
Sauf qu'en interne ma fonction voix un tableau1D donc il lui faut tableau[x] ( 0 < x < 4 )

Pour résumé :
En externe de ma fonction j'veux faire un tableau 2D qui contient a chaque ligne les info a envoyer a ma fonction
et en interne de ma fonction j'ai un tableau 1D donc je lis la première ligne de mon tableau2D, puis je ré appel ma fonction je lis la deuxième ligne, etc ...
Donc je pensais appelais la fonction comme suit : PageSondage($Tableau2D[0])
Pour qu'il ai la première ligne et qu'il lis $Tableau2D[0][x] ( 0 < x < 4 )
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#6

Message par sylvanie »

pour l'adressage, c'est délicat, car on ne sait pas vraiment la taille des objets alloués par autoit quand il fait un tableau.
Une solution coûteuse en RAM et CPU, mais simple à mettre en oeuvre, est de créer une fonction qui retourne un tableau 1D à partir d'un 2D avec un index comme argument :
► Afficher le texte
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#7

Message par Iste »

Une autre solution serait de mettre une vérification dans ta fonction qui reçoit les tableaux, Si le paramètre est un tableau 1D, on fait comme d'hab, si il s'agit d'un tableau 2D, on traite la dimension $x ou $x serait un paramètre optionnel de la fonction.

Du moins, c'est comme ca que je ferais :P
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#8

Message par Tlem »

Sinon, pourquoi ne pas passer par une chaîne.
Je m'explique :

Code : Tout sélectionner

$sTableau = ("Chaine1,Chaine2,Chaine3,Chaine4,Chaine5")
puis lorsque le besoin s'en fait sentir, on le met sous forme de tableau ou plus simplement on envoi la chaîne en tant que variable et la fonction se charge de mettre en tableau (si cela est vraiment nécessaire ...).

Code : Tout sélectionner

$aTableau = StringSplit($sTableau, ",")
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
killshout
Niveau 2
Niveau 2
Messages : 21
Enregistré le : ven. 04 sept. 2009 18:54
Status : Hors ligne

Re: [...] Pointeur Tableau 2D

#9

Message par killshout »

Ah oui quand même ^^

En faite je voyais en C où on a le pointeur d'un tableau 1D dans un tableau 2D avec ca : tableau2D[1]

Mais bon vu la solution je vais peut être stocké mes valeurs ailleurs que dans un tableau 2D.

En faite j'voulais faire des feuilles de sondages.
Donc à chaque fenêtre j'ai une question et une séries de réponses. Donc j'comptais stocké toutes les réponses dans une ligne et une fenêtre par ligne.

Merci pour vos réponses !
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] Pointeur Tableau 2D

#10

Message par sylvanie »

Pour les pointeurs, c'est un peu le point faible logique d'Autoit.
Rappelons qu'il reste un langage de script ... pas de programmation compilée.
Il y a bien quelque commandes natives et UDF pour gérer quelques commandes, comme le get d'adresse, le memcopy, ou l'allocation/free, mais c'est généralement dans l'optique de passer la main après à un appel de DLL qui traîte l'action.
D'ailleurs dans l'udf Memory.au3, on a presque tout ce qu'il faut, sauf le read et write. Ironique et frustant... Ul y a bien une autr udf pour ça, mais ça devient lourd de mixer les appels entre udf ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Pointeur Tableau 2D

#11

Message par Tlem »

@killshout
D'après ce que vous décrivez de votre application, le stockage des valeurs dans une chaîne me semble effectivement la solution.
Vous faites votre fonction d'affichage, puis vous lui envoyez la chaîne des réponses pour traitement. Cela ira bien plus vite en traitement que la gestion de tableaux multidimensionnels.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
killshout
Niveau 2
Niveau 2
Messages : 21
Enregistré le : ven. 04 sept. 2009 18:54
Status : Hors ligne

Re: [R] Pointeur Tableau 2D

#12

Message par killshout »

Ouais j'vais peut être faire un tableau de chaine de type (xx,xxx,xx) et utiliser la fonction Stringsplit.

Merci !
Répondre