Forum Programmation.c Warnings de compilation et résultat incorrect

Posté par  . Licence CC By‑SA.
Étiquettes :
0
2
déc.
2020

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:

    #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);
    }
  • # Au boulot !

    Posté par  (Mastodon) . Évalué à 7.

    Tu as 3 warnings (en fait 3 erreurs dans ton code) et c'est à nous de découvrir lesquelles ?

    Écoute ce que te dis le compilateur : tu t'es trompé entre un pointeur et une valeur quelque-part (et il te dit sur quelles lignes exactement). Relis bien ce que tu as écris, tu trouveras sans pb.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Enfin pas de warnings mais résultat incorrect

    Posté par  . Évalué à 0.

    Merci à vous.
    Je suis vraiment débutant c'est pour ca je n'ai pas pu déterminer l'emplacement des erreurs.
    Maintenant j'ai mis les * là ou il faut mais le résultat est encore erroné.
    Je vous demande juste de m'aider à comprendre ou figure l'erreur, je vais essayer de la corriger par la suite.

    include

    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=*nbseqcrois+1;
    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);
    }

    • [^] # Re: Enfin pas de warnings mais résultat incorrect

      Posté par  . Évalué à 4.

      Pour ma part j'éviterais de travailler directement avec le pointeur passé en entrée. (*nbseqcrois par exemple). Pour la clarté du code, j'utiliserais plutôt une variable et en fin de traitement, j'affecterais la valeur de cette variable à la variable pointée par nbseqcrois.

      Sinon si ça ne marche pas et que tu ne vois pas, c'est que ton code est illisible. Tu devrais décomposer ton code en fonctions de 4 à 5 lignes maximum …

      Ensuite, choisir correctement le nom de tes variables : éviter t et n, comme paramètre de fonction, ça veut rien dire. N'oublie jamais que programmer ce n'est pas seulement écrire un truc pour que la machine puisse décoder, c'est aussi, et surtout, faire en sorte que toi-même et les autres puissent te relire et comprendre à partir du code ce que tu veux faire.

      Par exemple, tu veux faire quoi avec cette séquence de code  ? :

      void positif(int* n) {
      
        do {
      
          printf("donner le nbre d'element du tableau :");
          scanf("%d",n);
      
        } while(*n<=0);
      
      }
    • [^] # Re: Enfin pas de warnings mais résultat incorrect

      Posté par  (Mastodon) . Évalué à 3.

      Je suis vraiment débutant c'est pour ca je n'ai pas pu déterminer l'emplacement des erreurs.

      Tu peux copier/coller le message exact, ce serait déjà un bon indice pour nous ;)

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # pointeurs et entiers

    Posté par  . Évalué à 1.

    Bonjour,

    Comme le dit le compilateur, il y a des soucis entre pointeurs et entiers.
    Dans la fonction soussequences, les arguments inddebpgs et indfinpgs sont des pointeurs sur entiers,
    mais dans les lignes suivantes, ils sont employés comme des entiers :

    inddebpgs = i - tailleseq + 1;
    [...]
    inddebpgs= i - tailleseq + 1;
    [...]
    indfinpgs = inddebpgs + taillepgs - 1;
  • # <troll-title>Futur chef de projet</troll-title>

    Posté par  . Évalué à 3.

    <troll>Dite, vous n'avez pas l'impression que c'est un étudiant qui nous fait faire son boulot ?…</troll>

    • [^] # Re: <troll-title>Futur chef de projet</troll-title>

      Posté par  . Évalué à 2. Dernière modification le 02 décembre 2020 à 13:09.

      Salut,

      C'est peut-être un peu pour ça que personne ne donne la réponse ? ;)

      Pour l'OP : Moyennant finances, je peux regarder. Toute heure commencée est due, comme on dit.

      Matricule 23415

      • [^] # Re: <troll-title>Futur chef de projet</troll-title>

        Posté par  . Évalué à 1.

        Bah, au moins il a fourni du code c'est déjà un début.

        Mais je le comprends, le C j'ai eu beaucoup de al au début. Mais une fois que j'ai compris la logique ça s'est très bien passé.

    • [^] # Re: <troll-title>Futur chef de projet</troll-title>

      Posté par  . Évalué à 2.

      tags : "je-fais-mes-devoirs" :-)

    • [^] # Re: <troll-title>Futur chef de projet</troll-title>

      Posté par  . Évalué à 4.

      Tu sais, tu aurais pu aider. Je ne comprend pas pourquoi personne ne lui a dit d'ajouter le flag magique qui supprime tous les warnings: -Werror. Moi, quand j'ai des warnings et des bugs sur mon code et que j'utilise rm a.out; gcc -Werror -Wall -Wextra foo.c, ben j'ai plus de warnings ni d'exécutable buggué.

  • # Commentaire supprimé

    Posté par  . Évalué à 1. Dernière modification le 09 février 2021 à 19:43.

    Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.