Utilisation d'un tableau dynamique

Utilisation d'un tableau dynamique - C++ - Programmation

Marsh Posté le 04-12-2002 à 10:40:38    

Salut à tous, je debute en C.
Je dois déclarer un tableau qui aura une taille variable en fontion des données saisies par l'utilisateur.
 
Par exemple : tab[longueur] (ou longueur est un entier).
 
J'utilise visual C++.
Il renvoi une erreur systematiquement me disant que longueur n'est pas definit lors de la compilation (ce qui est normal quoi).
 
G donc essayé ceci par la suite :
long *adr;
adr = malloc(longueur*sizeof(adr));
 
J'ai encore le droit à une erreur lors de la compilation :
C:\Program Files\Microsoft Visual Studio\MyProjects\test\test.cpp(56) : error C2440: '=' : cannot convert from 'void *' to 'long *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast

 
Est ce que qqun saurait m'aider ?
Merci d'avance !
 :jap:

Reply

Marsh Posté le 04-12-2002 à 10:40:38   

Reply

Marsh Posté le 04-12-2002 à 11:09:38    

Alors, ta ligne, ça serait plutôt ceci :

Code :
  1. long *adr;
  2. adr = (long*)malloc(longueur*sizeof(adr));


Car malloc rend un pointeur vers un élément de type non défini (void*), il faut caster explicitement.
 
Mais ce que tu fais là, c'est du C, pas du C++.
En c++, j'penses que tu peux faire :

Code :
  1. int sizeofTab= 10 // ta taille variable quoi !
  2. long* myLgTab = new long[sizeofTab];


Message édité par El_gringo le 04-12-2002 à 11:11:26
Reply

Marsh Posté le 04-12-2002 à 11:15:49    

Merci El_Gringo, je test ca des que je peux ! :jap:
 
En fait, c dbien u C, pas du C++... Ca ca sera une autre histoire ds qques semaines je pense :lol: :sweat:
 

Reply

Marsh Posté le 04-12-2002 à 11:19:16    

Le C++ est pas forcément plus dur
C'est plus souple souvent, comme dans le cas présent. Aavec visual, tu pourras compiler ce que je t'ai dit QUE si ton fichier source est un .cpp (si c un .c, Visual utilise le compilateur C, et en C, ça n'existe pas ce que je t'ai dit !

Reply

Marsh Posté le 04-12-2002 à 11:42:32    

oui, dans mon projet, le fichier est un .cpp
 
C une application win32 console de type "hello world".
 
Je connais pas les autres, les premiers cours de C ont eu lieu ya à peine 2 semaines...

Reply

Marsh Posté le 04-12-2002 à 15:12:10    

et n'oublies pas le free() qui va avec :D

Reply

Marsh Posté le 04-12-2002 à 15:23:00    

...sauf si tu optes pour la solution avec le "new", auquel cas il faudra plutot faire un delete[]

Reply

Marsh Posté le 04-12-2002 à 15:32:13    

euh c'est du C donc le cast est pas nécessaire


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-12-2002 à 15:45:45    

Taz@PPC a écrit a écrit :

euh c'est du C donc le cast est pas nécessaire




 
tu parles du cast du malloc ?

Reply

Marsh Posté le 04-12-2002 à 15:47:13    

oui. en C les cast void*<=>T* sont implicites
en C++ seul T*=>void* l'est


Message édité par Taz@PPC le 04-12-2002 à 15:48:06

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-12-2002 à 15:47:13   

Reply

Marsh Posté le 04-12-2002 à 16:13:21    

Taz@PPC a écrit a écrit :

oui. en C les cast void*<=>T* sont implicites
en C++ seul T*=>void* l'est




Alors pourquoi tous les bouquins conseillent de caster, y compris (et surtout) le merveilleux K&R ?
Si les auteurs du langage eux mêmes recommandent de caster, je vois mal pourquoi il ne faudrait pas le faire !
A moins que le cast de void* vers T* soit implicite depuis une révision récente du C ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-12-2002 à 16:20:50    

et bien il l'est. on cast juste par habitude et de toutes facons il vaut mieux toujours caster, c'est plus propre
 
essaye ca avec ton compilo C
 

Code :
  1. int main()
  2. {
  3.   double d=3.0;
  4.   void *ptr;
  5.   double *dptr=&d;
  6.   ptr=dptr;
  7.   dptr=ptr;
  8.   return 0;
  9. }

 
 
c'est bon en C89/90, en C99, mais pas en C++.
 
je t'assure


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-12-2002 à 18:07:08    

Juste un truc, ce serait pas plutôt ça les bonnes lignes de code:
 

Code :
  1. long *adr;
  2. adr = (long*)malloc(longueur*sizeof(long));


 
Car sizeof(adr) équivaut à sizeof(long*) et non à sizeof(long), non?

Reply

Marsh Posté le 05-12-2002 à 02:20:41    

Il voulait mettre *adr.
Ça a l'avantage de suivre automatiquement les changements de type éventuels de adr.
Ça à l'inconvénient d'allouer trop pour un char* en C. En effet:

Code :
  1. sizeof(char) == 1           //type
  2. sizeof( 'a') == sizeof(int) //variable

C'est une scorie que le C++ corrige.
 
Pour la contourner, j'utilises une macro:

Code :
  1. //détermine la taille d'une variable en contournant le cas sizeof('A')==sizeof(int)
  2. //suppose qu'on peut convertir tout pointeur en char*
  3. #define TRUESIZE(o) ( (char*)(&(o)+1) - (char*)&(o) )


 
Le cast void* vers T* risquant de devenir déprécié, il est recommandable de caster le malloc.
 
Je recommande de recourir à une macro qui rend le code plus simple, plus clair, plus sûr et centralise les changements éventuels:

Code :
  1. #define ALLOCATEN(number,type) (type*)malloc((number)*sizeof(type))
  2. #define ALLOCATE(type) ALLOCATEN(1,type)

Malheureusement, ça ne marche pas avec les types composés de tableau/fonction.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-12-2002 à 08:22:24    

C bon, tout fonctionne !
G reussi a terminer le projet même ;)
(Y'avait pas que la déclaration d'un tableau dynamique hein :))
 
 :jap: a tous !

Reply

Marsh Posté le 05-12-2002 à 09:16:22    

Taz@PPC a écrit a écrit :

oui. en C les cast void*<=>T* sont implicites
en C++ seul T*=>void* l'est




 
Sauf que dans son cas, il écrit son code C dans un fichier dont l'extention est "cpp" (.cpp), du coup, Visual compile son truc avec son compilateur C++, d'où le cast obligatoire ds son cas j'imagine...

Reply

Marsh Posté le 05-12-2002 à 10:12:51    

El_Gringo a écrit a écrit :

 
 
Sauf que dans son cas, il écrit son code C dans un fichier dont l'extention est "cpp" (.cpp), du coup, Visual compile son truc avec son compilateur C++, d'où le cast obligatoire ds son cas j'imagine...




 
oui, mais il cherche vraiment la merde  :whistle:  :D  :lol:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 05-12-2002 à 17:57:59    

bah non, c les outils qui sont mis a notre disposition, on est obligé de faire avec ...
 
Maintenant, c vrai (Apres certains exemples trouvés en faisant des // depuis le bouquin de C que g acheté) que c un peu la merde.
 
Mais pas le choix, faut faire avec ce qu'on a :)

Reply

Marsh Posté le 06-12-2002 à 09:37:29    

JBs a écrit :

bah non, c les outils qui sont mis a notre disposition, on est obligé de faire avec ...
 
Maintenant, c vrai (Apres certains exemples trouvés en faisant des // depuis le bouquin de C que g acheté) que c un peu la merde.
 
Mais pas le choix, faut faire avec ce qu'on a :)


 
Non, mais, si tu veux faire du C, nomme tes fichier avec l'extention "c", pas "cpp". Comme ça t'utilisera le vrai compilateur C...

Reply

Marsh Posté le 06-12-2002 à 13:17:36    

ah ok, c noté :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed