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 :

Suite de Conway


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut Suite de Conway
    Bonsoir je suis débutant en C (J'en fais que depuis septembre étant étudiant en génie électrique) et j'ai fait un programme qui affiche n termes de la suite de conway en C.
    Le programme fonctionne correctement (enfin il en à l'air ^^) mais le compilateur m'indique un Warning et j'aimerais savoir pourquoi et comment corriger cela? :/

    Voici l'avertissement en question:
    http://img84.imageshack.us/img84/6277/43571358hi7.jpg

    De plus je tiens a signaler que j'ai eu de la chance pour faire fonctionner le programme, au début mon programme ne fonctionnait pas, j'avais des erreurs de type dans les arguments de ma fonction....puis j'ai mis des pointeurs (un peu au hasard en testant et aussi en fonction des messages du compilateur.

    Tout ça pour en venir à ma deuxième question: Est-on obligé de passer par des pointeurs pour faire une fonction qui retourne une chaine de char?

    Voici ma fonction:
    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
    char* conway(char* chaine1)
    {
        char chaine2[999999] = {'0'};
        chaine2[999998] = chaine1[99998] = '\0';
     
        int compteur, position = 0, c,t = 0;
     
        c = chaine1[0];
     
     
        while ((chaine1[position] != 0) || (chaine1[position] != '\0'))
        {
            compteur = '0';
            while (chaine1[position] == c)
            {
                compteur++;
                position++;
            }
            chaine2[t] = compteur;
            t++;
            chaine2[t] = c;
            t++;
            if (chaine1[position] !=0) c = chaine1[position];
        }
        return (chaine2);
    et l'endroit où j'appelle cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(chaine1,conway(chaine1));
    Est ce que ce code est correct?

    Voilà je remercie d'avance l'âme charitable qui pourra m'aider

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Salut,

    Tuas de la chance que ton programme fonctionne.
    Ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char* conway(char* chaine1)
    {
        char chaine2[999999] = {'0'};
    ...
       return chaine2;
    }
    Ta fonction retourne l'adresse d'une variable locale à ta fonction. chaine2 est une variable locale donc elle est "construite" sur la pile. Lorsque tu quittes ta fonction, ta pile est réutilisée et donc ta variable est très probablement modifiée. Donc tu risques d'utiliser quelquechose qui est modifié à ton insu.

    Dans ton cas, ce qu'il faut faire, c'est allouer de la mémoire, travailler sur ce bloc de mémoire allouée et retourner ce bloc de mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char* conway(char* chaine1)
    {
        char *chaine2 = malloc(999999);
        if(chaine2 == NULL)
        {
            /* traitement d'erreur allocation mémoire */
        }
        memset(chaine2, 0, 999999);
    ...
        return chaine2;
    }
    Attention, il ne faut pas que l'appelant oublie de libérer le bloc de mémoire
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut
    Whoo merci pour la réponse super rapide !

    Outch, mais en fait on a jamais vu malloc() et memset() en cours

    Ma question se ramène alors à:

    Existe-il une autre manière pour affecter ma chaine1 (qui est dans la fonction main() )
    de chaine2 dans la fonction secondaire ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Oui mais a ce compte la, les 2 chaines appartiennent à l'appelant et ta fonction ne fait que les modifier. un truc comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char* conway(int taille_chaine, char* chaine1, char* chaine2)
    {
        char chaine2[taille_chaine] = {'0'};
        chaine2[taille_chaine - 1] = chaine1[taille_chaine - 1] = '\0';
     
    ...
        return chaine2;
    }
    et l'appel maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    char chaine1[1000000];
    char chaine2[1000000];
     
    strcpy(chaine1,conway(1000000 - 1, chaine1, chaine2));
    ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut
    Merci pour l'aide, je pige un peu mieux maintenant

    J'ai d'autres petites questions:
    Quand on initialise une chaine de cette sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine1[1000000] = {'1'};
    Le caractère de fin " \0 " se met il automatiquement après le '1' ?

    Si oui, est-ce que je peux faire ça:

    Appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    char chaine1[1000000] = {'1'};
    char chaine2[1000000] = {'0'};
     
    strcpy(chaine1,conway(chaine1, chaine2));
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* conway(char* chaine1, char* chaine2)
    {
     
    ...
        return chaine2;
    }
    Donc en gros ne pas me servir de la variable taille_chaine...c : ? :

    PS: En tout cas j'ai testé et ça marche, après je ne sais pas si ça peut faire des conflits ou autre erreurs...

    PS2: Il est normal qu'au bout de beaucoup d'itérations les termes de cette suite deviennent imposants... déjà a partir de la 20eme répétition, le terme X20 prend 6 ligne de la console.

    Moi l'utilisateur ne doit pas demander un terme supérieur a 100, donc le max est de 99.
    Voilà ce qu'il se passe quand j'affiche tous les terme jusque 99:
    http://img373.imageshack.us/my.php?image=conwayvv3.jpg

    Alors la console défile tellement et les termes deviennent tellement long qu'on ne peut même plus remonter tout en haut de la console (pour voir la définition de la suite), et on ne peut même pas lire le terme X99 dans sa totalité.

    Est ce normal?

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par défaut
    Bon le problème du warning est réglé mais j'ai un nouveau problème! yaisse2: ^^

    Mon programme affiche d'abord les 5 premiers termes de la suite puis demande à l'utilisateur de choisir un terme dont il veut la solution (<100). Jusqu'ici tout va bien, je teste avec des petites valeurs du genre X12, X20...le programme fonctionne...

    Mais à partir de X50, le programme plante!
    Je demande X49, ça marche... mais X50..X51....X99...ça plante

    Voici le code source, ça fait 5 jours que je m'arrache les cheveux:
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     
     
    char* conway(char*,char*);
     
    void main(void)
    {
        int i,terme;
        char chaine1[999999] = {'1','\0'};
        char chaine2[999999] = {'\0'};
     
     
     
        printf("\t************************************************************\n");
        printf("\t*** Suite 'Look and Say' de J.H.Conway, Par Nicolas xxxx ***\n");
        printf("\t************************************************************\n");
        printf("\n(*) Dans cette suite, un terme se determine en annoncant les chiffres formant \nle terme precedent:\n\n");
     
        printf("X00=1\n");
     
        for(i = 1; i <= 5; i++)
        {
            strcpy(chaine1,conway(chaine1, chaine2));
            printf("X%02i=",i);
            printf("%s\n",chaine1);
        }
     
        while (terme > 99)
        {
            printf("\n(**) Veuillez choisir le terme dont vous voulez la solution (inferieur a 100):\n--> ");
            scanf("%i",&terme);
            if (terme < 6)
            {
                while (terme < 6)
                {
                    printf("Entrez un nombre superieur a 5, vous avez deja les 5 premier termes");
                    scanf("%i",&terme);
                }
            }
        }
     
            for(i = 6; i <= terme; i++)
        {
            strcpy(chaine1,conway(chaine1,chaine2));
            printf("\nX%02i=",i);
            printf("%s\n",chaine1);
        }
        system("pause");
     
     
    }
     
    //FONCTIONS
    char* conway(char* chaine1, char* chaine2)
    {
        *chaine2 = '\0';
     
        int compteur, position = 0, c,t = 0;
     
        c = chaine1[0];
     
     
        while (chaine1[position] != '\0')
        {
            compteur = '0';
            while (chaine1[position] == c)
            {
                compteur++;
                position++;
            }
            chaine2[t] = compteur;
            t++;
            chaine2[t] = c;
            t++;
            if (chaine1[position] != '\0') c = chaine1[position];
        }
        return (chaine2);
     
    }

Discussions similaires

  1. reauete suite à une requete
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/08/2003, 14h42
  2. [JSP][JDBC]1 seule connexion à la DB(suite)
    Par betherb dans le forum JDBC
    Réponses: 6
    Dernier message: 14/08/2003, 10h02
  3. Migration Access > SQL Server (suite) : Compteur
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2003, 14h08
  4. Réponses: 2
    Dernier message: 04/03/2003, 23h24
  5. Pb BDE suite a passage en Windows 2000 pro
    Par ARIF dans le forum Paradox
    Réponses: 4
    Dernier message: 18/11/2002, 11h39

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