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 avec une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut Problème avec une fonction
    Bonjour ,

    J'ai créé une fonction qui me permet de trier dynamiquement deux tableaux un int et l'autre de char mais ça m'affiche des valeurs bizarres et je ne comprends vraiment pas pourquoi.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
     
    	int q[100];
    	char no[100];
     
    	}nouveautype;
     
    void maj_tab_cumul(nouveautype,int,char,int);
     
    int main(void) {
     
    	nouveautype table;
     
    	int i,qte1=10, qte2=9 , qte3=11, qte4=1;
    	char nro1='C', nro2='B' , nro3='D' , nro4='A';
     
    	maj_tab_cumul(table,5,nro1,qte1);
        maj_tab_cumul(table,5,nro2,qte2);
        maj_tab_cumul(table,5,nro3,qte3);
        maj_tab_cumul(table,5,nro4,qte4);
     
    	for(i=0; i<5; i++) {
     
    		printf("%c %d",table.no[i],table.q[i]);
    		printf("\n");
     
    	}
     
    	getchar();
     
    return EXIT_SUCCESS;
    }
     
    void maj_tab_cumul(nouveautype table,int dim,char nro,int qte) {
     
    	int i=0,j;
     
    	while (i < dim && table.no[i] < nro) {
     
    		i = i + 1 ;
     
    	}
     
    	if(i >= dim || table.no[i] > nro) {
     
     
    		dim=dim+1;
    		j=dim-1;
     
            	while(j > i) {
     
    	     	table.q[j]=table.q[j-1];
    	     	table.no[j]=table.no[j-1];
    	     	j=j-1;
     
            	}
     
    	table.no[i]=nro;
    	table.q[i]=0;
     
    	}
     
    	table.q[i]=table.q[i] + qte;
     
    }
    Cela m'affiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1606416384
     32767
     -2096378
     32767
     1606416432
    Alors que je devrais avoir normalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 A
    9 B
    10 C
    11 D
    Merci pour toute aide.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    table n'est pas initialisé et donc contient n'importe quoi.
    La fonction maj_tab_cumul() qui teste le contenu de tab et agit en fonction va donc faire n'importe quoi.

  3. #3
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Je l'ai fais mais ça m'affiche ceci
    J'ai initialisé comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveautype table={{0},{'0'}};
    C'est comme si ma fonction ne fessait rien !

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La fonction maj_tab_cumul() ne peut pas modifier le contenu de table (du main), le paramètre table de la fonction n'étant qu'une copie de l'argument table du main().
    Pour pouvoir le faire, il faut passer l'adresse de table (du main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ....
    nouveautype table = {{0},{0}};
    maj_tab_cumul(&table,5,nro1,qte1);
    ....
    void maj_tab_cumul(nouveautype *table,int dim,char nro,int qte)
    {
       int i=0,j;
       while (i < dim && table->no[i] < nro) ....
    D'autre part, même avec cette modification, le principe de maj_tab_cumul() est à revoir : Seule les cases d'indice 5 sont modifiées et le printf donnera les 5 premières valeurs d'initialisation des tableaux de la structure.

    On a successivement dans la structure :
    {{0,0,0,0,0, 0,0,...}{0,0,0,0,0, 0 ,0,....}}
    {{0,0,0,0,0,10,0,...}{0,0,0,0,0,'C',0,....}}
    {{0,0,0,0,0, 9,0,...}{0,0,0,0,0,'B',0,....}}
    {{0,0,0,0,0,11,0,...}{0,0,0,0,0,'D',0,....}}
    {{0,0,0,0,0, 1,0,...}{0,0,0,0,0,'A',0,....}}

  5. #5
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Moi je n'arrive pas à afficher le contenu , j'ai fait cela
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
     
    	int q[5];
    	char no[5];
     
    	}nouveautype;
     
    void maj_tab_cumul(nouveautype *,int,char,int);
     
    int main(void) {
     
    	nouveautype *table;
    	memset(&table , 0, sizeof(table));
     
    	int i,qte1=10, qte2=9 , qte3=11, qte4=1;
    	char nro1='C', nro2='B' , nro3='D' , nro4='A';
     
    	maj_tab_cumul(table,5,nro1,qte1);
        maj_tab_cumul(table,5,nro2,qte2);
        maj_tab_cumul(table,5,nro3,qte3);
        maj_tab_cumul(table,5,nro4,qte4);
     
    	for(i=0; i<5; i++) {
     
    		printf("%c %d",table->no[i],table->q[i]);
    		printf("\n");
     
    	}
     
    	getchar();
     
    return EXIT_SUCCESS;
    }
     
    void maj_tab_cumul(nouveautype *table,int dim,char nro,int qte) {
     
    	int i=0,j;
     
    	while (i < dim && table->no[i] < nro) {
     
    		i = i + 1 ;
     
    	}
     
    	if(i >= dim || table->no[i] > nro) {
     
     
    		dim=dim+1;
    		j=dim-1;
     
            	while(j > i) {
     
    	     	table->q[j]=table->q[j-1];
    	     	table->no[j]=table->no[j-1];
    	     	j=j-1;
     
            	}
     
    	table->no[i]=nro;
    	table->q[i]=0;
     
    	}
     
    	table->q[i]=table->q[i] + qte;
     
    }
    et ça m'affiche Segmentation fault

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Johnny P. Voir le message
    Moi je n'arrive pas à afficher le contenu , j'ai fait cela
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
     
    	int q[5];
    	char no[5];
     
    	}nouveautype;
     
    void maj_tab_cumul(nouveautype *,int,char,int);
     
    int main(void) {
     
    	nouveautype *table;
    	memset(&table , 0, sizeof(table));
     
    	int i,qte1=10, qte2=9 , qte3=11, qte4=1;
    	char nro1='C', nro2='B' , nro3='D' , nro4='A';
     
    	maj_tab_cumul(table,5,nro1,qte1);
        maj_tab_cumul(table,5,nro2,qte2);
        maj_tab_cumul(table,5,nro3,qte3);
        maj_tab_cumul(table,5,nro4,qte4);
     
    	for(i=0; i<5; i++) {
     
    		printf("%c %d",table->no[i],table->q[i]);
    		printf("\n");
     
    	}
     
    	getchar();
     
    return EXIT_SUCCESS;
    }
     
    void maj_tab_cumul(nouveautype *table,int dim,char nro,int qte) {
     
    	int i=0,j;
     
    	while (i < dim && table->no[i] < nro) {
     
    		i = i + 1 ;
     
    	}
     
    	if(i >= dim || table->no[i] > nro) {
     
     
    		dim=dim+1;
    		j=dim-1;
     
            	while(j > i) {
     
    	     	table->q[j]=table->q[j-1];
    	     	table->no[j]=table->no[j-1];
    	     	j=j-1;
     
            	}
     
    	table->no[i]=nro;
    	table->q[i]=0;
     
    	}
     
    	table->q[i]=table->q[i] + qte;
     
    }
    et ça m'affiche Segmentation fault
    Salut

    C'est normal. Dans ton main, tu déclares un pointeur "*table" qui pointe sur... ben en fait on n'en sais rien mais en tout cas aucune zone mémoire valide.
    Et à cette adresse dont on ne sait rien, tu stockes des valeurs via memset (avec une faute en plus car tu passes à memset l'adresse de table donc un "nouveautype **"). C'est un comportement indéterminé assuré.
    Le SegFault est encore ce qui pouvait t'arriver de mieux car au-moins tu sais qu'il y a un pb. Parce que dans le pire des cas, ton code aurait pu fonctionner (par hasard car ça fait partie des cas possibles du comportement indéterminé) durant 15 jours puis planter le jour où t'aurais rajouté un bête printf()

    Code c : 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) {
     
    	nouveautype table;
    	memset(&table , 0, sizeof(table));
     
    	int i,qte1=10, qte2=9 , qte3=11, qte4=1;
    	char nro1='C', nro2='B' , nro3='D' , nro4='A';
     
    	maj_tab_cumul(&table,5,nro1,qte1);
        maj_tab_cumul(&table,5,nro2,qte2);
        maj_tab_cumul(&table,5,nro3,qte3);
        maj_tab_cumul(&table,5,nro4,qte4);
     
    	for(i=0; i<5; i++) {
     
    		printf("%c %d",table.no[i],table.q[i]);
    		printf("\n");
     
    	}
     
    	getchar();
     
    return EXIT_SUCCESS;
    }

    PS: essaye de nommer tes types "t_qqchose". On arrivera mieux à différencier types et variables (et toi aussi)...
    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]

Discussions similaires

  1. Problème avec une fonction
    Par mademoizel dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/06/2006, 10h51
  2. problème avec une fonction javaScript
    Par volthur dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2006, 18h04
  3. Problème avec une fonction utilisateur !
    Par nalou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 17h06
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

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