[débutant] Caster un "const int ARRAY[4]" en "int ARRAY[4]"

6 réponses
Avatar
tsalm
Bonjour,

En essayant de faire :
const int LISTITEM_COLUMNS_WIDTH[4] = {40,40,40,40} ;
int arr[4] = LISTITEM_COLUMNS_WIDTH ;

mon compilateur me retourne une erreur de compilation
error C2440: 'initialisation' : impossible de convertir de 'const int
[4]' en 'int [4]'

Est-il possible de valoriser, sans passer par un memcpy, "arr" avec les
valeurs de LISTITEM_COLUMNS_WIDTH ?

D'avance merci,
TSalm

6 réponses

Avatar
Fabien LE LEZ
On Sun, 26 Jul 2009 15:52:03 +0200, tsalm :

const int LISTITEM_COLUMNS_WIDTH[4] = {40,40,40,40} ;
int arr[4] = LISTITEM_COLUMNS_WIDTH ;



std::vector<int> arr (LISTITEM_COLUMNS_WIDTH,
LISTITEM_COLUMNS_WIDTH+4);

Note que de toute façon, les valeurs devront être copiées, puisque le
contenu de "LISTITEM_COLUMNS_WIDTH" est marqué const, et ne peut donc
pas être modifié.
Avatar
Mathias Gaunard
On 26 juil, 15:52, tsalm wrote:
Bonjour,

En essayant de faire :
   const int LISTITEM_COLUMNS_WIDTH[4] = {40,40,40,40} ;
   int arr[4]  = LISTITEM_COLUMNS_WIDTH ;

mon compilateur me retourne une erreur de compilation
   error C2440: 'initialisation' : impossible de convertir de 'cons t int  
[4]' en 'int [4]'

Est-il possible de valoriser, sans passer par un memcpy, "arr" avec les  
valeurs de LISTITEM_COLUMNS_WIDTH ?



Quel est le problème avec memcpy ?
Un bon compilateur devrait remplacer ça dans les cas où cela a du
sens.
Avatar
James Kanze
On Jul 26, 11:28 pm, Mathias Gaunard wrote:
On 26 juil, 15:52, tsalm wrote:



> En essayant de faire :
> const int LISTITEM_COLUMNS_WIDTH[4] = {40,40,40,40} ;
> int arr[4] = LISTITEM_COLUMNS_WIDTH ;



> mon compilateur me retourne une erreur de compilation
> error C2440: 'initialisation' : impossible de convertir de 'const in t
> [4]' en 'int [4]'



> Est-il possible de valoriser, sans passer par un memcpy,
> "arr" avec les valeurs de LISTITEM_COLUMNS_WIDTH ?



Quel est le problème avec memcpy ?
Un bon compilateur devrait remplacer ça dans les cas où cela a
du sens.



Le problème, c'est que si on remplace le tableau avec quelque
chose de plus raisonable (p.e. std::vector> par la suite, ça ne
marche plus, bien que ça compile sans erreur. Le problème, c'est
que si on remplace double par un type défini par l'utilisater
(p.e. BigDecimal) par la suite, ça ne marche plus, bien que ça
compile.

Utiliser std::copy, plutôt que memcpy, me semble le minimum.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Mathias Gaunard
On 27 juil, 09:40, James Kanze wrote:

Utiliser std::copy, plutôt que memcpy, me semble le minimum.



Le problème de std::copy, c'est qu'en pratique il va faire un memmove
et pas un memcpy.
Avatar
Fabien LE LEZ
On Mon, 27 Jul 2009 03:39:31 -0700 (PDT), Mathias Gaunard
:

Utiliser std::copy, plutôt que memcpy, me semble le minimum.



Le problème de std::copy, c'est qu'en pratique il va faire un memmove
et pas un memcpy.



std::copy va copier les éléments un par un.

J'ai du mal à comprendre la différence entre memmove et memcopy ici,
et le problème que ça pose, mais de toute façon aucune des deux ne
sera appelée.
Avatar
James Kanze
On Jul 27, 12:39 pm, Mathias Gaunard wrote:
On 27 juil, 09:40, James Kanze wrote:



> Utiliser std::copy, plutôt que memcpy, me semble le minimum.



Le problème de std::copy, c'est qu'en pratique il va faire un
memmove et pas un memcpy.



Qu'est-ce que tu raccontes là ? Il ne doit faire ni l'un ni
l'autre. Mais il va copier les objets, non des bytes. Ce qui
veut dire d'une part qu'il marche avec n'importe quel type
d'objet qui supporte la copie correctement, et de l'autre, qu'il
y a même des chances qu'il soit plus rapid, parce que le
compilateur a plus d'informations. (Il pourrait savoir, par
exemple, que les pointeurs sont alignés.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34