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 d'affichage pour une SkipList


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Problème d'affichage pour une SkipList
    Bonjour à tous et à toutes,

    Depuis quelques jours j'ai construit une Skiplist à l'aide de la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct Column Column;
     
    struct Column{
     
    	int height;
    	char word[CHAR_MAX];
    	Column **following_columns;
    };
    C'est une colonne qui pointe sur d'autres colonnes, etc ...
    ça ressemble un peu aux listes chaînées.

    Le problème est le suivant :

    Je dois lire dans un fichier texte les mots les uns à la suite des autres pour les ajouter sous forme de colonne et construire ma skiplist.

    J'ai donc créer un fichier test.txt avec le mot : "un" à l'intérieur.

    Tout à l'air de très bien fonctionner, mais lors de l'affichage le mot "un" que je viens d'ajouter ne s'affiche pas correctement.

    Ce que je devrais avoir : a -> un -> NULL

    avec "a" le mot de ma première colonne que j'ai moi - même créée.

    Ce que ça m'affiche : a -> ??? -> NULL
    Avec un losange noir contenant un point d'interrogation ( code ascii : -1 ) et un carré dans lequel est écrit 007F (code ascii : 127) à la place des ???.

    Mon main :

    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
     
     
    int main (void)
    {
    	Column head;
    	FILE *f;
    	char mot_lu[CHAR_MAX] = "";
     
    	srand(time(NULL));
     
    	column_allocate_and_initialize(&head, "a");
     
    	f = fopen("test.txt", "r");
    	if( f == NULL) exit(1);
     
    	while( fscanf(f, "%s", mot_lu) != EOF )
    		column_add(&head, mot_lu);
     
     
    	display_all_linked_lists(&head);
     
    	return 0;
     
    }
    A chaque mot_lu je l'ajoute sous forme de colonne, en donnant ma première colonne : head en argument.

    J'ajoute donc cette colonne à l'aide de la fonction column_add() :
    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
     
    int
    column_add (Column *current_column, char word[CHAR_MAX])
    {
    	int 	current_height;
    	Column 	column_to_add;
     
           /* Je regarde si la colonne existe, si ce n'est pas le cas alors je renvoie.
               sinon je renvoie sa hauteur actuelle */
     
    	current_height = search_column_height(current_column, word);
    	if(column_does_not_exist(current_height)){
    		column_allocate_and_initialize (&column_to_add, word);
    	}
     
    	while(height_is_positive(current_height)){
    		while (	following_column_exist(current_column, current_height) &&
    				following_word_is_not_reached(current_column, current_height, word))
    			current_column	= current_column -> following_columns[current_height];
    		column_connect_to_the_linked_list(current_column, &column_to_add, current_height);
    		current_height--;
    	}
     
    	return 0;		
    }
    Lors de l'initialisation de la colonne à créer j'utilise strcpy () :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void
    column_set_word(Column *current_column, char word[CHAR_MAX])
    {
    	strcpy(current_column -> word, word);
    }
    Pour copier le mot, et j'initialise tout le reste

    Rappel : J'utilisais déjà column_allocate_and_initialize (); pour ma première colonne et ça marche très bien.
    Résultat : a -> NULL

    Sauf qu'à l'affichage , lorsque je veux parcourir ma liste
    Voici la 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
     
    void 
    display_all_linked_lists(Column *head)
    {
    	int current_height;
    	Column *current_column;
     
    	current_height = 0;
     
    	printf(" lvl %d\t[", current_height);
    	while(head != NULL){
     
    		printf(" %s ->", current_column -> word);
    		current_column = current_column -> following_columns[current_height];
    	}
    		printf(" NULL ]\n");
    }
    J'ai soit un SIGSEGV.

    Sinon si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     printf(" %s ->", current_column -> word);
     current_column = current_column -> following_columns[current_height];
     printf(" %s ->", current_column -> word);
    Alors dans ce cas j'ai ce que j'ai mis au début.

    Voilà si quelqu'un à une idée ça serait super sympa !

    Je vous remercie d'avance !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Voici la liste des fonctions d'initialisation au cas ou :

    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
     
     
    void
    column_set_word(Column *current_column, char word[CHAR_MAX])
    {
    	strcpy(current_column -> word, word);
    	printf("current_word = %s, strl = %d\n", current_column -> word,(int) strlen(current_column -> word));
    	printf("word = %s, strl = %d\n", word, (int)strlen(word));
     
    }
    void
    column_set_height(Column *current_column, int height)
    {
    	current_column -> height = height;
    }
     
    void
    column_initialize_height(Column *current_column, int height)
    {
    	column_set_height(current_column, height);
    }
     
    Column *
    column_allocate ()
    {
    	Column *current_column = malloc (sizeof(Column));
    	assert (current_column != NULL);
    	return current_column;
    }
     
    void
    column_initialize_word(Column *current_column, char word[CHAR_MAX])
    {
    	column_set_word	(current_column, word);	
    }
     
    Column **
    column_allocate_following_columns_array()
    {
    	Column **following_columns = malloc(ALLOCATING_SPACE * sizeof * following_columns);
    	assert (following_columns != NULL);
    	return following_columns;
    }
     
    void
    column_initialize_following_columns_array(Column *current_column)
    {
    	int i;
    	for (i = 0; i < ALLOCATING_SPACE; i++)
    		current_column -> following_columns[i] = NULL;
    }
     
    void
    column_allocate_and_initialize_following_columns_array(Column *current_column)
    {
    	current_column -> following_columns = column_allocate_following_columns_array();
    	column_initialize_following_columns_array(current_column);
    }
     
    void
    column_allocate_and_initialize (Column *current_column, char word[CHAR_MAX])
    {
    	column_initialize_height(current_column, 1);
    	column_initialize_word	(current_column, word);
    	column_allocate_and_initialize_following_columns_array(current_column);
    }

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça, ça sent très mauvais quand on sait que column_to_add est une variable locale...
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    column_connect_to_the_linked_list(current_column, &column_to_add, current_height);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  2. [GD] Problème d'affichage d'une image avec gd2
    Par turini dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h59
  3. Problème d'affichage d'une chaîne à l'écran
    Par Bubonik software dans le forum C
    Réponses: 7
    Dernier message: 08/05/2004, 20h47
  4. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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