[C]Instalation de la SDL sous Visual C++ 2005 Express

Démarré par Linksolar, 05 Décembre 2007 à 18:31

0 Membres et 1 Invité sur ce sujet

05 Décembre 2007 à 18:31 Dernière édition: 31 Décembre 2007 à 10:53 par Linksolar
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
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

06 Décembre 2007 à 11:02 #3 Dernière édition: 06 Décembre 2007 à 19:34 par Christopho
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
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

 -_-

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:
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

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:
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table


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.
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

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*?
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

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. ^
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table