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 :

Warnings de compilation et résultat incorrect


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 3
    Par défaut Warnings de compilation 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 : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #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
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour,
    Vos erreurs sans vouloir tous les énumérer, viennent principalement du fait que vous utilisez très mal les variables de type adresse (pointeur). Sachez qu’un pointeur est une variable dont le contenu est une adresse mémoire ont dit alors qu’elle fait référence (pointe par exemple) sur une variable qui admet une valeur (on parle également de référence).


    Ainsi donc; à la ligne 8 (nbseqcrois = 1;)votre pointeur admet une nouvelle adresse qui est 1 autant dire que vous ne faites plus référence à vos précédentes adresses et donc vous perdez toute possibilité de pouvoir manipuler l’information qui se trouve à cette adresse précédente (en d’autres termes, vous avez écrasé/remplacer l’adresse précédente.) et le même scénario se produire un peu partout ligne 18 ; 26;...


    Commencez à revoir vos cours afin de comprendre comment utilise-t-on les pointeurs et à quoi ils servent pour comprendre pourquoi votre compilateur vous annonce warning sur l'assignation d’un pointer à partir d'un nombre entier et autre incompatibilité de type.

    à bientôt




  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par InToX86 Voir le message
    J'ai eu des warnings de compilation dans 3 lignes (warning: assignment makes pointer from integer without a cast [-Wint-conversion])
    Oui, car au lieu de modifier le pointé (but final de la fonction) tu modifies le pointeur (ce qui est alors une hérésie)
    Que fais ta fonction: elle reçoit un tableau et un index, va chercher des trucs dans le tableau et modifie l'index. Ecrivons un exemple simplifié qui modifie juste l'index en y copiant une valeur passée en paramètre

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void modif(int *idx, int v);
     
    int main() {
    	int xxx;
    	modif(&xxx, 123);
    	printf("xxx=%d\n", xxx);
    }
    La fonction reçoit l'adresse de la variable où copier la valeur, et ladite valeur. Elle devra donc copier cette valeur à la case pointée par cette adresse, et non pas à l'adresse même. Donc la fonction s'écrira
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void modif(int *idx, int v) {
    	*idx=v;
    }

    Or toi, tu as écrit
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void modif(int *idx, int v) {
    	idx=v;
    }
    D'où le warning disant qu'on ne doit pas copier d'entier dans une zone prévue pour recevoir une adresse.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 632
    Par défaut Pointeurs et algo
    Bonjour,

    Les pointeurs, ce n'est pas ça et cela a très bien été expliqué.

    Mais l'algorithme, ce n'est pas ça non plus :
    • Le tableau est pré-dimensionné à 20 mais on demande à l'utilisateur de saisir le nombre d'éléments sans aucunement le restreindre à 20 ou utiliser un tableau dynamique redimensionné à la taille fixée par l'utilisateur.
    • La boucle de soussequences réinitialise tailleseq à 1 à chaque itération ce qui n'est pas le bon endroit.
    • Le else de la décroissance va s'exécuter durant toute la séquence de décroissance alors que c'est seulement la première étape qui est intéressante car ce point est un sommet, /^\, dernier point d'une croissance, /^, et premier point d'une décroissance, ^\ (sauf pour i = 0 puisqu'il n'y a rien avant).
    • Après la boucle on considère que nous sommes sur une fin de séquence croissante ce qui n'est pas sûr du tout.


    Je conseillerais de faire un dessin d'une courbe quelconque, de placer les points de changement de signe de pente et de se demander comment ils sont caractérisés.
    Ensuite, il n'est pas inutile de faire tourner "à la main" l'algorithme sur quelques valeurs en regardant particulièrement le premier et le dernier point.

    Salutations

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Mais l'algorithme, ce n'est pas ça non plus
    Je m'en doutais un peu (j'ai fait tourner le truc sans résultat significatif) mais j'ai eu la flemme de chercher, me disant qu'un autre plus motivé se pencherait dessus
    Mais t'as gagné ton
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 632
    Par défaut
    Bonjour Sve,

    Citation Envoyé par Sve@r Voir le message
    Je m'en doutais un peu (j'ai fait tourner le truc sans résultat significatif) mais j'ai eu la flemme de chercher, me disant qu'un autre plus motivé se pencherait dessus
    Mais t'as gagné ton
    Merci mais le nombre d'erreurs (et je ne suis pas sûr de les avoir toutes vues) rendait l'analyse assez facile. J'ai donné quelques pistes pour qu'un peu de réflexion permette de trouver une solution simple.

    Bonne journée.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/09/2012, 09h44
  2. Problème de calcul : Résultat incorrect.
    Par Nico-xs dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/10/2006, 13h10
  3. problème de warning en compilant win32 + directx
    Par madcode dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 17/10/2006, 16h58
  4. Réponses: 8
    Dernier message: 23/08/2006, 18h40
  5. Petits warnings apres compilation sous Solaris
    Par Thordax dans le forum C++
    Réponses: 22
    Dernier message: 04/07/2006, 09h45

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