Page 1 sur 1
[Demande]-Tableau multi dimension déclaré dans une structure
Publié : dim. 02/avr./2006 0:34
par flaith
Bonjour les gens,
comment faire pour que j'ai ca ?
Code : Tout sélectionner
Structure TCar
TheCar.c ; le caractère
ch.b[20,20] ; Maximum pour un car = 20x20 pixels
EndStructure
Dim Tab_Alpha.TCar(96)
cela concerne la ligne ou se trouve
ch.b[20,20]
car je voudrais ensuite y accéder de cette façon :
merci

Publié : dim. 02/avr./2006 2:34
par Guimauve
Primo faire un tableau multiple dans une structure de donnée n'est pas aussi simple que ça. Faire comme ceci :
C'est impossible, il faut faire comme suit :
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>
Structure Line
Array.b[20]
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>
Procedure SetLineArray(*ObjetA.Line, Index, Array.b)
*ObjetA\Array[Index] = Array
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>
Procedure.b GetLineArray(*ObjetA.Line, Index)
ProcedureReturn *ObjetA\Array[Index]
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>
Structure TCAR
TheCar.c
ch.Line[20]
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>
Procedure SetTCARTheCar(*ObjetA.TCAR, TheCar.c)
*ObjetA\TheCar = TheCar
EndProcedure
Procedure SetTCARCh(*ObjetA.TCAR, Index, *Ch.Line)
CopyMemory(*Ch, *ObjetA\ch[Index], SizeOf(Line))
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>
Procedure.c GetTCARTheCar(*ObjetA.TCAR)
ProcedureReturn *ObjetA\TheCar
EndProcedure
Procedure GetTCARCh(*ObjetA.TCAR, Index)
ProcedureReturn *ObjetA\ch[Index]
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le mutateur Spécial >>>>>
ProcedureDLL SetTCARchNumber(*ObjetA.TCAR, LineIndex, RowIndex, Number.f)
SetLineArray(GetTCARCh(*ObjetA, LineIndex), RowIndex, Number)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'observateur Spécial >>>>>
ProcedureDLL.f GetTCARchNumber(*ObjetA.TCAR, LineIndex, RowIndex)
ProcedureReturn GetLineArray(GetTCARCh(*ObjetA, LineIndex), RowIndex)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dim Alpha.TCAR(96)
For Comteur = 0 To 95
For LineIndex = 0 To 19
For RowIndex = 0 To 19
SetTCARchNumber(Alpha(Compteur), LineIndex, RowIndex, 1)
Next
Next
Next
For Comteur = 0 To 5 ; 95
Debug "Index Tableau (Dim) no. " + Str(Compteur)
For LineIndex = 0 To 5 ; 19
Debug "Ligne Tableau Static no. " + Str(LineIndex)
For RowIndex = 0 To 5 ; 19
Debug "Rangé Tableau Static no. " + Str(RowIndex)
Debug GetTCARchNumber(Alpha(Compteur), LineIndex, RowIndex)
Next
Next
Next
D'accord le code n'est pas très élégant mais ça fonctionne. J'espère que ça peut t'aider.
A+
Guimauve
Publié : dim. 02/avr./2006 9:33
par comtois
je ne me casse pas la tête , je n'utilise qu'une dimension
Code : Tout sélectionner
Structure TCar
TheCar.c ; le caractère
ch.b[400] ; Maximum pour un car = 20x20 pixels
EndStructure
Dim Tab_Alpha.TCar(96)
For k = 65 To 96
Index = 0
For j = 0 To 19
For i = 0 To 19
Tab_Alpha(k)\ch[Index] = 1
Index + 1
Next i
Next j
Next k
; et si tu n'es pas dans une boucle et que tu veux connaitre la valeur de 'Tab_Alpha\ch[i,j]'
; Tu as juste à faire :
;Index = j * 20 + i
;Tab_Alpha(k)\ch[Index]
comme ça tu as deux solutions à toi de voir

Publié : dim. 02/avr./2006 10:18
par flaith
Merci beaucoup à vous deux
@guimauve : impressionnant ton code
@comtois : pas mal, j'avais pensé à cette soluce
c'est vrai que cela aurait été plus simple si on avait la possibilité de définir des tableaux multi dans une structure ... bah ... pour la 4.1 pitêtre
Encore merci à tous les deux, je m'en vais de ce pas m'amuser avec vos codes

Publié : dim. 02/avr./2006 10:27
par Guimauve
J'espère qu'il n'est pas trop tard ...
Une autre solution cette fois avec une Macro
Code : Tout sélectionner
Structure Vector5D
Coords.f[5]
EndStructure
Structure Matrix5X5
Line.Vector5D[5]
EndStructure
Macro MatrixAccess(Matrix, i,j)
Matrix\Line[ i ]\Coords[ j ]
EndMacro
Matrice.Matrix5X5
MatrixAccess(Matrice, 0,0) = 6
For Line = 0 To 4
Debug "Ligne no. " + Str(Line)
For Row = 0 To 4
Debug "Rangée no. " + Str(Row)
Debug MatrixAccess(Matrice, Line,Row)
Next
Next
A+
Guimauve
Publié : dim. 02/avr./2006 10:36
par flaith
Merci guimauve, je viens de le voir sur le forum anglais, t'as été plus rapide que moi
sinon il n'est jamais trop tard, ca fera une 3ème soluce de plus ce qui n'est pas mal du tout ... hop hoph je teste ca de suite ...
encore merci

Publié : dim. 02/avr./2006 10:54
par Guimauve
Avec une macro c'est plus simple car elle peut accèder au tableau dans les 2 sens (Lecture - Écriture) alors que le premier code que j'avais donnée comporte une commande en lecture et une en écriture.
C'est plus gros à mettre en oeuvre. Mais si tu es du genre comme moi, à faire de la programmation basé objet et faire des librairies avec Tailbite, c'est la seule solution
Si non les macros c'est la meilleur solution.
A+
Guimauve
Publié : dim. 02/avr./2006 11:38
par flaith
En fait j'essaye (

) de convertir un de mes programmes fait avec Delphi sous Pure, donc le côté objet est interessant, mais sous Pure c'est assez dur à avaler et comme je suis de la vieille école, je suis resté fidèle au C (un jour, qui sait, je me mettrais au C++) donc j'vais prendre la macro
