Aller au contenu

debut en C


Messages recommandés

bonjour,

j'ai suivi les tutoriels du site du zero et j'en suis arriver au TP N°1 (creation d'un jeu "nombre Mystere")

pour creer le jeu il indique d'initier une instruction de calcul d'un nombre alleatoire nommée :

"srand(time(NULL));

nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;"

et d'inclure la bibliotheque

#include <time.h>

sauf que le probleme c'est que bien que le programme fonctionne, l'utilitaire de débogage m'indique un avertissement :

"warning C4244: 'fonction' : conversion de 'time_t' en 'unsigned int', perte possible de données"

et je n'arrive pas à comprendre de quoi il sagit

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 69
  • Créé
  • Dernière réponse

la fonction time() renvoit une valeur de type time_t, or, tu stockes cette valeur dans un unsigned int (quand tu passes le résultats de time() en argument de srand()), il y a donc une conversion de type faite implicitement.

Le compilateur t'averti que cette conversion peut engendrer une perte de données.

Si tu veux vraiment décomposer les étapes, il faudrait faire quelque chose du genre :

unsigned int t = (unsigned int) time(NULL);
srand(t);

Là, on voit bien les deux étapes (appel de time() et stockage de la valeur, puis appel de srand() avec la valeur stockée), et la conversion de type est explicite.

:cartonrouge:

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

salut,

juste une petite question comme sa,

sauf erreur ont peut modifier la valeur d'une constante #define (meme si sa doit pas ce faire).

#define CONSTANTE 10

int main(int argc, char *argv[])
{
/*......code.......*/
CONSTANTE 2;
/*......code.......*/
}

en tout cas sa a l'air d'etre pris en compte par le compilateur :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Ah ben non. Comme leur nom l'indique, les constantes sont... constantes :D (ça veut dire qu'elle ne changent pas, jamais)

D'ailleurs je serais très étonné que le code que tu aie mis en exemple compile :transpi:

C'est exactement comme si tu faisais

int main(int argc, char *argv[])
{
/*......code.......*/
10 2;
/*......code.......*/
}

Lien vers le commentaire
Partager sur d’autres sites

D'ailleurs je serais très étonné que le code que tu aie mis en exemple compile ;)

ouais moi aussi je trouve sa bizarre mais sa compile, sa doit ignorer purement et simplement l'instruction.

Ca ne me suffit pas, un compilateur n'ignore pas les instructions au petit bonheur la chance :p

Lien vers le commentaire
Partager sur d’autres sites

Ca ne me suffit pas, un compilateur n'ignore pas les instructions au petit bonheur la chance :D

alors pour la forme, a priori j'imagine qu'en fait c'est PAS une instruction sa remplace TAILLE par 10 et le lis dans le code puis lit 2, et c'est tout sa en fait rien, puisque il n'y a aucune instruction de travail. (c'est ce que j'ai trouver de plus plausible).

:craint:

Lien vers le commentaire
Partager sur d’autres sites

Quelle version de VS ? Parce que sur la 2008, ca plante bien à la compilation.

bah vu que j'ai Sisual Studio C++ Express V9.0 edition 2008, j'ai refais le Test, alors j'ai peut etre fait une erreur, :D sa compile mais quand j'attribue pas de valeur a la constante lors du #define CONSTANTE

et sa fonctionne aussi quand je #define 2 fois la meme CONSTANTE avec 2 taille différentes (dans ce cas la sa me renvoie quand meme un warning "redefinition de constante)

Lien vers le commentaire
Partager sur d’autres sites

Quelle version de VS ? Parce que sur la 2008, ca plante bien à la compilation.

bah vu que j'ai Sisual Studio C++ Express V9.0 edition 2008, j'ai refais le Test, alors j'ai peut etre fait une erreur, :D sa compile mais quand j'attribue pas de valeur a la constante lors du #define CONSTANTE

et sa fonctionne aussi quand je #define 2 fois la meme CONSTANTE avec 2 taille différentes (dans ce cas la sa me renvoie quand meme un warning "redefinition de constante)

Bon, ben c'est normal, on peut mettre une variable "seule", meme si ca sert à rien.

Mais le coup du

#define CONSTANTE 10

int main(int argc, char *argv[])
{
/*......code.......*/
CONSTANTE 2;
/*......code.......*/
}

Ça, ça marche pas.

Lien vers le commentaire
Partager sur d’autres sites

alors nouvelle petite question sur les lib graphique.

les tuto du site du zero nous invite à commencer par la lib graphique SDL, et nous oriente sur d'autre tuto pour les utiliser les lib comme win 32. d'après ce qui est préciser dans le tuto pour utiliser la SDL (sout visual comme ailleur) ont doit d'abord "installé" la lib dans visual puis ensuite creer une nouveau projet SDL.

donc quelque part en extrapolant, si je creer un nouveau projet SDL je peut pas avoir aux fonctionnalité de la lib win32. donc imaginon que je veuille creer une programme qui utilise quelque fonction de SDL et win 32, est ce que sa suppose que je doit tout réécrire moi meme ?

