Voila je suis les cours sur le C sur le site du zéro et j'en suis à l'allocution dynamique d'un tableau.
Quand je suis arriver sur un exemple j'ai éssayé de le tester alors je l'ai copier/coller dans mon IDE (Visual C++ 2005Express)
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
long* memoireAllouee = NULL;
memoireAllouee = malloc(sizeof(long)); // Allocation de la mémoire
if (memoireAllouee == NULL)
{
exit(0);
}
// Utilisation de la mémoire
printf("Quel age avez-vous ? ");
scanf("%ld", memoireAllouee);
printf("Vous avez %ld ans\n", *memoireAllouee);
free(memoireAllouee); // Libération de mémoire
return 0;
}
Je compile. Et la , surprise !! :ninja: je vois que la compilation a échoué car la conversion de mon "void*" en "long*" est impossible.
Je recompile , et toujours la même erreur de conversion.
------ Début de la génération : Projet : openfichier, Configuration : Debug Win32 ------
Compilation en cours...
main.cpp
c:\documents and settings\gaël.marty\mes documents\c & c++\openfichier\openfichier\main.cpp(8) : error C2440: '=' : impossible de convertir de 'void *' en 'long *'
La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Gaël.MARTY\Mes documents\C & C++\openfichier\openfichier\Debug\BuildLog.htm"
openfichier - 1 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
Voila je ne comprend pas pourquoi sa ne marche pas je pense que mon OS( windows ) me refuse l'allocution et encore si il me la refusait le programme marcherait quand même (bien qu'il s'arréterait immédiatement).
Voila si vous pouviez m'aidez je vous en serais recconaisant.
merci d'avance.
Je viens de compiler et de tester ton code sous Linux avec le compilateur gcc ainsi que sous Windows XP avec Visual C++ 2005 : il n'y a aucune erreur de compilation et le programme fonctionne comme prévu.
Citation------ Début de la génération : Projet : openfichier, Configuration : Debug Win32 ------
Compilation en cours...
main.cpp
c:\documents and settings\gaël.marty\mes documents\c & c++\openfichier\openfichier\main.cpp(8) : error C2440: '=' : impossible de convertir de 'void *' en 'long *'
La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Gaël.MARTY\Mes documents\C & C++\openfichier\openfichier\Debug\BuildLog.htm"
openfichier - 1 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
Il y a un truc qui m'intrigue ici :
main.cpp. Tu cherches à compiler du C dans un fichier source de type C++ ? A mon avis, l'erreur vient de l'extension du fichier source ; tu dois remplacer le nom du source
main.cpp par
main.c si tu veux que les expressions
malloc et
free soient acceptées.
Ben en fait il compile du Cpp. Mais bon c'est pas un problème, les compilateur cpp complile le C, mais l'inverse est plus rare.
Eviter de faire des cout dans un programme en C. ^^
Euh au fait c'est allocation dynamique, allocution c'est le truc du prédident. :p
Si Noxneo était là, il t'expliquerait tout en détail comme ça :P
Tu as ce bug car tu as créé un fichier de projet visual C++ qui utilise des en têtes précompilés (stadfx.h, de tête), qui sont utilisés
pour programmer des applications utilisant l'API Win32, qui a ses propres contraintes niveau pointeur.
Or ici tu ne veux pas utiliser cette API win32, il faut que tu suives scrupuleusement la procédure de création de projet
C standard dans Visual C++: Fichier > Nouveau > Projet et là tu choisis "Type de projet": Win32 et "Modèle": Application console
win32. Tu rentres le nom, tu fais ok. Ensuite dans la fenêtre suivante tu fais "Suivant", et là tu coches "application console" et "projet vide", puis terminer.
Tu as maintenant ton projet, il ne te reste plus qu'à faire un clic droit sur "Fichiers sources" dans l'explorateur de fichiers de gauche, Ajouter Nouvel Element, tu cliques
sur "Visual C++" à gauche et "Fichier C++" à droite. Attention, bien qu'on lui dise que c'est un fichier C++, on va faire un fichier c: dans le nom du fichier à créer, mets donc
nom_de_fichier.c (par exemple main.c). Tu peux ensuite coller ton code qui compilera.
2 petites choses:
1)Je te conseille plutôt d'utiliser un compilateur comme GCC, pour débuter, qui est moins contraignant et plus explicite dans ses erreurs
2)J'ai commenté ton code proprement pour être sur que tu t'y retrouves.
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
long* memoireAllouee = NULL; //On déclare un pointeur de long et on l'initialise à NULL.
memoireAllouee = malloc(sizeof(long)); // On assigne la valeur renvoyée par malloc, qui est l'adresse de la mémoire allouée, à memoireAllouee
if (memoireAllouee == NULL) //si memoireAllouee vaut toujours NULL, c'est qu'il y'a eu une erreur dans l'allocation,
{ //donc on quitte (typiquement, pas assez de ram disponible (problème rare sur les machines de nos jours ^^)
exit(0);
}
// Utilisation de la mémoire
printf("Quel age avez-vous ? "); //On demande l'âge
scanf("%ld", memoireAllouee); //on le mets à l'adresse contenue par memoireallouee. Admettons que memoireAllouee pointe sur une variable âge, ça reviendrait à mettre un &age
printf("Vous avez %ld ans\n", *memoireAllouee); //on affiche la valeur de la mémoire référencée par memoireAllouee
system("pause"); //on pause le programme pour voir les résultats(ne marche que sur windows, sous linux/mac OS le shell reste ouvert généralement)
free(memoireAllouee); // Libération de mémoire
return 0;
}
PS : ce ne sont pas mes conseils, mais ceux de Nox
-_-
Ou peut-être tout simplement parce-que malloc renvoie un pointeur vers void et que toi tu veux un pointeur vers un long...
Il te faudrait donc plutôt écrire memoireAllouee = (long*)malloc(sizeof(long));
J'avais pas lu le code mais il semble que Geomaster aie raison ^_^
Nox owned by Geo :mrgreen:
Et bien oui Geo avait en effet raison merci quand même à ceux qui on essayez de m'aidez!
De rien, ce fut un plaisir :rolleyes:
Non mais la piste du compilateur n'est pas si fausse non plus car tous les compilateurs ne doivent pas réagir pareil. Certains pourraient ne générer qu'un warning, d'autres n'auraient rien détecté tellement ils sont permissifs. Mais pour cette erreur-là toutefois, je pense que tous les compilateurs doivent faire la remarque ^_^
Et puis m***, il faut coder proprement vos applis ! ^_^
C'était une intervention de Papy Geo :D
Moue le transtypage c'est quand même pour le folklore. :P
Et je suis plus que d'accord avec Chris le gros IDE c'est pas super utile quand tu débutes, gcc peu être plus pratique. Mais bon gcc sous windows. :rolleyes:
Pour le folklore, c'est-à-dire ?
Ben que ça soit un long un void ou autre chose on s'en fiche un peu. Du moment qu'on a alloué la bonne taille.
Citation de: mooglwy le 07 Décembre 2007 à 17:30
Ben que ça soit un long un void ou autre chose on s'en fiche un peu. Du moment qu'on a alloué la bonne taille.
Bah non, on ne s'en fout pas. Avant de dire des conneries, il faudrait peut-être savoir de quoi on cause -_- La fonction malloc te permet d'allouer de la mémoire et te renvoie un pointeur non typé vers le premier emplacement de celle-ci. Si tu t'en sers pour allouer de la mémoire pour une variable typée, il faut bien évidemment typer également ce pointeur en le transtypant correctement.
Si c'était si anodin que ça, le compilateur n'hurlerait pas pour signaler une erreur.
Reste qu'en C++ par exemple, on utilise directement le "new" qui, lui, renvoie un pointeur vers le bon type comme un grand.
Je sais je sais, c'est juste que j'ai jamais fais de transtypage, et je me souvient pas avoir eu de problème. Si j'avais le choix bien sur que j'utiliserai new. C'est tellement plus simple. ^^
Attends... mais le c transtype pas automatiquement vu que tu veux stocker un void* dans un long*? (http://hamoogtifmac.free.fr/forum/images/smiles/msn22.gif)
Si tu as toujours fait du C++ et donc que tu as utilisé que le "new", effectivement tu n'as jamais du te poser la question. De la même façon que ton compilateur ne t'a jamais fait la remarque car si tu avais fait du C comme cela, tu l'aurais belle et bien eue l'erreur. Il faut impérativement modifier le type de retour du pointeur renvoyé par malloc. Le compilateur le dit très bien "Nécessite un cast explicite".
Tu pourrais te poser des questions sur le transtypage si tu avais déjà fait de la POO.
Oui oui avant j'utilisais que new, mais je dois t'avouer que je mettais jamais poser la question.
Pis si j'ai fait un peu de poo, classe et héritage de classe. Surcharge et compagnie. :)
Enfin question transtypage je vois que la surcharge, mais c'est la même chose mais dans l'autre sens, enfin je sais pas si je suis clair. ^