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 :

Code : Tout sélectionner

Tab_Alpha(k)\ch[i,j] = 1
merci :wink:

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 :

Code : Tout sélectionner

Structure TCAR
   
   TheCar.c
   ch.Line[20,20]
   
EndStructure
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 :roll:

Encore merci à tous les deux, je m'en vais de ce pas m'amuser avec vos codes :D

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 :D
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 :wink:

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 ( :roll: ) 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 :wink: