Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1402 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Utilisation d'un tableau dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation d'un tableau dynamique

n°260446
JBs
Posté le 04-12-2002 à 10:40:38  profilanswer
 

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:

mood
Publicité
Posté le 04-12-2002 à 10:40:38  profilanswer
 

n°260497
El_gringo
Posté le 04-12-2002 à 11:09:38  profilanswer
 

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
n°260501
JBs
Posté le 04-12-2002 à 11:15:49  profilanswer
 

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:
 

n°260503
El_gringo
Posté le 04-12-2002 à 11:19:16  profilanswer
 

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 !

n°260557
JBs
Posté le 04-12-2002 à 11:42:32  profilanswer
 

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...

n°260773
bjone
Insert booze to continue
Posté le 04-12-2002 à 15:12:10  profilanswer
 

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

n°260801
El_gringo
Posté le 04-12-2002 à 15:23:00  profilanswer
 

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

n°260821
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 04-12-2002 à 15:32:13  profilanswer
 

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


---------------
du bon usage de rand [C] / [C++]
n°260853
El_gringo
Posté le 04-12-2002 à 15:45:45  profilanswer
 

Taz@PPC a écrit a écrit :

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




 
tu parles du cast du malloc ?

n°260858
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 04-12-2002 à 15:47:13  profilanswer
 

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++]
mood
Publicité
Posté le 04-12-2002 à 15:47:13  profilanswer
 

n°260892
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 04-12-2002 à 16:13:21  profilanswer
 

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)
n°260902
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 04-12-2002 à 16:20:50  profilanswer
 

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++]
n°261047
Alload
Posté le 04-12-2002 à 18:07:08  profilanswer
 

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?

n°261309
Musaran
Cerveaulté
Posté le 05-12-2002 à 02:20:41  profilanswer
 

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
n°261386
JBs
Posté le 05-12-2002 à 08:22:24  profilanswer
 

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 !

n°261405
El_gringo
Posté le 05-12-2002 à 09:16:22  profilanswer
 

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...

n°261432
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 05-12-2002 à 10:12:51  profilanswer
 

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++]
n°262204
JBs
Posté le 05-12-2002 à 17:57:59  profilanswer
 

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 :)

n°262731
El_gringo
Posté le 06-12-2002 à 09:37:29  profilanswer
 

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...

n°263007
JBs
Posté le 06-12-2002 à 13:17:36  profilanswer
 

ah ok, c noté :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Utilisation d'un tableau dynamique

 

Sujets relatifs
Conseil sur un tableau[C] tableau à dimension, où est le bug ?
Utilisation d'une ArrayList[PHP] Présentation de données dans un tableau - A à Z
probleme de cast dynamique avec heritage etc[PHP] Indexer un tableau
Pb d'utilisation des classes enveloppes + algo de tri[C, C++] faire un array dynamique de strings...
tableauparcours d'un tableau de tableaux
Plus de sujets relatifs à : Utilisation d'un tableau dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR