Declaration d'une structure "complexe"

Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008
-
Salut à tous !

J'aimerais déclarer une structure pour pouvoir la manipuler avec FACILITE (Avec des Add, Remove si possible).
Voila ce que j'ai fait :

MA_STRUCTURE contient de 0 à n SOUS_STRUCTURE
une SOUS_STRUCTURE contient de 0 à n SOUS_SOUS_STRUCTURE

public
struct
MA_STRUCTURE
{

      public
SOUS_STRUCTURE[ ] SOUS_STRUCTURE_S;
}



public



struct



SOUS_STRUCTURE

{


      public



string
NUM_SOUS_STRUCTURE;


      public



string
NOM_SOUS_STRUCTURE;


      public



SOUS_SOUS_STRUCTURE
[ ] SOUS_SOUS_STRUCTURE_S;
}




public



struct



SOUS_SOUS_STRUCTURE

{


      public



string
A;


      public



string
B;


      public



string
C;


      public



string
D;


      public



int
E;


      public



int
F;
}


Le problême c'est que je veux pouvoir ajouter/supprimer/modifier une SOUS_STRUCTURE appartenant au tableau SOUS_STRUCTURE_S, et ajouter/supprimer/modifier une SOUS_SOUS_STRUCTURE appartenant au tableau SOUS_SOUS_STRUCTURE_S.
Donc ce qu'il faudrait c'est que je puisse écrire ("en gros") :
MA_STRUCTURE M=new MA_STRUCTURE();
M.Add( ... une SOUS_STRUCTURE)
M.Remove (... une SOUS_STRUCTURE)

Moi j'ai l'habitude de faire ça en C (pas d'instanciation, on nomme directement la stucture), et la j'ai quelques problême de déclaration je crois).

Si vous pouviez m'aider un peu ...
Merci d'avance.

MMN

16 réponses

Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Une structure avec des méthodes...ca s'appelerai pas une classe tout simplement?
Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

apres verification (http://www.c-sharpcorner.com/Language/StructuresInCSRVS.asp),
une structure est un type... donc utilisable sans new...

vu ce que tu veux faire t'as plutot interet à utiliser des classes et a remplacer tes tableaux par des listes
des listes génériques devraient faire exactement se que tu souhaite

Nul ne devient grand par la guerre...
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

  heu ...

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

En fait, exactement.
Il faudrait que mes tableau[] soient des arrayList.
Mais comment déclarer SOUS_STRUCTURE_S
comme une ArrayList de SOUS_STRUCTURE, et SOUS_SOUS_STRUCTURE_S comme une ArrayList de SOUS_SOUS_STRUCTURE ?

Je crois qu'il est la mon problême ...

MMN
Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

la "seule" différence entre une structure et une classe c'est que la structure sera stockée comme s'il s'agissait d'un type (comme un entier par exemple)

pour ce qui est des liste génériques:

public SOUS_STRUCTURE[ ] SOUS_STRUCTURE_S;

serait plutot remplacé par:

public List<SOUS_STRUCTURE> SOUS_STRUCTURES_S;

Nul ne devient grand par la guerre...
Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

petit bemol quand meme, ce que je viens de te donner ne marche qu'en Dotnet 2.0

sinon, une fois que t'as declaré une list tu l'utilise comme une arraylist

Nul ne devient grand par la guerre...
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

OK merci, je ne connaissais pas ce "genre" de déclaration.
J'essaye ...

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

J'ai un Hic :
Quand j'écris
MASTRUCTURE.SOUS_STRUCTURE[i].NOM_SOUS_STRUCTURE= une string

(MASTRUCTURE étant une instanciation de MA_STRUCTURE)
J'ai cette erreur :
Error 1 Cannot modify the return value of 'System.Collections.Generic.List<OptiInfoNC.MesOutils.SOUS_STRUCTURE>.this[int]' because it is not a variable 

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Est ce que tu pourrais m'expliquer la différence entre:
- MaStructure M = new MaStructure();
et
- MaStructure M;

J'ai jamais eu de "cours" sur la prog objet, et certaines notions, que j'utilise tout le temps pourtant, restent abstraites.

MMN
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

Ça ne fonctionnera pas, il faut utiliser les classes.
Théoriquement parlant, les structures sont des valuetype (stocké comme un integer, float, ...) et pour les mettre dans une liste, il faut donc les transferer en mode reference (sur le heap). C'est ce que fait un ArrayList et l'opération s'appelle le boxing/unboxing. Avec les génériques (List<T>), le boxing/unboxing n'est pas utilisé et par conséquent (théoriquement) une structure ne pourras jamais tenir dans une List<T>.
Ca explique l'erreur que t'as.

(corrigez moi si je me trompe :)
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Donc peux tu me montrer comment définir une classe Tableau qui contient un nombre INDEFINI de tableauxA, contenant eux même des champs et un nombre INDEFINI de tableauxB, contenant eux même différents champs ? (Champ = chaine, int ...)
Je veux pouvoir modifier les valeurs des champs, modifier/Ajouter/supprimer des tableauxA et des tableauB.

ex :

Tableau MonTableau = new Tableau();

MonTableau.TableauxA[0].Nom = "Nom";
MonTableau.TableauxA[1].TableauB[0].Num = 0;
etc ...

MonTableau.TableauxA[0].Remove();
etc ...

Merci d'avance.

MMN
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Badrbadr, on peut utiliser une liste générique de structs, dans ce cas il n y a pas de boxing/unboxing, dans le ArrayList le box/unbox vient du fait qu'en interne le ArrayList maintient un tableau d'objets ( Objects ).

Moomoon, que tu alloues une struct avec new ou sans new, c'est quasi la même chose, dans les deux cas ça reste un type "valeur" le new n'alloue pas la structure dans le tas ( heap ) mais sans new les champs sont non initialisés, mais le compilo te previent si tu tentes d'y accèder avant.de les initialiser.
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Donc si je met "new", si je comprends bien, ça alloue la place dans la mémoire.
Ce que tu appelles le heap, c'est la pile d'execution ?

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Non c'est l'inverse, c'est si je ne met pas "new" que ça réserve la place dans la ram ?

MMN
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

Merci Lutinore pour les explications.
Pour Moomoon07, je t'ai fais un petit code qui pourra t'aider :



using
System;



using
System.Collections.Generic;



using
System.Text;




 



namespace
ConsoleApplication1



{



class

Container




{



    publicList<Element> Elements = newList<Element>();



}



struct

Element




{



    public Element(string name) { this.ElementName = name; }



    publicstring ElementName;



}



class

Program




{



    staticvoid Main(string[] args)



   
{



        Container container = newContainer();



        //on ajoute trois éléments



       
container.Elements.Add(newElement("element 1"));



        container.Elements.Add(newElement("element 2"));



        container.Elements.Add(newElement("element 3"));



        //je supprime le deuxième (il faut compter à partir de zero)



        container.Elements.RemoveAt(1);



        //on parcourt notre liste en affichant les éléments



        //seul les éléments 1 et 3 seront affichés



        foreach (Element e in container.Elements)



        {



            Console.WriteLine(e.ElementName);



        }



    }



}



}


 










[:D] @++
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

Pour plus de clarté, je l'ai mis ici avec de la couleur :
http://aspspider.net/badrbadr/divers/list.htm

Bon travail...

[:D] @++