PureBasic

Forums PureBasic
Nous sommes le Sam 24/Aoû/2019 5:33

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 37 messages ]  Aller à la page 1, 2, 3  Suivante
Auteur Message
 Sujet du message: pointeur de liste
MessagePosté: Mer 18/Avr/2018 21:04 
Hors ligne

Inscription: Jeu 19/Oct/2017 22:10
Messages: 5
Bonjour,

je souhaite creer une structure dont l'un des champs serait une liste chainee.

j'ai besoin que cette liste soit globale, pour pouvoir etre commune a plusieurs variables du type de ma structure.

j'ai essayé de faire pointer la liste de chaque variable vers le 1er element de la liste globale, mais cela ne fonctionne pas.

Est-il possible d'avoir un champ de structure qui soit un pointeur vers une liste globale?
et qui permette d'utiliser les fonctions des listes (NextElement, listSize, FirstElement, etc...)?

Code:
Structure mystruct
  id.i
  name.s
  List lnum.i()
EndStructure

; Declare une liste globale de 10 elements
; initialisés avec les valeurs de 1 a 10
Global NewList glnum.i()
For i=1 To 10
  AddElement(glnum())
  glnum() = i
Next

ForEach glnum()
  Debug "liste globale:"+glnum()
Next
; Declare 2 objets
Define obj1.mystruct
Define obj2.mystruct

; initialise leurs valeurs
obj1\id = 11
obj1\name = "objet 1"

obj2\id = 22
obj2\name = "objet 2"

; fait pointer leur liste vers la liste globale (partagee entre les 2 objets)
obj1\lnum() = FirstElement(glnum()) ;=> ici erreur, la liste chainee ne contient aucun element
obj2\lnum() = FirstElement(glnum())

ForEach obj1\lnum()
  Debug "liste obj1:"+obj1\lnum()
Next

ForEach obj1\lnum()
  Debug "liste obj2:"+obj1\lnum()
Next


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Mer 18/Avr/2018 22:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8739
Bonjour, primo, si tu es un bot, tu as fait de sacrés progrès ^^
Sinon :
Ce que tu cherches à faire me parait un peu tordu.
Utiliser les "map" ne serait pas plus adéquat ?

ex de la doc avec une structure:
Code:
Structure Voiture
    Poids.l
    Vitesse.l
    Prix.l
  EndStructure

  NewMap Voitures.Voiture()
 
  ; Ici, nous utilisons l'élément courant après l'insertion du nouvel élément
  ;
  Voitures("Ferrari F40")\Poids = 1000
  Voitures()\Vitesse = 320
  Voitures()\Prix = 500000
 
  Voitures("Lamborghini Gallardo")\Poids = 1200
  Voitures()\Vitesse = 340
  Voitures()\Prix = 700000

  ForEach Voitures()
    Debug "Nom de la Voiture: "+MapKey(Voitures())
    Debug "Poids: "+Str(Voitures()\Poids)
  Next


Remplace "Ferrari F40" par Obj1 et "Lamborghini Gallardo" par Obj2 et sa semble coller à ton projet non ?

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 12:56 
Hors ligne

Inscription: Jeu 19/Oct/2017 22:10
Messages: 5
Bonjour,
Merci Ar,-S pour ta reponse!
Malheureusement, je ne vois pas trop le lien avec mon probleme.
Tu me proposes de mettre mes 2 variables obj1 et obj2 dans une map, mais cela ne permet pas de partager une donnee membre entre obj1 et obj2.
Pour que cela soit plus concret, je cree des objets graphe dont la structure de donnees comporte, entre autres, une liste de valeurs, une liste de couleurs, etc...
J'ai besoin que plusieurs graphes puissent avoir le meme jeu de donnees et les memes couleurs, d'ou l'idee d'utiliser des pointeurs de listes, plutot que des listes.

J'ai fait un autre essai en initialisant les listes de obj1 et obj2 avec ChangeCurrentElement().
L'initialisation.fonctionne, mais les listes sont vides pour PB (listsize=0)
J'imagine que PB gere lis listes chainees avec les infos de la liste stoquees quelque part, en 0lus des pointeurs *next et *previous, mais je n'arrive pas a trouver ou en observant la memoire...


Code:
Structure mystruct
  id.i
  name.s
  List lnum.i()
EndStructure

; Declare une liste globale de 10 elements
; initialisés avec les valeurs de 1 a 10
Global NewList glnum.i()
For i=1 To 10
  AddElement(glnum())
  glnum() = i
Next

ForEach glnum()
  Debug "liste globale:"+glnum()
Next
; Declare 2 objets
Define obj1.mystruct
Define obj2.mystruct

; initialise leurs valeurs
obj1\id = 11
obj1\name = "objet 1"

obj2\id = 22
obj2\name = "objet 2"

; fait pointer leur liste vers la liste globale (partagee entre les 2 objets)
;obj1\lnum() = FirstElement(glnum()) ;=> ici erreur, la liste chainee ne contient aucun element
;obj2\lnum() = FirstElement(glnum())
ChangeCurrentElement(obj1\lnum(),FirstElement(glnum())
ChangeCurrentElement(obj2\lnum(),FirstElement(glnum())

Debug "taille liste de obj1:"+ListSize(obj1\lnum()) ;=> 0!!!
ForEach obj1\lnum()
  Debug "liste obj1:"+obj1\lnum()
Next

Debug "taille liste de obj2:"+ListSize(obj2\lnum());=> 0!!!
ForEach obj2\lnum()
  Debug "liste obj2:"+obj2\lnum()
Next



Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 15:17 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
Bon allez... De tête... Version 'procédure spécifique à Gtodo'
Code:

structure todo
list act.s()
endstructure

global Gtodo.todo

procedure GtodoAjoute(act.s)
addelement(Gtodo\act() )
Gtodo\act() = act
endprocedure

GtodoAjoute("remercier Yvonne")
GtodoAjoute("rembourser Yolande")
GtodoAjoute("nettoyer lunette")

ForEach Gtodo\act()
debug Gtodo\act()
Next

Il te faut une version 'procédure générale' ?
De type
Code:
Ajoute(Gtodo, "acheter savon")
Ajoute(Courses, "savon")

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 15:33 
Hors ligne

Inscription: Jeu 19/Oct/2017 22:10
Messages: 5
Hello,
j'ai peut etre mal exprime mon probleme, mais si on part de ton exemple, comment creer un Gtodo2 de type todo dont la liste act() soit commune avec Gtodo?
Il faut que la liste soit partagee, et pas une copie, de sorte que sij'ajoute un element a la liste, la modif soit vue des 2 objets Gtodo et Gtodo2.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 16:27 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
Je suis dans le train mais à voir, il suffit de créer une seule liste (globale dans ce cas, ce serait mieux) et de remplacer (même si tu n'y es pas obligé) le champ liste de ta structure par un pointeur, qu'il faudra forcément initialiser à la première utilisation.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 16:42 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
Version 'procédure générale' sur le principe de copie de chaîne (a contrario du principe de copie de pointeurs qui est moins gourmand en mémoire, mais moins simple à comprendre en une fois)
Code:
Structure LST
List Act.S()
EndStructure

Global Todo.LST



Procedure Ajouter(Quoi.S, *AQuoi.LST)

AddElement(*AQuoi\Act() )
*AQuoi\Act() = Quoi

AddElement(Todo\Act() )
Todo\Act() = Quoi

EndProcedure



Procedure Lire(*Quoi.LST)

ForEach(*Quoi\Act() )
Debug *Quoi\Act()
Next
Debug " "

EndProcedure



Define Lundi.LST
Define Mardi.LST


Ajouter(">>> TODO <<<", Todo) ; facultatif
Ajouter(">>> LUNDI <<<", Lundi) ; facultatif
Ajouter(">>> MARDI <<<", Mardi) ; facultatif


Ajouter("Courses", Lundi)
Ajouter("Coiffeur", Mardi)
Ajouter("Dentiste", Mardi)

Lire(Todo)
Lire(Lundi)
Lire(Mardi)
@Djes

Je suis à pied, j'espère que mon code ne boguera pas...
(T'as fait comment pour avoir un train, ça fait une semaine que je suis coincé...)

:!: [moderation:falsam] en mp la réponse svp. On ne va pas débattre sur le transport

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 17:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
Cette question me pertube
ymerdy a écrit:
Est-il possible d'avoir un champ de structure qui soit un pointeur vers une liste globale?
Non

- Un pointeur de liste pointe sur un élément de liste et non pas sur la liste entière.
- La boucle ForEach ... Next ne permet pas de démarrer depuis un point précis de ta liste.

Code:
obj1\lnum() = FirstElement(glnum()) ;=> ici erreur, la liste chainee ne contient aucun element
Normal cette erreur. Une liste ne peut pas etre le pointeur d'un element d'une liste.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 18:02 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
Allez... Version 'sans les dents' : donc j'ai modifié mon code plus haut pour que désormais, ce soit les pointeurs qui soient stockés, et non plus des copies de chaîne.

Ainsi, un bon apprentissage consiste à jouer aux 7 différences entre les 2 codes.

(Si ça bogue, pas de stress)
Code:
Structure LST
List Act.S()
EndStructure

Global Todo.LST

Structure LSTPTR
List *Act()
EndStructure

Procedure Ajouter(Quoi.S, *AQuoi.LSTPTR)

AddElement(Todo\Act() ) ; inchangé
Todo\Act() = Quoi

AddElement(*AQuoi\Ptr() )
*AQuoi\Act() = @Todo\Act()

EndProcedure



Procedure Lire(*Quoi.LST)
ForEach(*Quoi\Act() )

ChangeCurrentElement(Todo(), *Quoi\Act() )
Debug Todo\Act()

Next
Debug " "
EndProcedure



Define Lundi.LSTPTR
Define Mardi.LSTPTR

Ajouter("Courses", Lundi)
Ajouter("Coiffeur", Mardi)
Ajouter("Dentiste", Mardi)

ForEach Todo()
Debug Todo()
Next
Debug " "

Lire(Lundi)
Lire(Mardi)

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Jeu 19/Avr/2018 18:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
Et bien ça bug ligne16 !!! Ollivier teste avant de balancer tes codes. Attends au moins d'etre chez toi.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Ven 20/Avr/2018 9:09 
Hors ligne

Inscription: Mer 21/Jan/2004 17:48
Messages: 5162
Si ta liste est globale, pourquoi vouloir pointer dessus ?

Tu peux aussi créer tes propres listes, sans utiliser celles de PureBasic, comme ça tu fais comme tu veux (c'est à toi d'allouer l'espace mémoire, de le libérer, mais c'est plus souple).

_________________
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Ven 20/Avr/2018 10:28 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
@Falsam

J'ai dit "pas de stress".

remplacer ligne 16
Code:
AddElement(*AQuoi\Ptr() )

par
Code:
AddElement(*AQuoi\Act() )


3 lettres à remettre en place...

@Comtois

Comtois a écrit:
Si ta liste est globale, pourquoi vouloir pointer dessus ?
Et pourquoi pas? :D
Bonjour à toi !

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Sam 21/Avr/2018 16:24 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
Je découvre ça :
Falsam a écrit:
- Un pointeur de liste pointe sur un élément de liste et non pas sur la liste entière.
- La boucle ForEach ... Next ne permet pas de démarrer depuis un point précis de ta liste.

Bon... Vous l'aurez deviné : c'est faux pour les deux item ci-dessus...

Bonne soirée les gars...

_________________
Juste la 4G pour Smartphone


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Dim 22/Avr/2018 22:48 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
il est possible d'utiliser CopyList, ce qui donnera quelque chose comme ça, mais c'est pas très raisonnable:
; fait pointer leur liste vers la liste globale (partagee entre les 2 objets)
CopyList(glnum(), obj1\lnum())

On peut effectivement utiliser des pointeurs mais du coup autant créer sa propre liste chainée, cela a déjà été fait, notamment pour créer des listes chainées dynamiques (créer des listes a la volée sans avoir a les déclarées auparavant). J'en ai moi même réalisé de mémoire, je ne suis pas le seul.

Je verrais bien aussi une solution avec des interfaces (vtable).


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: pointeur de liste
MessagePosté: Lun 23/Avr/2018 9:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
En fait, et malgré la réponse apportée par demivec sur le forum anglais, je pense qu'il est plus simple d'utiliser la liste globale, et de mettre le pointeur de position dans la structure. À chaque utilisation des «objets», on se positionne sur l'élément voulu, et voilà, inutile de jongler avec des pointeurs.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 37 messages ]  Aller à la page 1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye