salut !!
comment converter cette ligne en c++ !!
c'est l'allocation dynamique d'une matrice !
Code:this->pMatrixData = (double *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, size * size * sizeof(double));
Version imprimable
salut !!
comment converter cette ligne en c++ !!
c'est l'allocation dynamique d'une matrice !
Code:this->pMatrixData = (double *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, size * size * sizeof(double));
Et bien, allocation dynamique d'un tableau... new[] :calim2:
Et tu dois avoir un GlobalFree quelque part à remplacer par delete[].
Même si ce code est tout à fait valide en C++.
Et : convertir
Changer le type de pMatrixData en std::vector<double>Code:this->pMatrixData.resize(size * size);
Bonjour,
Le GlobalAlloc() n'est pas du standard, ici dans le cas GMEM_FIXED indique un lock inter-applications.
Un new[] n'est donc pas suffisant car il alloue de la mémoire pour l'application.
Il faudrait 'caster' le résultat dans un unique_ptr et lui associer un destructeur faisant le GlobalUnlock(). Un truc du genre
Code:
1
2
3 std::unique_ptr<double*,decltype(GlobalFree)> x { (double *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, size * size * sizeof(double)), GlobalFree };
Ça, ce n'est plus vrai depuis 1995 au moins: GlobalAlloc() alloue seulement de la mémoire pour le processus courant, et les fonctionnalités de Windows qui marshallent des HGLOBAL (comme le presse-papier ou OLE) nécessitent toutes GMEM_MOVEABLE.
Ce qui veut dire que GMEM_FIXED, en fait d'indiquer un handle inter-application, indique au contraire que ça ne quittera pas le processus courant.
Par contre, la théorie reste utile (pour un vrai segment de mémoire partagée alloué via CreateFileMapping()+MapViewOfFile(), par exemple), donc je plussoie néanmoins.
T'as occulté la partie la plus importante : convertir ton pMatrixData en std::vector...
As-tu pensé au #include <vector>?
Le message d'erreur que tu as vient généralement d'une confusion entre pointeur et objet pointé.
Est-tu sûr que pMatrixData est bien un vector<double>, et pas un vector<double>* ? Et si c'est le cas, il faut faire soit pMatrixData->resize, soit ce qui est probablement 1000 fois mieux, utiliser directement un vector et non un pointeur.
salut,
j'ai une classe Matrix
Matrix.cpp
Matrix.hCode:
1
2
3
4
5
6
7
8 Matrix::Matrix(int size) { this->size = size; vector<double>pMatrixData; this->pMatrixData.resize(size *size); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12 class Matrix { double *pMatrixData; int size; public: Matrix(int size); };
Ouch...
Reprenons calmement...
Dans ton matrice.h :
Et dans ton Matrix.cpp :Code:
1
2
3
4
5
6
7
8
9
10 class Matrix { std::vector<double> matrixData; // int size; Plus utile, le vecteur gère la taille public: Matrix(int size); };
Code:
1
2
3 Matrix::Matrix(int size) : matrixData(size*size) { }
Est-ce que tu comprends ce que j'ai écrit ? Est-ce que tu vois ce qui n'allait pas dans ton code précédent ? Que tu déclarais une variable locale portant le même nom que le pointeur sur double qui était dans ta classe, au lieu de le remplacer ?
j'ai pas compris :calim2:
je veux juste convertir ce code
j'ai compris que c'est une allocation dynamique de la matrice data alors j'ai utilise un pointeur :(Code:this->Data = (double *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, size * size * sizeof(double));
Tu ne vois pas que dans ton constructeur :roll: tu crées une variable locale de type vector qui masque (*) l'attribut de classe de type pointeur.
Ressors tes bouquins "C++ niveau 0 ou 1" et reviens nous voir :whistle:
* -> Elle a le même nom.
Ce n'est pas binaire: Il te faut un tableau. un std::vector c'est quand même plus facile à utiliser qu'un tableau C, et en plus il évite de faire une allocation avec la désallocation à gérer.
D'ailleurs à ce sujet :mrgreen:, si tu fais un new[] il faut un delete[]