:dd:

Lien vers le commentaire
Partager sur d’autres sites

Normalement aucun problème pour utiliser plusieurs lib au sein d'un projet. Les types de projets que tu peux sélectionner représentent des modèles, des projets préconfigurés. Tu devrais pouvoir utiliser les librairies SDL et win32 même en créant un "nouveau projet vierge", il faut juste ajouter les librairies à la main après coup. Ce qui ne devrait pas être bien difficile.

Tout ce conditionnel c'est parce que je n'ai jamais touché aux IDE de MS. J'utilise NetBeans sur des projets Java et ça marche exactement comme je viens de le décrire. Et je ne vois pas de raison de faire les choses différemment avec un autre IDE et un autre langage.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

alors je viens d'installer la SDL, mais perso (je pense avoir suivi la procedure donnée), sa compile correctement mais il y a apparament un conflit au linkage avec LIBCMT.lib et _msvcrt.lib

[size="1"]1>------ Dbut de la gnration: Projet: LibGraphique_SDL_1.0.c, Configuration: Debug Win32 ------

1>dition des liens en cours...

1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _isspace dj dfini(e) dans LIBCMT.lib(_ctype.obj)

1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _exit dj dfini(e) dans LIBCMT.lib(crt0dat.obj)

1>LIBCMT.lib(crt0init.obj) : warning LNK4098: conflit entre la bibliothque par dfaut 'msvcrt.lib' et les autres bibliothques; utilisez /NODEFAULTLIB:library

1>C:\Users\CHARLES\Documents\Visual Studio 2008\Projects\LibGraphique_SDL_1.0.c\Debug\LibGraphique_SDL_1.0.c.exe : fatal error LNK1169: un ou plusieurs symboles dfinis diffrentes reprises ont t rencontrs

1>Le journal de gnration a t enregistr l'emplacement "file://c:\Users\CHARLES\Documents\Visual Studio 2008\Projects\LibGraphique_SDL_1.0.c\LibGraphique_SDL_1.0.c\Debug\BuildLog.htm"

1>LibGraphique_SDL_1.0.c - 3 erreur(s), 1 avertissement(s)

========== Gnration: 0 a russi, 1 a chou, 0 mis jour, 0 a t ignor ==========

[/size]

et la par contre je suis perdu, j'ai suivi la proc qui est donné sur le site du zero (partie visual studio express)

par contre j'ai remarqué que la SDL est à la base prévue pour visula C/C++ 5, 6 et 7 hors a ce jours on en est a la V-9. sa viendrais pas de la ???

[EDIT] nan sa y est c'est bon j'ai trouver le soucis sous visual : projet>propriété>propriété de configuration>C/C++>generation de code>bibliothèque runtime :

j'avais fais une confusion, faut mettre DLL Multithread(/MD) (au lieu de Multithread (/MT)...

Lien vers le commentaire
Partager sur d’autres sites

non, pas vraiment :incline:

recopie-nous ce que te renvoie la compil

la compile fonctionne bien, mais plus le linkage

out/stderr
----------
[size="1"]1>------ Dbut de la gnration: Projet: LibGraphique_SDL_1.0.c, Configuration: Release Win32 ------

1>dition des liens en cours...

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_WaitEvent

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_Init

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_SetVideoMode

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_FillRect

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_WM_SetCaption

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_UpperBlit

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_GetError

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_MapRGB

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_CreateRGBSurface

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_Flip

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_Quit

1>main.obj : error LNK2001: symbole externe non rsolu _SDL_FreeSurface

1>MSVCRT.lib(crtexe.obj) : error LNK2001: symbole externe non rsolu _main

1>C:\Users\CHARLES\Documents\Visual Studio 2008\Projects\LibGraphique_SDL_1.0.c\Release\LibGraphique_SDL_1.0.c.exe : fatal error LNK1120: 13 externes non rsolus

1>Le journal de gnration a t enregistr l'emplacement "file://c:\Users\CHARLES\Documents\Visual Studio 2008\Projects\LibGraphique_SDL_1.0.c\LibGraphique_SDL_1.0.c\Release\BuildLog.htm"

1>LibGraphique_SDL_1.0.c - 14 erreur(s), 0 avertissement(s)

========== Gnration: 0 a russi, 1 a chou, 0 mis jour, 0 a t ignor ==========

[/size]

la compile me renvoie 0 erreur 0 warnings[/size]

[/size]

Lien vers le commentaire
Partager sur d’autres sites

ouaye j'ai trouver un truc, en fait c'etait passer en mode release au lieu de debug... ??? en tout cas j'ai plus le probleme de link.

par contre j'ai toujours le stack overflow. :transpi:

curieux d'ailleurs, meme en "pas a pas détaillé" il execute meme pas la première instruction ni meme la declaration des variables.

Lien vers le commentaire
Partager sur d’autres sites

sur la page de téléchargement de la libSDL, tu as une première version (vraisemblablement la tienne), et une seconde estampillée "devel".

la seconde devrait t'éviter d'avoir ces erreurs à la compil en mode debug.

et pour la stack overflow ... on manque un peu de détails

quand / comment ça se produit ?

des printf de debug pourraient aider à identifier le problème.

Lien vers le commentaire
Partager sur d’autres sites

sur la page de téléchargement de la libSDL, tu as une première version (vraisemblablement la tienne), et une seconde estampillée "devel".

la seconde devrait t'éviter d'avoir ces erreurs à la compil en mode debug.

et pour la stack overflow ... on manque un peu de détails

quand / comment ça se produit ?

des printf de debug pourraient aider à identifier le problème.

c'est bien la version devel que j'ai installé pour la SDL.

sinon, bas des printf de debug j'en ai meme pas puisque j'ai pas reactivé la console mais sa pourrait etre une solution (a voir comment faire) sinon pour la gestion des erreur j'ai fait des fprintf dans stderr, mais pour l'instant j'en ai pas un seul qui a été créer.

et puis en plus comme je le disais tout a l'heure c'est presque comme si sa ce produisait avant que le programme se lance.

j'ai mis des points d'arret au niveau des declaration de variables dans le main mais sa ne les atteint meme pas.

pour info la probleme se produit depuis que j'ai touché a ma double boucle for(k=à;...) for(i=0;...)

dons l'utilité n'es que de produire un degrader de couleur.

pourtant je pense avoir remis l'algo comme il l'etait au depart.

[size=2][color="#0000ff"][size=2][color="#0000ff"]int[/color][/size][/color][/size][size=2] main([/size][size=2][color="#0000ff"][size=2][color="#0000ff"]int[/color][/size][/color][/size][size=2] argc, [/size][size=2][color="#0000ff"][size=2][color="#0000ff"]char[/color][/size][/color][/size][size=2] *argv[])

{

SDL_Surface *screen=NULL, *STD2_surf1[510][510]={0};

Uint32 STD1_color1=0, STD1_color2=0;

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]int[/color][/size][/color][/size][size=2] i=0,j=0,k=0, l=0;

SDL_Rect position;

position.x=0;

position.y=0;

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]if[/color][/size][/color][/size][size=2](SDL_Init(SDL_INIT_VIDEO)==-1)

{

fprintf(stderr, [/size][size=2][color="#a31515"][size=2][color="#a31515"]"Erreur d'initialisation de la SDL : %s\n"[/color][/size][/color][/size][size=2], SDL_GetError());

exit(EXIT_FAILURE);

}

SDL_WM_SetCaption([/size][size=2][color="#a31515"][size=2][color="#a31515"]"Ma super fentre SDL !"[/color][/size][/color][/size][size=2], NULL);

screen=SDL_SetVideoMode(510, 510, 32, SDL_HWSURFACE);

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]if[/color][/size][/color][/size][size=2](screen==NULL)

{

fprintf(stderr,[/size][size=2][color="#a31515"][size=2][color="#a31515"]"impossible de charger le mode video : %s, ligne 12"[/color][/size][/color][/size][size=2],SDL_GetError());

exit(EXIT_FAILURE);

}

STD1_color1=SDL_MapRGB(screen->format,0,0,0);

SDL_FillRect(screen,NULL,STD1_color1);

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]for[/color][/size][/color][/size][size=2](k=0;k<510;k++)

{

i=0;

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]if[/color][/size][/color][/size][size=2](k>255)

{

j++;

}

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]for[/color][/size][/color][/size][size=2](i=0;i<510;i++)

{

STD2_surf1[k][i]=SDL_CreateRGBSurface(SDL_HWSURFACE,1,1,32,0,0,0,0);

STD1_color2=SDL_MapRGB(screen->format,k,i,j);

SDL_FillRect(STD2_surf1[k][i],NULL,STD1_color2);

position.y=i;

SDL_BlitSurface(STD2_surf1[k][i],NULL,screen,&position);

}

position.x=k;

}

SDL_Flip(screen);

pause();

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]for[/color][/size][/color][/size][size=2](k=0;i<255;i++)

{

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]for[/color][/size][/color][/size][size=2](i=0;i<255;i++)

{

SDL_FreeSurface(STD2_surf1[k][i]);

}

}

SDL_Quit();

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]return[/color][/size][/color][/size][size=2] EXIT_SUCCESS;

}

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]void[/color][/size][/color][/size][size=2] pause()

{

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]int[/color][/size][/color][/size][size=2] continuer = 1;

SDL_Event [/size][size=2][color="#0000ff"][size=2][color="#0000ff"]event[/color][/size][/color][/size][size=2];



[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]while[/color][/size][/color][/size][size=2] (continuer)

{

SDL_WaitEvent(&[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]event[/color][/size][/color][/size][size=2]);

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]switch[/color][/size][/color][/size][size=2]([/size][size=2][color="#0000ff"][size=2][color="#0000ff"]event[/color][/size][/color][/size][size=2].type)

{

[/size][size=2][color="#0000ff"][size=2][color="#0000ff"]case[/color][/size][/color][/size][size=2] SDL_QUIT:

continuer = 0;

}

}

}

[/size]

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.


×
×
  • Créer...