IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

un warning


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut un warning
    bonjour

    j'ai un programme que je compile sur borland 5.01
    et j'ai un warning je sais pas pk.

    le compilo me dit que p n'est jamais utilisé dans la fonction fusion.

    voilà le programme complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    int* fusion(int A[],int B[])
    {
    	int i,j,k,L=N+M;
       int *p=NULL; 
    	p=(int*)malloc(L*sizeof(int));
    	if (!p) //équivalent à if (p==NULL)
    	{return(p);}
    	for(i=0,j=0,k=0;i<N,j<M,k<L;k++)// si une des 3 conditions n'est pas vérifiée
    	{                                   // alors sortie de la boucle
       	if (A[i]<=B[j])                  // (c'est dans le cas où on aurait vidé un tableau avant)
          {
          	p[k]=A[i];
             printf ("(1)k=%d,i=%d,A[i]=%d, B[j]=%d\n",k,i,A[i], B[j]);
          	i++;
          }
          else
          {
          	p[k]=B[j];
             printf ("(2)k=%d,j=%d,B[j]=%d\n",k,j,B[j]);
          	j++;
     
          }
     
       if (i==N)
       	while (++k<L)
          {
          	p[k]=B[j];
             printf ("(3)k=%d,j=%d,B[j]=%d\n",k,j,B[j]);
             j++;
          }
       else if (j==M)
       	while (++k<L)
          {
          	p[k]=A[i];
             printf ("(4)k=%d,i=%d,A[i]=%d\n",k,i,A[i]);
             i++;
          }
       }
    return(p);
    }
    si je met tout au début, "int *p;" alors je n'ai pas de warning.
    j'ai lu (dans mon cours) qu'il était préférable de faire "int *p=NULL" ça évite que le pointeur pointe n'importe où.
    Donc j'aimerai savoir si c une erreur de faire int*p=NULL ? le warning n'est pas justifié il me semble.

    ensuite j'aimerai demander, pas dans ce programe, mais doit on faire avant ou après les scanf, les stdin(fflush) et le flushall (quelle différence entre les 22, je comprend pas très bien)?

    merci

    Merci

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 94
    Points : 448
    Points
    448
    Par défaut
    Pour le pointeur, c'est normal car le compilateur prefere que le poiteur soir initialisé qqpart pour pouvoir faire les chose correctement au cas ou tu t'en serviria pareps (donc soit par malloc ou NULL).

    Pour le fflush, en general, je le met juste devant un scanf qui "deconne".
    Maintenant, je ne sais pas si c'est la meilleur solution.
    Je connais pas l'autre donc je sais pas la difference entre les deux (=>aide )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Si je me rappelle bien, en language C, une variable ne peut pas être initialisée au moment de la déclaration, mais certains compilateurs le font peut-être.
    Donc selon moi pour résoudre le warning il faut faire :
    Je suis pas sûr de ce que je dis mais si je me rappelle bien en C, il faut d'abord déclarer la variable puis l'initialiser, et non faire les deux ensembles comme en C++.

  4. #4
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 337
    Points : 130 285
    Points
    130 285
    Billets dans le blog
    1
    Par défaut Re: un warning
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *p=NULL; 
    p=(int*)malloc(L*sizeof(int));
    Que fais ce code ? Il met dans p la valeur NULL, puis juste après, il met une autre valeur dans p.

    La première affectation n'a servi à rien. D'où l'avertissement.

    Maintenant, je sais que beaucoup de cours demandent d'initialiser les variables en début de fonction, même si elles sont affectées, pour ne pas avoir le fameux bug qui-se-produit-de-temps-en-temps propre aux variables non itnitialisées.

    Mais n'oublions pas que les compilateurs d'aujourd'hui (même si Borland C++ 5.01 n'est pas de la toute dernière crue) sont capables de détecter les variables non utilisées. Il ne faut pas oublier d'activer les avertissements (option -Wall pour gcc par exemple).

    Donc cette affectation est inutile. En plus dans ton cas, tu pouvais faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* p=(int*)malloc(L*sizeof(int));
    Ce qui retire ambiguité et code redondant.

    Citation Envoyé par Macdir
    Je suis pas sûr de ce que je dis mais si je me rappelle bien en C, il faut d'abord déclarer la variable puis l'initialiser, et non faire les deux ensembles comme en C++.
    C'est faux. C'est parfaitement possible en C. L'une des limitations du C par rapport au C++ dans ce cas est que toutes les variables doivent être déclarées en début de bloc.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut
    et chq fois qu'on est des étoiles, c'est "int* p" ou "int *p" ??
    (le compilo accepte mais j'aimerai savoir si l'étoile est avec le 1er ou 2ème terme)
    c'est p le pointeur donc je pense que c'est + exactement "int *p"

    par contre dans les fonction, on déclare souvent
    "int* fusion (int[],int[]);", l'étoile est avec le int.

    perso, réduire
    int *p=NULL;
    p=(int*)malloc(L*sizeof(int));
    en
    int* p=(int*)malloc(L*sizeof(int));
    je n'aurai pas pensé parce que dans la 1ère citation, on fait une addectation à "*p" et après on affecte à "p" donc pour moi ça serait 2 choses différentes. en mettant dans le code , je remarque que la 2ème citation est vrai, dans ce cas là je peux penser que "int *p" <=> "int* p"

    merci de m'apporter qq précisions.
    @+

  6. #6
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    C'est la meme chose d'écrire :
    ou Quand tu donnes une valeur à un pointeur, tu la donne à p et non *p, dans le cas du malloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *p=(int*)malloc....
    c'est la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *p ;
    p=(int*)malloc...
    Faut pas que l'étoile gène.
    C'est comme :
    et , c'est la même chose.

    Nas'

  7. #7
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 337
    Points : 130 285
    Points
    130 285
    Billets dans le blog
    1
    Par défaut
    Pour compléter la réponse (juste) de Nasky, je dirais que pour éviter la confusion de l'initialisation de p ou *p, est de placer l'étoile à côté du int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* p=(int*)malloc(L*sizeof(int));
    Ainsi on voit clairement qu'on déclare une variable p de type int* (pointeur sur int) et qu'on initialise.

    Ceci dit int *p, int* p et même int*p, restent équivalents. Ajouter des espaces entre les arguments est autorisé et ne change en rien la signification du programme (sauf dans une chaîne, bien entendu).
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Warnings intempestifs (tout de suite des grands mots)
    Par Walm dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/04/2004, 20h37
  2. Un warning devient fatal
    Par tomnie dans le forum Linux
    Réponses: 3
    Dernier message: 01/04/2004, 13h48
  3. [langage] Récupérer des Warning ??
    Par armada dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 16h45
  4. [warning][properties]problème de police introuvable
    Par cyrdec dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 11/04/2003, 17h41
  5. Warnings lors de la compilation
    Par polo54 dans le forum C
    Réponses: 5
    Dernier message: 07/02/2003, 09h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo