IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Problème de gcnew avec des tableaux


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Problème de gcnew avec des tableaux
    Bonjour,

    Cela fait maintenant plusieurs jours que je butte sur un problème. Je n'arrive pas a créer un nouveau type non static.
    Je m'explique:
    Je souhaite créer un type Image qui contient un champ Delay (UChar) et un champ pixels qui serait du type t_pixel (UChar r,v,b).

    Avec le code suivant j'arrive sans problème a créer une image et a remplir les valeurs. Cependant je n'arrive pas a créer un tableau d'image. Accun problème a la compilation mais a l'execution de cette ligne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this->s_image[0]->delay = 50;
    J'ai le droit a une jolie execption System.NullReferenceException, car les elément ne semble pas crées. J'ai la confirmation avec le débugger qui me dit que les 2 élement de mon tableau sont non définis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public value struct t_pixel
    {
    public:
    	unsigned char red;
    	unsigned char green;
    	unsigned char blue;
    };
     
    public ref class img
    {
    public:
    	array<t_pixel> ^pixels;
    	unsigned char delay;
    public:
    	img(void)
    	{
    		this->pixels = gcnew array<t_pixel>(64);
    	};
    };
     
    public ref class TEST
    {
    public:
    	TEST(void)
    	{	
    		this->s_image = gcnew array<img^>(2);
    	}
     
    	void init(void)
    	{
    		this->s_img.delay=3;
    		this->s_img.pixels[0].red=55;
     
    		this->s_image[0]->delay = 50;
    		this->s_image[1]->delay = 142;
    		for(int i=0;i<4;i++)
    		{
    			this->s_image[0]->pixels[i].red=i*10;
    			this->s_image[0]->pixels[i].green=i*10;
    			this->s_image[0]->pixels[i].blue=i*10;
    		}
    		for(int i=0;i<4;i++)
    		{
    			this->s_image[1]->pixels[i].red=i*50;
    			this->s_image[1]->pixels[i].green=i*50;
    			this->s_image[1]->pixels[i].blue=i*50;
    		}
     
    	}
     
    private:
    	array<img^> ^s_image;
    	img s_img;
    };
    En ecrivant la classe img d'une autre manière j'arrive a définir et éditer mon tableau mais cependant Tous les éléments pixels de chaque images sont identiques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public value struct img
    {
    public:
    	static array<t_pixel>	^img = gcnew array<t_pixel>(64);
    	unsigned char^delay;
    };
    Du coup je ne sais plus quoi faire. Comment déclarer des types ou classes qui me permettrons de faire ce que je souhaite?
    Merci

    edit: Je travaille sous visual C++ 2008 dans un projet CLR avec les windows Forms.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Re bonjour,

    Bon a force de persévérance et après une bonne sieste j'ai pu résoudre le problème tout seul.

    En fait il manquait un gcnew dans le constructeur de ma classe principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	TEST(void)
    	{	
    		this->s_image = gcnew array<img^>(2);
    		this->s_image[0] = gcnew img();  // <= ICI
    		this->s_image[1] = gcnew img();  // <= ET LA
    	}
    Par contre du coup je me pose une autre question,
    Si je veut redimensionner mon tableau s_image avec la fonction resize
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->s_image->Resize(this->s_image, size);
    Es ce que je doit vérifier avant de faire des gcnew que l'élément na pas déjà été alloué ? Et comme le vérifier ?

    N'es-ce pas grave de réalouer un element alors que celui ci existe déja ? Le précédent va t'il etre automatiquement supprimé par le garbage collector ?

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Réponse tardive :

    http://msdn.microsoft.com/en-us/library/bb348051.aspx

    If newSize is greater than the Length of the old array, a new array is allocated and all the elements are copied from the old array to the new one. If newSize is less than the Length of the old array, a new array is allocated and elements are copied from the old array to the new one until the new one is filled; the rest of the elements in the old array are ignored. If newSize is equal to the Length of the old array, this method does nothing.
    Le garbage Collector éliminera tout seul les éléments qui ne sont plus référencés.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci de ta réponse,

    Effectivement, je n'utilise pas assez souvent MSDN qui contient beaucoup de réponses. Je m'en souviendrai!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec des tableaux de string
    Par Electroniktor dans le forum C++
    Réponses: 2
    Dernier message: 15/03/2008, 15h29
  2. Problème en mémoire avec des tableaux
    Par dword2add dans le forum C++
    Réponses: 3
    Dernier message: 11/11/2007, 13h36
  3. Problème avec des tableaux
    Par nawake dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/10/2007, 20h54
  4. Réponses: 6
    Dernier message: 20/02/2007, 17h00
  5. [Tableaux] Problème de foreach avec des checkboxes
    Par nanor21 dans le forum Langage
    Réponses: 10
    Dernier message: 15/05/2006, 01h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo