Warnings de compilation en C et résultat incorrect
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Warnings de compilation en C et résultat incorrect



  1. #1
    InToX86

    Warnings de compilation en C et résultat incorrect


    ------

    Bonjour,

    Je souhaite écrite un programme qui à partir d’un tableau d’entiers d’au moins un entier, fournit le nombre de sous-séquences croissantes de ce tableau, ainsi que les indices de début et de fin de la plus grande sous-séquence.
    J'ai eu des warnings de compilation dans 3 lignes (warning: assignment makes pointer from integer without a cast [-Wint-conversion]) et le résultat est incorrect, ça me donne toujours 0.
    Aidez-moi SVP! je vous remercie.
    Voilà mon code:

    Code:
    #include <stdio.h>
    
    void soussequences (int* t, int n, int* nbseqcrois, int* inddebpgs, int* indfinpgs)
    {
        int i, tailleseq, indseq, taillepgs;
        tailleseq = 1;
        taillepgs = 0;
        nbseqcrois = 1;
        for(i=0; i<n-1; i++)
        {
            if(t[i]<=t[i+1])
            tailleseq++;
            else
            {
                nbseqcrois++;
                if(taillepgs<tailleseq)
                {
                    inddebpgs = i - tailleseq + 1;
                    taillepgs=tailleseq;
                }
            }
            tailleseq=1;
        }
        if(taillepgs<tailleseq)
        {
            inddebpgs= i - tailleseq + 1;
            taillepgs = tailleseq;
        }
        indfinpgs = inddebpgs + taillepgs - 1;
    }
    
    void remplir(int* t , int n) 
    { 
        int i=0; 
        for(i=0;i<n;i++) 
        { 
            printf("donner la case numero %d :", i+1); 
            scanf("%d",t+i); 
        } 
    } 
    
    void positif(int* n) 
    { 
        do 
        { 
            printf("donner le nbre d'element du tableau :"); 
            scanf("%d",n); 
        }
        while(*n<=0); 
    } 
    
    int main ()
    {
    int n=0; 
    int t[20]; 
    positif(&n); 
    remplir(t,n); 
    int nbseqcrois=0, inddebpgs=0, indfinpgs=0;
    soussequences(t, n, &nbseqcrois, &inddebpgs, &indfinpgs);
    printf("Nombre sequences croissantes: %d\n", nbseqcrois);
    printf("Indice de début de la plus grande sequence croissante: %d\n", inddebpgs);
    printf("Indice de fin de la plus grande sequence croissante: %d\n", indfinpgs);
    }

    -----

  2. #2
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Le warning te dit tout : tu confonds pointeur et entier. Donc quand tu écris :

    Code:
    nbseqcrois = 1;

    Tu dis que ton pointeur doit pointer sur l'adresse 1 en mémoire et je ne pense pas que ce soit ce que tu veuilles faire parce que cela n'a pas de sens quand on programme de nos jours sur une machine moderne.

  3. #3
    albanxiii
    Modérateur

    Re : Warnings de compilation en C et résultat incorrect

    Une autre remarque, quand on écrit

    Code:
    soussequences(t, n, &nbseqcrois, &inddebpgs, &indfinpgs);
    le prototype de la fonction devrait être :

    Code:
    void soussequences (int* t, int n, int** nbseqcrois, int** inddebpgs, int** indfinpgs);
    Vous exécutez sous linux ou un autre système ?
    Not only is it not right, it's not even wrong!

  4. #4
    polo974

    Re : Warnings de compilation en C et résultat incorrect

    le message est clair: assignment makes pointer from integer
    tu te mélanges les pinceaux dans les pointeurs.
    en plus, le message te dis sur quelles lignes...

    un pointeur est une variable qui pointe normalement vers un endroit où tu stockes ta donnée.
    il faut "déréférencer" le pointer.

    https://fr.wikipedia.org/wiki/Op%C3%...C3%A9rencement
    bref, ajouter un * devant...


    (attention, un pointeur peut pointer vers n'importe quoi, même vers un endroit qui n'existe pas et là, boum "segmentation fault"...)

    le warning est trop gentil, je préfère une bonne erreur (et pas de génération d'exe).
    pour ça, il y a l'option -pedantic-errors à l'appel de gcc.
    Dernière modification par polo974 ; 02/12/2020 à 06h22.
    Jusqu'ici tout va bien...

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par albanxiii Voir le message
    Une autre remarque, quand on écrit

    Code:
    soussequences(t, n, &nbseqcrois, &inddebpgs, &indfinpgs);
    le prototype de la fonction devrait être :

    Code:
    void soussequences (int* t, int n, int** nbseqcrois, int** inddebpgs, int** indfinpgs);
    Vous exécutez sous linux ou un autre système ?
    ben non...
    Jusqu'ici tout va bien...

  7. #6
    InToX86

    Re : Warnings de compilation en C et résultat incorrect

    Bonjour,
    Merci à vous tous.
    Enfin, pas de warnings mais le programme affiche encore un résultat erroné.

    Code:
    #include <stdio.h>
    
    void soussequences (int* t, int n, int* nbseqcrois, int* inddebpgs, int* indfinpgs)
    {
        int i, tailleseq, indseq, taillepgs;
        tailleseq = 1;
        taillepgs = 0;
        *nbseqcrois = 1;
        for(i=0; i<n-1; i++)
        {
            if(t[i]<=t[i+1])
            tailleseq++;
            else
            {
                nbseqcrois++;
                if(taillepgs<tailleseq)
                {
                    *inddebpgs = i - tailleseq + 1;
                    taillepgs=tailleseq;
                }
                tailleseq=1;
            }
        }
        if(taillepgs<tailleseq)
        {
            *inddebpgs= i - tailleseq + 1;
            taillepgs = tailleseq;
        }
        indfinpgs = inddebpgs + taillepgs - 1;
    }
    
    void remplir(int* t , int n) 
    { 
        int i=0; 
        for(i=0;i<n;i++) 
        { 
            printf("donner la case numero %d :", i+1); 
            scanf("%d",t+i); 
        } 
    } 
    
    void positif(int* n) 
    { 
        do 
        { 
            printf("donner le nbre d'element du tableau :"); 
            scanf("%d",n); 
        }
        while(*n<=0); 
    } 
    
    int main ()
    {
    int n=0; 
    int t[20]; 
    positif(&n); 
    remplir(t,n); 
    int nbseqcrois=0, inddebpgs=0, indfinpgs=0;
    soussequences(t, n, &nbseqcrois, &inddebpgs, &indfinpgs);
    printf("Nombre sequences croissantes: %d\n", nbseqcrois);
    printf("Indice de début de la plus grande sequence croissante: %d\n", inddebpgs);
    printf("Indice de fin de la plus grande sequence croissante: %d\n", indfinpgs);
    }

  8. #7
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par InToX86 Voir le message
    Enfin, pas de warnings mais le programme affiche encore un résultat erroné.
    Le principe du forum, c'est qu'on n'est pas supposé débugger ton code à ta place et quand tu ne prends pas la peine de chercher ni de nous dire le genre d'erreur qu'il peut y avoir, tu donnes l'impression que tu attends que ça te tombe tout cuit.

  9. #8
    InToX86

    Re : Warnings de compilation en C et résultat incorrect

    Je n'ai pas pu déterminer l'emplacement de l'erreur en plus je suis vraiment débutant.

  10. #9
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par InToX86 Voir le message
    Je n'ai pas pu déterminer l'emplacement de l'erreur en plus je suis vraiment débutant.
    Programmer, ce n'est pas écrire du code : c'est trouver pourquoi il ne marche pas comme on voudrait.
    Donc il faut que tu apprennes à faire ça. L'idéal est d'utiliser un débugger : tu fais tourner ton programme instruction par instruction, tu regardes les variables et tu commences avec un cas simple.
    Et là normalement, tu vas voir ce qui ne se passe pas comme prévu.

    Si tu n'as pas d'environnement avec un débugger, il y a une autre solution : en installer un. Parce que c'est l'outil de base.

    Et si vraiment tu as des objections de nature religieuses à l'utilisation d'un debugger, du genre "c'est quelque chose qui n'existe que depuis 50 ans en gros", tu mets des printf pour afficher les valeurs des variables et en creusant et en déplacant les printf, tu vas trouver aussi. C'est juste 10 fois plus lent et fastidieux.

  11. #10
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Bon, je vais quand même préciser un truc : il est possible que personne ne t'ai expliqué que très vite, dès qu'on programme, il est utile voir indispensable d'avoir des outils efficaces dont le debugger.
    Et qu'historiquement, on passe 10 fois plus de temps sur du code existant pour le faire marcher, le corriger et le faire évoluer qu'à l'écrire.

    Et que voir comment il fonctionne, pouvoir le suivre en pas à pas aide vraiment à progresser, à comprendre comment fonctionne le langage, à détecter ses erreurs ou des comportement subtils difficiles à anticiper.

    Donc si personne ne t'a expliqué cela, c'est dommage et c'est envers eux que ma légère irritation est dirigée parce que cela veut dire qu'on t'enseigne à programmer comme on le faisait il y a 30 ou 40 ans, c'est à dire plutôt mal.

  12. #11
    polo974

    Re : Warnings de compilation en C et résultat incorrect

    oups, j'ai zappé plein de messages....

    donc supprimable...
    Dernière modification par polo974 ; 02/12/2020 à 10h45.
    Jusqu'ici tout va bien...

  13. #12
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par polo974 Voir le message
    il y a même une flèche sous le "=" qui pose pb ! ! ! !
    Je crois qu'il parle d'un problème de fonctionnement une fois son erreur sur les pointeurs réglés.

  14. #13
    albanxiii
    Modérateur

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par polo974 Voir le message
    ben non...
    Vous avez raison, je ne sais pas pourquoi j'avais en tête la déclaration de nbseqcrois et les autres comme des int *.

    Citation Envoyé par pm42 Voir le message
    Et si vraiment tu as des objections de nature religieuses à l'utilisation d'un debugger, du genre "c'est quelque chose qui n'existe que depuis 50 ans en gros", tu mets des printf pour afficher les valeurs des variables et en creusant et en déplacant les printf, tu vas trouver aussi. C'est juste 10 fois plus lent et fastidieux.
    Ou alors si tu programmes sur de l'embarqué et que ton chef te dit "Lauterbach niet, trop cher".
    Et là, le 10 est sous estimé en général.
    Not only is it not right, it's not even wrong!

  15. #14
    pm42

    Re : Warnings de compilation en C et résultat incorrect

    Citation Envoyé par albanxiii Voir le message
    Ou alors si tu programmes sur de l'embarqué et que ton chef te dit "Lauterbach niet, trop cher".
    Et là, le 10 est sous estimé en général.
    En effet mais cela me laisse perplexe. Ceci dit, je pense que ce n'est pas le cas des gens qui viennent poser des questions mais à force, je me demande si effectivement on n'enseigne pas la programmation à l'ancienne.
    Mes profs de fac disaient "l'informatique, ça se fait avec un tableau et une craie et il faut réfléchir avant de programmer".

    Sauf que quand ils tombaient sur des jeunes qui avaient déjà pas mal de code derrière eux, ils constataient que cet entrainement les rendaient plus rapide et plus efficaces même en algorithmie.

    Là, on dirait qu'on est passé à l'étape suivante : on apprend à coder mais comme si les outils étaient juste vi et gcc.
    En fait, il faudrait commencer dès le début, dès qu'un programme fait plus de 2 lignes avec un débugger et faire suivre l'exécution. Et montrer les erreurs et bugs habituels, comment on les traite.

    Sinon, c'est un peu comme si on faisait passer le code, expliquait les principes de la conduite mais qu'on ne faisait pas d'heures derrière un volant avant d'avoir le permis.

Discussions similaires

  1. Telecommande poele EDILKAMIN Tiny : mot de passe incorrect
    Par Polux17 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 8
    Dernier message: 10/10/2018, 11h02
  2. Un moyen politiquement incorrect de lutter contre la déforestation
    Par invite738f3b78 dans le forum Environnement, développement durable et écologie
    Réponses: 68
    Dernier message: 20/03/2012, 20h50