Structure, dim et liste

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Structure, dim et liste

Message par Golfy »

Bonjour,

j'ai un fichier avec les infos suivantes :

Code : Tout sélectionner

adresse;nombre;comment1;comment2.... comment'nombre'
1,2,Ch parents,Ch Bureau
2,2,Ch A,Ch B
3,2,Salon, Cuisine
4,1,Lampe Salon
5,1, Temp Cuisine
...
254,1, Temp Ch Parent
Quel serait le meilleur moyen de garder ce tableau en mémoire ?
1) Dim d'une structure contenant ADDR, NBRE et X champs COMMENT ?
2) Dim d'une structure contenant ADDR, NBRE et une liste chainée (comment faire) ?
3) 2) Dim d'une structure contenant ADDR, NBRE et une table DIM de X cases (string) ?
4) reste en mémoire comme tel (une variable chaine contenant tout le fichier) et analyse avec ligne et stringfield ? combien d'octets max ?

Merci de votre aide.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Structure, dim et liste

Message par Guimauve »

Bonjour,

Faudrait donner un peu plus de détail :

Primo : "1,2,Ch parents,Ch Bureau"

Le "1" veut dire quoi ? Un guess, c'est le numéro d'index, il commence toujours à "1" ?
Le "2" veut dire quoi ? Un guess, c'est le nombre de commentaire (le maximum est connu ? il varie entre 0, 1 et 2 ? ...)
Le "Ch parents" c'est une chaîne de caractères ?
Le "Ch Bureau" c'est une chaîne de caractères ?

Deusio : "254,1, Temp Ch Parent"

Le "254" c'est le dernier élément dans le fichier ? La liste continu au-delà de 254 ?

Tersio : Le premier numéro de chaque ligne (Guess que c'est le numéro d'index) est toujours dans l'ordre. On ne risque pas d'avoir le "1" suivit du "30" suivit du "2" suivit du "80" ?

-------------------------------------------------------------------------------------------------------------------------
On met l'hypothèse que le fichier texte est comme ceci :
adresse;nombre;comment1;comment2.... comment'nombre'
1,2,Ch parents,Ch Bureau
2,2,Ch A,Ch B
3,2,Salon, Cuisine
4,1,Lampe Salon
5,1,Temp Cuisine
Le code pour le charger dans une liste donne un truc du genre :

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V3.88.467
; Nom du projet : Le nom du projet ici
; Nom du fichier : Nom du fichier
; Version du fichier : 0.0.0
; Programmation : À vérifier
; Programmé par : Guimauve
; Date : 27-11-2011
; Mise à jour : 27-11-2011
; Codé pour PureBasic V4.60
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Comment

  List Liste.s()

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetCommentListe(CommentA)

  CommentA\Liste()

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetCommentListe(CommentA, P_Liste)

  GetCommentListe(CommentA) = P_Liste

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les macros complémentaires pour les Listes chaînées <<<<<

Macro AddCommentListeElement(CommentA)

  AddElement(GetCommentListe(CommentA))

EndMacro

Macro AddCommentListeElementEx(CommentA, P_Element)

  AddElement(GetCommentListe(CommentA))
  SetCommentListe(CommentA, P_Element)

EndMacro

Macro InsertCommentListeElement(CommentA)

  InsertElement(GetCommentListe(CommentA))

EndMacro

Macro InsertCommentListeElementEx(CommentA, P_Element)

  InsertElement(GetCommentListe(CommentA))
  SetCommentListe(CommentA, P_Element)

EndMacro

Macro SelectCommentListeElement(CommentA, Position)

  SelectElement(GetCommentListe(CommentA), Position)

EndMacro

Macro PreviousCommentListeElement(CommentA)

  PreviousElement(GetCommentListe(CommentA))

EndMacro

Macro NextCommentListeElement(CommentA)

  NextElement(GetCommentListe(CommentA))

EndMacro

Macro FirstCommentListeElement(CommentA)

  FirstElement(GetCommentListe(CommentA))

EndMacro

Macro LastCommentListeElement(CommentA)

  LastElement(GetCommentListe(CommentA))

EndMacro

Macro PopListCommentListePosition(CommentA)

  PopListPosition(GetCommentListe(CommentA))

EndMacro

Macro PushListCommentListePosition(CommentA)

  PushListPosition(GetCommentListe(CommentA))

EndMacro

Macro DeleteCommentListeElement(CommentA, Flag = 0)

  DeleteElement(GetCommentListe(CommentA), Flag)

EndMacro

Macro ListCommentListeSize(CommentA)

  ListSize(GetCommentListe(CommentA))

EndMacro

Macro ResetCommentListe(CommentA)

  ResetList(GetCommentListe(CommentA))

EndMacro

