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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    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 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    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 : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    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 régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    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 confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Peut-tu nous montrer l'appel de la fonction en question ?

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    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 confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    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.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je devrais faire quoi selon toi ?

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je devrais faire quoi selon toi ?
    Verifier la declaration, l'initialisation et toutes fonction modifiant ce fameux tableau.

    Un suivi en debug serai le bienvenue.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Le problème c'est que je ne sais pas me servir du debugger de Visual Studio .
    Tu ne pourrais pas m'aider un peu pour parvenir à faire fonctionner ce programme ?

    (Tu es de villers st paul ?)

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Je suis désolé, je n'ai pas visual studio.

    Recherche dans developpez et google, doit y avoir une montagne d'article.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("\n\t%s",pville+(optimal[i]*LONGNOM));
    est ce que pville+(optimal[i]*LONGNOM) retourne bien une chaine de caractere ?
    Si il y a SEGMENT_FAULT, c'est bien parce que i a depasser la taille du tableau optimal, non ? Les données sont peut etre bien mais pas l'indice.


    (Oui, je suis bien de Villers Saint Paul de l'oise, toi aussi ?)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je suis encore très novice dans la programmation .
    Tu me suggérerais de faire quoi avec ce tableau ?

    (je suis de breuil le sec à côté de clermont mais je travaille à creil)

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Aprés une execution pas à pas le tableau optimal n'est jamais rempli, il contient donc des valeurs aléatoire.
    le bloc if où il est censé être rempli n'est jamais exécuté.

    il y a une erreur de segmentation car
    pville+(optimal[i]*LONGNOM)
    represente une adresse

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    il faudrait donc déjà remplacer pville+(optimal[i]*LONGNOM) par une valeur ?

    Je ne vois pas où se situe le bloc if qui doit remplir le tableau ?

  15. #15
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	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;
    	}
    Faudrait peut-être un peu chercher !

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    il faudrait donc déjà remplacer pville+(optimal[i]*LONGNOM) par une valeur ?
    Non, je pense qu'il faudrait surtout reprendre ce programme depuis le début calmement et essayer de programmer un peu plus proprement, parce que là c'est mal structuré et rempli d'erreur :
    • Dans l'initialisation de chemin, ce n'est pas {1.345} mais {1,345}
    • Il ne faut pas utiliser gets() qui est source de bug, à remplacer par fgets().
    • Il serait infiniment plus lisible de travailler avec de petites fonctions élémentaires plutôt qu'avec une fonction horriblement longue qui fait beaucoup trop de chose et qui est quasi illisible.
    • Les boucles à coup de goto, ce n'est pas super lisible et je ne suis même pas certain qu'ici il n'y ait pas d'effet de bord malencontreux.
    • Au premier passage dans la boucle, pchemin->ville_suiv vaut -1 (car intialisè à -1), tu passe donc dans le else et exécute Citi--. Tu te retrouves en dehors du tableau et tu déréférence, c'est un comportement indéterminé et donc une erreur. En outre Citi étant inférieur à Fin à partir de ce moment, tu vas sortir de la boucle sans avoir trouvé le chemin et ainsi de suite.


    Il y a probablement d'autres erreurs, mais c'est trop illisible pour que je relise en détail. En particulier je ne suis pas du tout rentrer dans l'algorithme, je ne saurais donc dire s'il est correct ou non.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Est ce que vous pourriez m'aider dans la méthode pour pouvoir créer ce code ?

    je suis des cours pour devenir développeur mais le problème c'est que je le fais en parallèle avec mon job . je ne suis donc pas à plein temps sur l'apprentissage du C .
    J'avais 10 devoirs à rendre pour pouvoir poursuivre mes cours et attaquer ensuite Unix .
    J'aimerais résoudre ce devoir avec votre aide et en essayant de comprendre un peu la méthode pour écrire le code .

    je sais très bien que ce n'est pas en rendant ce dernier devoir que je serais devenu développeur mais je crois que je devrais poursuivre mes cours et continuer en parallèle à apprendre le C .
    Pensez vous que j'ai raison d'agir ainsi ?

  18. #18
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Est ce que vous pourriez m'aider dans la méthode pour pouvoir créer ce code ?
    En très gros, la méthode c'est :
    • Commencer par poser calmement sur le papier ce que tu dois faire.
    • Découper ce problème en tâche élémentaires.
    • Définir les opérations à réaliser, leur enchaînement, etc.
    • Puis seulement ensuite tu peux développer les fonctions qui correspondent à ces tâches élémentaires, les tester unitairement et les assembler pour réaliser des tâches plus complexes en ainsi de suite jusqu'à obtenir le programme.
    • Tester l'ensemble.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Pour poser calmement sur le papier c'est déjà fait à l'aide de l'énoncé de l'exercice . On me donne quasiment l'algorithme en 3 phases :
    1-initialisation
    2-boucle effectuée jusqu'à la fin de la recherche
    3-Fiti est inférieur à Diti

    Découper le problème : Ce n'est pas grâce à l'algo que le problème est découpé en différentes tâches ?

    Que me suggères tu pour découper le problème en plusieurs tâches ?
    Que seraient selon toi les différentes fonctions à créer ?

    (PS: c'est vraiment pas évident d'apprendre un langage seul et éducatel n'aide pas vraiment beaucoup )

    Voilà le problème posé calmement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    L'objectif recherché est d'entrer 2 villes quelconques dans la liste des villes disponibles, et de déterminer
     le chemin le plus court reliant ces 2 villes en indiquant la distance totale à parcourir ainsi que la liste des villes à traverser
    Le principe du programme est une recherche arborescente dans le réseau défini, en se déplaçant de ville en ville à partir de la ville de départ et en essayant tous les chemins possibles partant de chaque ville .
    Lorsqu'on atteint la ville d'arrivée, on teste si la distance totale parcourue est meilleure que celle précédemment obtenue . On note au fur et à mesure la liste des villes traversées afin de ne jamais repassé 2 fois par la même étape .
    la recherche s'arrête lorsque tous les chemins partant de la ville de départ ont été explorés.
    On m'a donné ceci en aide :

    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
    /*Nom:
    Version: 1.0
    Date de création: 20/7/2009
    Description du travail: Développement d'application en C
                            Devoir No 10
    						Gestion d'itinéraires
    						Optimisation de la recherche d'un parcours*/
     
    #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);/*je ne maîtrise pas fgets .Il faudrait mettre plutôt fgets(stdout,choix) ? J'ai encore besoin de votre aide */
    	}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;
    	}
    La première chose que je ne comprends pas et que je n'arrive pas à coder :

    On utilise une nouvelle structure à 2 éléments : l'itinéraire. Chaque variable du type itinéraire contient 2 nombres :
    -numville : un numéro de ville
    -numsuiv : le numéro d'un des chemins partant de cette ville (utiliser l'instruction ''typedef' pour définir le type itinéraire : diti.

    On se sert de ce tableau comme d'une pile dont la base est la ville de départ . On empile dans le tableau les villes traversées au fur et à mesure qu'on s'éloigne de la ville de départ , et on dépile lorsqu'on recule pour essayer un autre chemin .
    La position de la ville courante dans le tableau est repéré par un pointeur : Citi.
    Je ne sais pas comment empiler et dépiler dans le tableau ? Je coince déjà là
    Est ce que j'utilise bien fgets que je ne sais pas encore maîtrisé ?

  20. #20
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Voilà le problème posé calmement :

    L'objectif recherché est d'entrer 2 villes quelconques dans la liste des villes disponibles, et de déterminer
    le chemin le plus court reliant ces 2 villes en indiquant la distance totale à parcourir ainsi que la liste des villes à traverser
    Le principe du programme est une recherche arborescente dans le réseau défini, en se déplaçant de ville en ville à partir de la ville de départ et en essayant tous les chemins possibles partant de chaque ville .
    Lorsqu'on atteint la ville d'arrivée, on teste si la distance totale parcourue est meilleure que celle précédemment obtenue . On note au fur et à mesure la liste des villes traversées afin de ne jamais repassé 2 fois par la même étape .
    la recherche s'arrête lorsque tous les chemins partant de la ville de départ ont été explorés.
    Ca reste encore une description très globale.


    Citation Envoyé par chicabonux Voir le message
    Je ne sais pas comment empiler et dépiler dans le tableau ? Je coince déjà là
    Pour utiliser ton tableau comme une pile, il fautdéjà déterminer où ce situe le haut de la pile. Le plus simple est probablement de conserver l'index du premier élément libre du tableau.

    Empiler un élément dans le tableau revient donc à mettre cet élément dans le tableau à cet index puis à incrémenter l'index.
    Dépiler une élément du tableau revient donc à décrémenter l'index puis à lire l'élément présent à cet index.

    Il faut bien entendu rajouter à cette description sommaire la gestion des piles vides, du débordement du tableau, etc.


    Citation Envoyé par chicabonux Voir le message
    Est ce que j'utilise bien fgets que je ne sais pas encore maîtrisé ?
    Qu'est ce que tu ne comprends pas exactement dans l'utilisation de fgets() ?
    Il suffit de fournir l'adresse où stocker la lecture, le nombre de caractères à lire et enfin le flux à utiliser (stdin pour lire sur l'entrée standard).

    La seule subtilité de fgets() est la gestion du caractère \n qui est présent dans les données lues si une ligne complète à pu être lue.

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