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 :

Mon programme affiche n'importe quoi


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut Mon programme affiche n'importe quoi
    Bonjour,

    Cette fois ci c'est une fonction que m'a présentée mon professeur et qui fait partie d'un programme .
    Cette fonction plante à la compilation . J'aimerais savoir où se trouve l'erreur ?
    Il ya les stuctures déclarées en début de 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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define NBVILLE 20
    #define LONGNOM 30
    #define NBVILLES 20
    #define NBCHEMINS 5
     
    struct matrice {
    	short int ville_suiv;
    	short int distance;
    };
     
    typedef struct {
    	short int num_ville;
    	short int num_suiv;
    } ITINERAIRE;



    Ce n'est pas un code créé par moi mais mon prof me l'a envoyé et j'aimerais essayer déjà de comprendre le code et de le corriger pour qu'il fonctionne
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    /****************************************************************************/
    /*                 fonction optimise                                        */
    /****************************************************************************/
     
    void fonction_optimise(int nombre_de_ville,char *pville,struct matrice *pchemin, ITINERAIRE *Citi)
    {
    	/*déclaration des variables locales*/
    	int long_opti=32000,long_iti=0;
    	int optimal[NBVILLES];
    	int ville_depart,ville_arrive;
    	int i;
     
    	/*déclaration de la variable d'incrémentation du pointeur chemin*/
    	/*elle me permet de sauvegarder le dernier déplacement*/
    	int c=0;
     
    	/*déclaration de la variable existe pour indiquer si la ville est déjà*/
    	/*présente ou non dans le tableau Diti*/
    	int existe=0;
     
    	/*déclaration de pointeur itinéraire*/
    	/*opti qui va permettre de copier le tableau Diti dans le tableau optimal*/
    	/*et Fin qui conservera l'adresse du tableau Diti afin de faire un test*/
    	/*pour ne pas aller en négatif*/
        ITINERAIRE *Opti;
    	ITINERAIRE *Fin;
     
    	/*déclaration du pointeur Fiti qui me permettra de tester que la ville*/
    	/*suivante ne se trouve pas déjà dans le tableau Diti ainsi qu'une variable*/
    	/*f pour son déplacement*/
    	ITINERAIRE *Fiti;
    	int f=0;
     
    	/*initialisation des pointeurs ITINERAIRE*/
    	Fiti=Citi;
    	Opti=Citi;
    	Fin=Citi;
     
    	/*affichage des villes et des numéros existants*/
    	printf("\nchoix des villes\n");
    	printf("\n%s\t%s\n","Numero","Nom");
     
    	/*cette boucle for me permet d'afficher les numéros de ville et*/
    	/*les villes de  à nombre de ville-*/
    	for(i=0;i<nombre_de_ville;i++)
    	{
    		printf("\n%i\t%s",i+1,pville+i*LONGNOM);
    	}
     
    	/*saisie du parcours*/
    	printf("\n\nveuillez entrer la ville de depart : ");
    	scanf("%i",&ville_depart);
    	ville_depart--;
     
    	printf("\nveuillez entrer la ville d arrivee : ");
    	scanf("%i",&ville_arrive);
    	ville_arrive--;
     
    	/*je décrémente mes variables por travailler de 0 à x*/
     
    	/*1ère phase initialisation du tableau Diti*/
    	Citi->num_ville=ville_depart;
    	Citi->num_suiv=0;
     
    	/*2ème phase: boucle effectuée jusqu'à la fin*/
     
    	/*positionnement du pointeur dans le tableau CHEMIN*/
    	/*soit le 1er chemin de la ville de depart*/
    	pchemin=pchemin+ville_depart*NBCHEMINS;
     
    	/*boucle qui tourne avec un goto*/
        boucle:
     
    	do
    	{
    		/*test que la ville suivante soit différente de -1*/
    		if(pchemin->ville_suiv!=-1)
    		{
    			/*teste si la ville est déjà présente dans Diti*/
    			/*et sauvegarde le résultat dans la variable existe*/
    			do
    			{
    				if(pchemin->ville_suiv!=Fiti->num_ville)
    				{
    					f++;
    					Fiti++;
    				}
    				else
    					existe=1;
    			}while(f<NBVILLES&&existe==0);
     
    			/*je réinitialise mon pointeur Fiti au début du tableau de Diti*/
    			Fiti=Fiti-f;
     
    			/*je réinitialise ma variable de déplacement de pointeur à 0*/
    			/*pour la prochaine boucle*/
    			f=0;
     
    			/*si la ville n'est pas déjà présente dans Diti alors on incrémente*/
    			/*Citi et on renseigne les champs de Diti*/
    			if(existe==0)
    			{
    				Citi++;
    				Citi->num_ville=pchemin->ville_suiv;
    				Citi->num_suiv=0;
     
    				/*on incrémente long iti*/
    				long_iti=long_iti+pchemin->distance;
    			}
    			else
    				/*si la ville existe déjà on incrémente Citi->num_suiv*/
    				Citi->num_suiv=Citi->num_suiv+1;
    		}
    		else
    		{
    			/*retour au début du tableau chemin*/
    			pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
     
    			/*je réinitialise les valeurs courantes de Citi*/
    			Citi->num_ville=-1;
    			Citi->num_suiv=0;
     
    			/*je décrémente mon pointeur Citi*/
    			Citi--;
     
    			/*je teste que je sois bien dans le tableau pour éviter les erreurs*/
    			if(Citi>=Fin)
    			{
    				/*positionnement du pointeur dans le tableau chemin*/
    				/*avec les nouvelles valeurs courantes de Citi*/
    				ville_depart=Citi->num_ville;
    				c=Citi->num_suiv;
    				pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
     
    				/*je déduis la distance du chemin Citi->num_suiv*/
    				long_iti=long_iti-pchemin->distance;
     
    				/*j'incrémente la valeur de Citi->num_suiv pour essayer un autre chemin*/
    				Citi->num_suiv=Citi->num_suiv+1;
    			}
    		}
     
    		/*retour au début du tableau chemin*/
    		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
     
    		/*positionnement du pointeur dans le tableau chemin*/
    		ville_depart=Citi->num_ville;
    		c=Citi->num_suiv;
    		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
     
    		/*je réinitialise ma variable existe à 0 pour la prochaine boucle*/
    		existe=0;
    	}while(Citi->num_ville!=ville_arrive&&Citi>=Fin);
     
    	/*le while ci dessus s'arrête lorsque le parcours optimal est trouvé*/
    	/*ou lorsque le pointeur Citi se retrouve au début de tableau*/
    	/*cela l'empêche d'être inférieur au tableau*/
     
    	/*je teste si long iti est le chemin optimal ou pas*/
    	/*si c'est le cas , je sauvegarde l'itinéraire dans le tableau optimal*/
    	if(long_iti<long_opti&&Citi>=Fin)
    	{
    		long_opti=long_iti;
     
    		/*copie du tableau Diti dans le tableau optimal*/
    		/*la variable 'i' me sert aussi à compter le nombre de*/
    		/*déplacement du pointeur pour pouvoir le réinitialiser ensuite*/
            for(i=0;i<NBVILLES;i++)
    		{
    			optimal[i]=Opti->num_ville;
    			Opti++;
    		}
    		Opti=Opti-i;
    	}
     
    	/*la ville d'arrivée a été trouvée, je réinitialise mes variables de Citi courant*/
    	/*puis je le décrémente . Ensuite je déduis la distance du chemin Citi->num suiv*/
    	/*et j'augmente Citi->num suiv pour essayer un autre chemin*/
    	/*par contre si Citi est inférieur à Fin cela veut dire qu'une boucle testant*/
    	/*le -1 l'a sortit du tableau et que tous les chemins ont été essayés*/
    	if(Citi>Fin)
    	{
    		Citi->num_ville=-1;
    		Citi->num_suiv=0;
    		Citi--;
     
    		/*retour au début du tableau chemin*/
    		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
     
    		/*positionnement du pointeur dans le tableau chemin*/
    		ville_depart=Citi->num_ville;
    		c=Citi->num_suiv;
    		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
     
    		/*remise à jour de long iti*/
    		long_iti=long_iti-pchemin->distance;
     
    		/*j'incrémente la valeur de Citi->num suiv pour essayer un autre chemin*/
    		Citi->num_suiv=Citi->num_suiv+1;
     
    		/*retour au début du tableau chemin*/
    		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
     
    		/*positionnemlent du tableau pointeur dans le tableau chemin*/
    		ville_depart=Citi->num_ville;
    		c=Citi->num_suiv;
    		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
     
    		/*goto boucle me permet de faire recommencer toute la boucle de recherche*/
    		/*du parcours optimal*/
    		goto boucle;
    	}
     
    	/*troisième phase : Fiti est inférieur à Diti*/
     
    	/*affichage de la longueur optimale*/
    	printf("\nla longueur optimale est de : %i\n",long_opti);
     
    	/*affichage du parcours*/
    	i=0;
     
    	printf("\nles villes a traverser sont :\n");
     
    	do
    	{
    		printf("\n\t%s",pville+(optimal[i]*LONGNOM));
    		i++;
    	}while(optimal[i]!=-1);
    }

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Euh, j'essaye de comprendre le code.
    Apparement, il s'agit de trouver le plus court trajet, non ?

    Par contre, je crois qu'il y a deux fois la fonction optimiser, peut etre que c'est ca qui bug ?

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Cette fonction plante à la compilation . J'aimerais savoir où se trouve l'erreur ?
    Tu nous donnes l'erreur du compilateur, stp, ainsi que la ligne où il te dit qu'il y a un problème ?
    N'oublie pas de citer ladite ligne, il n'y a pas de numéros de ligne sur le forum...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Désolé pour avoir doublé la fonction mais dans mon programme il n'y a en q'une .
    C'est plutôt moi qui ai buggé en postant .

    Il n'y a pas de message d'erreur ni de ligne donc c'est plutôt à l'exécution que le programme plante .ça me met un message d'erreur windows avec ça :


  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Peut-tu nous montrer l'appel de la fonction en question ?

  6. #6
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    C'est un programme qui calcule et choisit l'itinéraire le plus court entre deux villes :

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define NBVILLE 20
    #define LONGNOM 30
    #define NBVILLES 20
    #define NBCHEMINS 5
     
    struct matrice {
    	short int ville_suiv;
    	short int distance;
    };
     
    typedef struct {
    	short int num_ville;
    	short int num_suiv;
    } ITINERAIRE;
     
    /*déclaration des fonctions*/
    int fonction_ville(int nombre_de_ville,char *pville);
    void fonction_distance(int nombre_de_ville,char *pville,struct matrice *pchemin);
    void fonction_parcours(int nombre_de_ville,char *pville,struct matrice *pchemin);
    void fonction_optimise(int nombre_de_ville,char *pville,struct matrice *pchemin,ITINERAIRE *Citi);
     
    /*********************************************/
    /*        FONCTION PRINCIPALE                */
    /*********************************************/
     
    int main(int argc,char *argv[])
    {
    	/*déclaration des variables locales*/
    	/*déclaration du tableau de structure et son pointeur*/
     
    	struct matrice chemin[NBVILLES][NBCHEMINS]={{{1,170},{2,140},{3,315},{-1,0},{-1,0}},
    	{{0,170},{4,345},{2,160},{-1,0},{-1,0}},
    	{{0,140},{1,160},{4,175},{-1,0},{-1,0}},
    	{{0,315},{4,235},{-1,0},{-1,0},{-1,0}},
    	{{1.345},{2,175},{3,235},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},
    	{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}}};
    	struct matrice *pchemin ;
     
    	/*déclaration du tableau des villes et son pointeur*/
    	char ville[NBVILLE][LONGNOM]={"Paris","Arras","Reims","Dijon","Metz"};
        char *pville;
     
    	/*déclaration du tableau de struct itinéraire*/
    	ITINERAIRE Diti[NBVILLES];
    	ITINERAIRE *Citi;
     
    	/*tableau permettant la saisie du choix du menu*/
    	char choix[9];
    	int nombre_de_ville=5;/*initialisé à 5 puisque j'ai déjà mis des villes dans le tableau*/
    	int i,j;
     
    	/*initialisation des variables "villes suivantes" à -1*/
    	for(i=0;i<20;i++)
    	{
    		for(j=0;j<5;j++)
    		{
    			chemin[i][j].ville_suiv=-1;
    		}
    	}
     
    	/*initialisation du tableau Diti à -1*/
    	/*afin qu'il n'y ait pas d'erreur lors des recherches*/
    	for(i=0;i<20;i++)
    		Diti[i].num_ville=-1;
     
    	/*affichage du menu*/
        debut:
     
    	printf("\nville");
    	printf("\ndistance");
    	printf("\nparcours");
    	printf("\noptimise");
    	printf("\nexit");
    	printf("\nentrez votre choix : ");
     
    	/*traitement suivant le choix du menu*/
    	do
    	{
    		gets(choix);
    	}while((strcmp(choix,"ville"))!=0&&(strcmp(choix,"distance"))!=0
    	&&(strcmp(choix,"parcours"))!=0&&(strcmp(choix,"optimise"))!=0	
    	&&(strcmp(choix,"exit"))!=0);	
     
    	if(strcmp(choix,"ville")==0)
    	{
    		/*initialisation du pointeur et appel de la fonction ville*/
    		pville=ville[0];
    		nombre_de_ville=fonction_ville(nombre_de_ville,pville);
    	}
    	else if(strcmp(choix,"distance")==0)
    	{
    		/*initialisation du pointeur et appel de la fonction chemin*/
    		pchemin=chemin[0];
    		pville=ville[0];
    		fonction_distance(nombre_de_ville,pville,pchemin);
    	}
    	else if(strcmp(choix,"parcours")==0)
    	{
    		/*initialisation des pointeurs et appel de la fonction parcours*/
    		pville=ville[0];
    		pchemin=chemin[0];
    		fonction_parcours(nombre_de_ville,pville,pchemin);
    		printf("\n");
    	}
    	else if(strcmp(choix,"optimise")==0)
    	{
    		/*initialisation des pointeurs et appel de la fonction optimise*/
    		Citi=Diti;
    		pville=ville[0];
    		pchemin=chemin[0];
    		fonction_optimise(nombre_de_ville,pville,pchemin,Citi);
    		printf("\n");
    	}
    	else if(strcmp(choix,"exit")==0)
    		/*sortie du programme*/
    		exit('0');
     
    	/*retour au début de l'affichage du menu*/
        goto debut;
    	}

  7. #7
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    J'ai compilé ton code, j'ai une erreur de segmentation sur cette ligne :
    (à la fin de la fonction fonction_optimise)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	do
    	{
    		printf("\n\t%s",pville+(optimal[i]*LONGNOM));
    		i++;
    	}while(optimal[i]!=-1);
    le tableau optimal est rempli avec des valeurs extravagente ?
    ex : optimal[0] = 9447548
    J'ai pas suivie son remplissage.

Discussions similaires

  1. Printf qui affiche n'importe quoi
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 13/04/2012, 04h11
  2. mon programme affiche aucun resultat !
    Par domxaline dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/08/2009, 05h39
  3. Cherche à afficher n'importe quoi
    Par nahouto dans le forum MATLAB
    Réponses: 12
    Dernier message: 17/08/2009, 17h49
  4. Mon PC affiche n'importe quoi après un moment
    Par hardredman dans le forum Windows XP
    Réponses: 7
    Dernier message: 23/04/2008, 19h14
  5. Programme qui m'affiche n'importe quoi
    Par Gryzzly dans le forum C
    Réponses: 8
    Dernier message: 02/01/2006, 19h25

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