Declaration d'une structure "complexe"

Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014 - 3 nov. 2006 à 13:53
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 - 4 nov. 2006 à 01:39
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

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
3 nov. 2006 à 14:01
Une structure avec des méthodes...ca s'appelerai pas une classe tout simplement?
0
Miltiades Messages postés 233 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 octobre 2010
3 nov. 2006 à 14:04
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...
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 14:06
  heu ...

MMN
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 14:09
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Miltiades Messages postés 233 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 octobre 2010
3 nov. 2006 à 14:12
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...
0
Miltiades Messages postés 233 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 octobre 2010
3 nov. 2006 à 14:14
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...
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 14:28
OK merci, je ne connaissais pas ce "genre" de déclaration.
J'essaye ...

MMN
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 14:45
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
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 15:04
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
0
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
3 nov. 2006 à 16:07
Ç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 :)
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 16:32
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 nov. 2006 à 17:01
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.
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 17:14
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
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
3 nov. 2006 à 17:15
Non c'est l'inverse, c'est si je ne met pas "new" que ça réserve la place dans la ram ?

MMN
0
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
4 nov. 2006 à 01:35
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] @++
0
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
4 nov. 2006 à 01:39
Pour plus de clarté, je l'ai mis ici avec de la couleur :
http://aspspider.net/badrbadr/divers/list.htm

Bon travail...

[:D] @++
0
Rejoignez-nous