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 :

Problème de pile sur un programme.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut Problème de pile sur un programme.
    Voila, comme le titre l'indique j'ai un p'tit souci dans mon programme.

    C'est un programme qui doit, par dichotomie et récursivité, retrouver la position d'un nombre dans un tableau et l'afficher, pour cela, pas de pointeur, uniquement une fonction, mais je bloque, il y a surement des paramètres que j'écris mal car ça me donne une erreur de pile lors de l'affichage de l'emplacement du nombre dans le tableau, voici le programme:

    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
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdio.h>
    #include <math.h>
     
    int dicho(int a, int b, int n, float tab[])
    {
    if(tab[a]==n)
    return a;
    if(tab[b]==n)
    return b;
    if(tab[b]>n)
    {
    tab[a]=tab[(a+b)/2];
    tab[b]=tab[4];
    dicho(a,b,n,tab);
    }
    if(tab[b]<n)
    {
    tab[b]=tab[(a+b)/2];
    tab[a]=tab[0];
    dicho(a,b,n,tab);
    }
    else
    return 0;
    }
     
    main()
    {
    int x,i,j,k,l,m,n;
    float leau[4];
     
    printf("Entrer votre tableau de 4 nombres: ");
    for(i=0;i<=3;i++)
    {
    scanf("%f",&leau[i]);
    }
     
    for(j=0;j<=3;j++)
        {
        for(k=0;k<=j;k++)
            {
            if(leau[j]<leau[k])
                {
                l=leau[j];
                m=leau[k];
     
                leau[j]=m;
                leau[k]=l;
                }
            }
        }
     
    i=0;
     
    for(i=0;i<=3;i++)
        {
        printf("Votre tableau croissant est: %f \n",leau[i]);
        }
     
    printf("Entrer la valeur dont vous voulez la position: ");
    scanf("%d",&n);
     
    x=dicho(0,4,n,leau);
     
    if(x>1)
    {
    x=x-1;
    }else
    x=1;
     
    printf("Votre chiffre est a la position %d du tableau",x);
    }
    Pour la partie rentrage et triage du tableau ça marche, donc ça sert à rien de chercher une faute là-dedans, la faute est dans la fonction dicho.

    Et voici l'erreur qui s'affiche:


    Merci d'avance aux personnes qui sauront m'aider.

  2. #2
    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 Dam63 Voir le message
    Voila, comme le titre l'indique j'ai un p'tit souci dans mon programme.

    C'est un programme qui doit, par dichotomie et récursivité, retrouver la position d'un nombre dans un tableau et l'afficher, pour cela, pas de pointeur, uniquement une fonction, mais je bloque, il y a surement des paramètres que j'écris mal car ça me donne une erreur de pile lors de l'affichage de l'emplacement du nombre dans le tableau, voici le programme:

    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
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdio.h>
    #include <math.h>
     
    int dicho(int a, int b, int n, float tab[])
    {
    if(tab[a]==n)
    return a;
    if(tab[b]==n)
    return b;
    if(tab[b]>n)
    {
    tab[a]=tab[(a+b)/2];
    tab[b]=tab[4];
    dicho(a,b,n,tab);
    }
    if(tab[b]<n)
    {
    tab[b]=tab[(a+b)/2];
    tab[a]=tab[0];
    dicho(a,b,n,tab);
    }
    else
    return 0;
    }
     
    main()
    {
    int x,i,j,k,l,m,n;
    float leau[4];
     
    printf("Entrer votre tableau de 4 nombres: ");
    for(i=0;i<=3;i++)
    {
    scanf("%f",&leau[i]);
    }
     
    for(j=0;j<=3;j++)
        {
        for(k=0;k<=j;k++)
            {
            if(leau[j]<leau[k])
                {
                l=leau[j];
                m=leau[k];
     
                leau[j]=m;
                leau[k]=l;
                }
            }
        }
     
    i=0;
     
    for(i=0;i<=3;i++)
        {
        printf("Votre tableau croissant est: %f \n",leau[i]);
        }
     
    printf("Entrer la valeur dont vous voulez la position: ");
    scanf("%d",&n);
     
    x=dicho(0,4,n,leau);
     
    if(x>1)
    {
    x=x-1;
    }else
    x=1;
     
    printf("Votre chiffre est a la position %d du tableau",x);
    }
    Pour la partie rentrage et triage du tableau ça marche, donc ça sert à rien de chercher une faute là-dedans, la faute est dans la fonction dicho.

    Et voici l'erreur qui s'affiche:


    Merci d'avance aux personnes qui sauront m'aider.
    Ton tableau de 4 éléments va de tab[0] à tab[3]. Dans la fonction "dicho" tu vas à un moment t'adresser à tab[4] donc t'es hors tableau. J'ai pas regardé plus loin voir s'il y avait autre chose. Par ailleurs introduire la limite de ton tableau "en dur" dans la fonction "dicho" est une très mauvaise idée (aucune portabilité)

    Citation Envoyé par Dam63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(leau[j]<leau[k])
                {
                l=leau[j];
                m=leau[k];
     
                leau[j]=m;
                leau[k]=l;
                }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(leau[j]<leau[k])
                {
                l=leau[j];
                leau[j]=leau[k];
                leau[k]=l;
                }
    PS: Quand on travaille sur un tableau de "n" éléments (dans ton cas il s'agit de 4), il est plus lisible de boucler de 0 à <n que de 0 à <=(n-1)
    => remplacer "for (i=0; i <=3; i++)" par "for (i=0; i < 4; i++)"
    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]

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Après un rapide coup d'oeil, il me semble, qu'en plus de dépassement des bornes tu as les problèmes suivants :

    1) Tu recherches une valeur entière N dans un tableau de réels.

    2) Pour une recherche dichotomique, il faut que ton tableau soit trié. Si c'est le cas ta fonction le mélange. Dans ta fonction, il ne faut pas toucher aux valeurs du tableau mais aux indices passés en paramètres. regarde ton code, si t[a] ou t[b] ne contiennent pas la valeur cherchée, tu permutes des cases du tableau et rappelle la fonction avec les mêmes valeurs de paramètres pour a et b.

    Bon courage

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    J'ai fais ce que tu m'as dis Sve@r, et ça va mieux, plus de problème de pile, maintenant je dois avoir un problème de fonction, car quand je lui rentre le nombre dont je veux connaitre la position, il me met toujours 2 comme position, pourtant ça ne devrait pas être le cas.

    Sinon oui, mon tableau est bien trié, et le but est de couper le tableau en deux jusqu'à trouver la bonne valeur, c'est ça la dichotomie.

  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 Dam63 Voir le message
    J'ai fais ce que tu m'as dis Sve@r, et ça va mieux, plus de problème de pile, maintenant je dois avoir un problème de fonction, car quand je lui rentre le nombre dont je veux connaitre la position, il me met toujours 2 comme position, pourtant ça ne devrait pas être le cas.
    Fred83 a raison. Tu devrais pas faire "tab[...]=tab[...]" dans ta fonction dicho car tu vas t'autopolluer les éléments de ton tableau.
    Faut juste que tu rappelles récursivement dicho en lui passant les bornes min et max de recherche sans jamais toucher à tab...
    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
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Faut juste que tu rappelles récursivement dicho en lui passant les bornes min et max de recherche sans jamais toucher à tab...
    Ouais je vois, mais comme faire ça? Ça fait 2 semaines que je bosses dessus et je bloque toujours, je me demande si j'y arriverais un jour...

Discussions similaires

  1. Problème entrée standard sur un programme
    Par Sharpounet dans le forum Débuter
    Réponses: 4
    Dernier message: 06/07/2009, 11h16
  2. Problème de résultat sur un programme en Pascal
    Par Poseidon62 dans le forum Langage
    Réponses: 1
    Dernier message: 28/03/2009, 20h13
  3. Problème mémoire sur un programme?
    Par theclem35 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 23/12/2007, 07h53
  4. Taille de la pile sur programme Borland C++
    Par mohira dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 17/12/2007, 21h56
  5. Réponses: 4
    Dernier message: 13/03/2007, 22h33

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