Macro ListCommentListeIndex(CommentA)

  ListIndex(GetCommentListe(CommentA))

EndMacro

Macro ClearCommentListe(CommentA)

  ClearList(GetCommentListe(CommentA))

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Macro de déboguage <<<<<

Macro DebugComment(CommentA)
  
  ForEach GetCommentListe(CommentA)
    Debug "Liste : " + GetCommentListe(CommentA)
  Next
    
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.002 secondes (78500.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur de chargement <<<<<

Procedure ReadCommentListe(FileName.s, List CommentA.Comment())
  
  If ReadFile(0, FileName)  
    
    While Eof(0) = 0     
      
      Line.s = Trim(ReadString(0))
     
      If Val(StringField(Line, 1, ",")) <> 0

        AddElement(CommentA())
        
        CommentCount = 2 + Val(StringField(Line, 2, ","))

        For CommentID = 3 To CommentCount
          AddCommentListeElementEx(CommentA(), Trim(StringField(Line, CommentID, ",")))
        Next

      EndIf
      
    Wend
    
    CloseFile(0)   
    
  Else
    
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

NewList Adresse.Comment()

ReadCommentListe("fichier", Adresse())

ForEach Adresse()
  DebugComment(Adresse())
  Debug ""
Next

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Débogueur a écrit :Liste : Ch parents
Liste : Ch Bureau

Liste : Ch A
Liste : Ch B

Liste : Salon
Liste : Cuisine

Liste : Lampe Salon

Liste : Temp Cuisine
A+
Guimauve
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Structure, dim et liste

Message par Golfy »

Bonjour Guimauve et merci pour ton aide :)

En fait, oui, j'ai 254 adresses maximum et oui la liste serait dans l'ordre. Il s'agit de modules domotiques : certains modules n'ont qu'une fonction (température par exemple) alors que d'autres peuvent aller jusqu'à 8 (bouton-poussoirs intelligents par exemple).
Mon idée est donc de pouvoir indiquer la fonction (comment) plutôt que l'adresse à l'utilisateur.

Au départ, j'imaginai une structure comme ceci :

Code : Tout sélectionner

Structure Module
	ModAdd.i																; Module address
	PartAdd.i																; Module Part address (BP8, 4RY, ...)
	ModName.s 															; Module name
EndStructure
mais ModName.s qui représente un commentaire devra contenir les 8 commentaires. Après, je me suis dit qu'un tableau de chaines serait sympa (index pour atteindre une fonction sur le bus = index du commentaire) mais peut-on mettre un tableau dans une structure, surtout s'il s'agit de chaines de caractères ?

Code : Tout sélectionner

Structure Module
	ModAdd.i																; Module address
	PartAdd.i																; Module Part address (BP8, 4RY, ...)
	dim ModName.s(8)          												; Module name
EndStructure
Par code le code avec des macros, j'ai jamais essayé :roll:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Structure, dim et liste

Message par Guimauve »

Bonjour Golfy,

L'idée générale est de faire correspondre la Structure "Module" avec les propriétés des modules de domotique.

Type : Module Intelligent
Nombre de bouton : 8

Type : Module Température
Nombre de bouton : 2

Type : Module contrôle sonore
Nombre de bouton : 4

Type : Module contrôle de lumière
Nombre de bouton : 2

On définie une constante par type de module de contrôle

Code : Tout sélectionner

Enumeration 
  
  #MODULE_TYPE_INTELLIGENT
  #MODULE_TYPE_TEMPERATURE
  #MODULE_TYPE_SOUND
  #MODULE_TYPE_LIGHT
  ; #MODULE_TYPE_
  ; #MODULE_TYPE_
  ; #MODULE_TYPE_
  
EndEnumeration
Ensuite la structure "Module" serait définie comme suit :

Code : Tout sélectionner

Structure Module
  
  Type.b 
  ID.l
  PartAddress.s
  ButtonCount.b
  ButtonName.s[8] ; 8 noms de 0 à 7

EndStructure
Et l'ensemble des modules

Code : Tout sélectionner

Structure Network

  Modules.Module[255]; 255 modules de 0 à 254

EndStructure
Lorsqu'on initialise chacun des modules, on leurs affectent le "Type" , le "ID", le "PartAddress", le "ButtonCount" et les "ButtonName". Cela peut ce faire à l'aide d'un programme d'édition ou manuellement dans un fichier *.pref ou *.xml.

J'espère que ça éclaire un peu ta lanterne .

A+
Guimauve
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Structure, dim et liste

Message par Golfy »

Oui, c'est parfait !
Vu le nombre d'adresses max, un tableau reste plus souple et peu couteux en mémoire qu'une liste chainée.

MERCI ! :D
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Répondre