[Résolu] Problème avec tableau multi dimensions

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Problème avec tableau multi dimensions

Message par Micoute »

J'ai un problème avec une tableau à 3 dimensions que je déclare avec Global Dim TabCoord.i(1,1,1), le soucis vient du fait que je ne sais pas à l'avance combien d'éléments il y aura dans mon tableau à la fin du traitement et je ne sais pas ce que je dois mettre comme paramètres dans mon ReDim, sachant que la première dimension de mon tableau, c'est la position X, la seconde position, c'est la position Y et la dernière position, c'est la couleur. Je pense que la vraie question est "peut-on redimensionner plusieurs fois le même tableau ?"
Je sollicite donc l'aide collégiale car je sais que toute le monde me répondra et je vous en remercie tous de tout coeur.
Dernière modification par Micoute le mer. 22/août/2012 20:57, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Problème avec tableau multi dimensions

Message par MLD »

Tu exagère un tantinet.
Ta demande est le B.A BA de la manipulation des tableaux.
Tu trouvera la réponse dans l'aide PB
Si tu ne tente rien, tu ne sauras jamais rien.
Donne nous au moins un code, pour que l'ons puissent te dire ou tu n'as pas compris.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problème avec tableau multi dimensions

Message par Backup »

Micoute a écrit :J'ai un problème avec une tableau à 3 dimensions que je déclare avec Global Dim TabCoord.i(1,1,1), le soucis vient du fait que je ne sais pas à l'avance combien d'éléments il y aura dans mon tableau à la fin du traitement et je ne sais pas ce que je dois mettre comme paramètres dans mon ReDim,

la doc est clair
Si ReDim est utilisé sur un tableau à plusieurs dimensions, seule la dernière dimension peut être changée.
bref , un tableau multi-dimension , ne peut pas etre redimensionné ...

je dirai : ; de toute façon un tableau , en Purebasic , n'est pas vraiment fait pour les données dont on ne connais pas a l'avance le nombre

c'est pour cette raison , qu'il existe les Liste Chainée

rappel ;
une liste chainée c'est une Liste ( la bonne blague ) d'elements ...

a toi de voir ce que tu vas faire de ces elements !
gros avantage , tu n'est pas limité par la taille comme un tableau

donc , pour ton soucis , il te suffit de "ranger" dans une liste tes donnée de la façon suivante

Liste :
45 <---- valeur X du 1er point
56 <---- valeur Y du 1er point
456546 < ---- couleur du 1er point
87 <---- valeur X du 2em point
89 valeur Y du 2em point
65488 couleur du 2em point
.... etc


tu peux ainsi aisément ressortir les coordonnées et la couleur d'un point
avec une simple boucle et un Step 3 par exemple ...

c'est une piste .. il y a d'autre méthode (l'utilisation d'une structure par exemple .... voir les TUTO sur le Forum )
avec là l'utilisation d'un tableau , ou d'une liste ....
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Resolu] Problème avec tableau multi dimensions

Message par Micoute »

Merci Dobro ! C'est toi qui as le mieux compris ce que je veux faire, j'ai compris qu'on ne peut indéfiniment redimensionner un tableau, j'ai donc fait une boucle test pour incrément un compteur qui m'a servi pour redimensionner mon tableau.

Déjà un grand merci de m'avoir répondu.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problème avec tableau multi dimensions

Message par Backup »

pour te montrer concretement comment se servir d'un tableau Structuré avec une image

voici un exemple commenté , qui de montre de façon scolaire, comment lire le contenu d'une image
pour le mettre dans une structure

puis un traitement (echange de la composante Rouge et Bleu de chaque point ) est effectué ...

on redessine la nouvelle image, et on l'affiche dans un Ecran en Fenetre .....

ça fait , je pense une bonne base :)

Code : Tout sélectionner

UseJPEGImageDecoder()


; *** taille fenetre ****
#Width = 600
#Height = 600
; **********************

Structure point_image
	x.l   ; la coordonée X
	y.l ; la corrdonée y
	couleur.l ; la couleur du pixel
EndStructure
dim  point_image.point_image(1)  ; on donne une taille de 1 par defaut ... voir plus loin le redimenssionnement


; les enumerations histoire que ce soit plus parlant que des chiffres ....
Enumeration
	#window 
	#Panel
	#Cont
	#image
EndEnumeration

;- Initialisation de DirectX
If  InitSprite()=0 or InitKeyboard() = 0 Or InitMouse() = 0
	MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
	CloseWindow(#window) : End
EndIf


;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#window, 0, 0,  #Width, #Height, "",#PB_Window_TitleBar | #PB_Window_ScreenCentered|#PB_Window_SystemMenu  )

ScrollAreaGadget(#Panel,10, 10,500,500, 1024, 768, 30)
hCont = ContainerGadget(#Cont,10,10,1024,768,#PB_Container_Double)
OpenWindowedScreen(hCont, 0, 0, 1024, 768, 0, 0, 0)   

file$=OpenFileRequester("choisir une image a charger","c:\","*.jpg",1) ; on demande une image
if file$
	if LoadImage(#image,file$)
		Else
		MessageRequester("erreur","l'image ne peut etre chargé")
		End
	endif
endif

;normalement ici on a une image valide
; nous allons recuperer sa taille x,y
ResizeImage(#image,1024,768)
Largeur = ImageWidth(#Image)
Hauteur = ImageHeight(#Image) 
SetGadgetAttribute(#Panel, #PB_ScrollArea_InnerWidth , Largeur) ; je redimensionne au passage les Scrolls Gadget
SetGadgetAttribute(#Panel, #PB_ScrollArea_InnerHeight , Hauteur) ; je redimensionne au passage les Scrolls Gadget


; la taille de l'image va nous permetre de redimensionner notre Tableau (structure)
redim point_image(Largeur*Hauteur ) ; voilla notre structure est capable de recevoir tout les points de notre image

;maintenant que nous avons sa taille , avec  2 boucles on va lire les points de notre image, et les mettre dans la structure ...
StartDrawing(ImageOutput(#image))  ; donc on va travailler dans notre image , on va lire les points
	for y=0 to Hauteur-1
		for x=0 to Largeur-1
			compteur=compteur+1
			point_image(compteur )\x=x ; on met la coordoné X du point en cours ; dans la structure
			point_image(compteur )\y=y ; on met la coordoné X du point en cours ; dans la structure
			point_image(compteur )\couleur=point(x,y) ; on met la couleur du point dans notre structure
		next x
	next y
StopDrawing()

; ici normalement toute l'image est dans notre structure !
; maintenant  , on peut s'amuser a relire les points, et a changer la couleur ... par exemple :
taille_du_tableau =compteur ;ArraySize( point_image() ,1)

for y=0 to Hauteur-1
	for x=0 to Largeur-1 ;  pour tout les points du tableau ..... ; maintenant que l'image est dans le tableau , l'operation va etre tres rapide ;o) 
		i=i+1
		; ici , on va ne changer que la couleur
		; on va decomposer notre couleur en RVB
		Rouge= red(point_image(i )\couleur)
		vert= green(point_image(i )\couleur)
		bleu=blue(point_image(i )\couleur)
		; maintenant , on va echanger le Rouge avec le bleu ( bonjour le traitement LOL )
		buff=Rouge 
		Rouge=bleu
		bleu=buff  ; l'echange avec 3 variables est vraiment une base , il aurai mieux valut utiliser directement la variable "bleu" a la place de "rouge" et c'etait fait :D 
		; on va recomposer la couleur et la mettre dans la structure
		point_image(i )\couleur=rgb(rouge,vert,bleu) ; c'est ici que l'echange de variable aurai ete plus simple en ecrivant  "rgb(bleu,vert,rouge)" ;o)
	next x
next y ; et ceci pour tout les points de l'image 

; voyons le résultat ::
; on va redessiner l'image  avec ses nouvelles couleurs
compteur=0
StartDrawing(ImageOutput(#image))  ; donc on va travailler dans notre image , on va ecrire les points
	for y=0 to Hauteur-1
		for x=0 to Largeur-1
			compteur=compteur+1
			plot(x,y,point_image(compteur )\couleur) ; on se sert du contenu de notre structure pour redessiner l'image
		next x
	next y
StopDrawing()

; allez on affiche l'oeuvre d'art histoire de rire :





;- ** début de la boucle **********************


Repeat
	ExamineMouse()  ; on demande a purebasic de surveiller les event de souris !
	ExamineKeyboard() ; on demande a purebasic de surveiller les event de clavier!
	evnt= waitWindowEvent(2)
	
	Select    evnt
		Case #PB_Event_CloseWindow 
		End 
	EndSelect
	
	StartDrawing(ScreenOutput())
		DrawText(10, 10, "touche ESC pour quitter" ,RGB(255,255,0),RGB(0,0,0))
		DrawImage(ImageID(#image),0,0)
	StopDrawing()
	
	
	FlipBuffers() : ClearScreen(RGB(0,0,0))
	
	
	
Until KeyboardPushed(#PB_Key_Escape)
; **************** fin de boucle ************************











; EPB

Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec tableau multi dimensions

Message par Micoute »

Oh merci beaucoup, c'est ça que je voulais faire, mais en moins bien ! Je manque de qualificatifs pour dire mon émotion.

Pourrais-tu m'expliquer comment mettre [Resolu] ?
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problème avec tableau multi dimensions

Message par Backup »

edite ton premier message
c'est seulement dans le premier qu'on peut editer le titre du topic ;)
Répondre