Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/04/2020, à 13:12

zephyre123

Erreur de segmentation trie par valeur minimal [RESOLU]

Bonjour,

J'essaye de trier un tableau dans l'ordre croissant.
Cependant j'ai le message d'erreur suivant erreur de segmentation et je n'ai aucune aide pour pouvoir la résoudre de la part du compilateur gcc.
Je vous mets le code ci dessous ;

	// On definis un nouveau tableau et on l'initialise
	int tableau2[5] = {-1, 2, -6, 10, 15};

	// On affiche le tableau initialisé
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	// On saute une ligne
	printf("\n");

	// On trie le tableau dans l'ordre croissant
	int minimum, indice_minimum;
	for(int i = 0; i < 5; i++)
	{
		// On sauvegarde la premiere valeur du tableau en disant que c'est le minimum
		minimum = tableau2[i];
		for(int j = i + 1; j < 5; j++)
		{
			if (tableau2[j] < minimum)
			{
				minimum = tableau2[j];
				indice_minimum = j;
			}

			int tmp;
			tmp = tableau2[i];
			tableau2[i] = tableau2[indice_minimum];
			tableau2[indice_minimum] = tmp;

		}

	}


	// On affiche le tableau une fois trié
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	printf("\n");

Dernière modification par zephyre123 (Le 11/04/2020, à 15:18)

Hors ligne

#2 Le 11/04/2020, à 13:32

pingouinux

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

Bonjour,
Si tu veux de l'aide, donne au moins un programme qui compile…

Hors ligne

#3 Le 11/04/2020, à 13:37

zephyre123

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

salut pinguouinux,

Ce programme compile mais il ne trie pas toutes les valeurs du tableau.
Je ne comprends pas pourquoi ?
Pouvez vous m'expliquer à croire que j'ai tapé un code je ne comprends même pas ce qu'il fait.

	// On definis un nouveau tableau et on l'initialise
	int tableau2[5] = {-1, 2, -6, 10, 15};

	// On affiche le tableau initialisé
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	// On saute une ligne
	printf("\n");

	// On trie le tableau dans l'ordre croissant
	int minimum, indice_minimum;
	for(int i = 0; i < 5; i++)
	{
		// On sauvegarde la premiere valeur du tableau en disant que c'est le minimum
		minimum = tableau2[i];

		for(int j = i + 1; j < 5; j++)
		{
			if (tableau2[j] < minimum)
			{
				minimum = tableau2[j];
				indice_minimum = j;
			}


		}

		int tmp;
		tmp = tableau2[i];
		tableau2[i] = tableau2[indice_minimum];
		tableau2[indice_minimum] = tmp;
	}


	// On affiche le tableau une fois trié
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	printf("\n");

	return(0);

Hors ligne

#4 Le 11/04/2020, à 14:06

kamaris

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

Que se passe-t-il pour indice_minimum si on ne rentre pas dans le test de la boucle en j ? wink

Hors ligne

#5 Le 11/04/2020, à 14:41

zephyre123

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

Kamaris je ne comprends pas ta question on est obligé de rentrer dans la boucle d'indice j.
Si on ne rentre pas dans la boucle d'indice j alors la valeur d'indice minimum est non définis.
je vais initialiser indice_minimum dans mon code je vais voir ce que ça va faire.

Dernière modification par zephyre123 (Le 11/04/2020, à 14:42)

Hors ligne

#6 Le 11/04/2020, à 14:48

zephyre123

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

j'ai initialiser la valeur de indice minimum dans ma boucle i voir le code ci dessous :

	// On definis un nouveau tableau et on l'initialise
	int tableau2[5] = {-1, 2, -6, 10, 15};

	// On affiche le tableau initialisé
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	// On saute une ligne
	printf("\n");

	// On trie le tableau dans l'ordre croissant
	int minimum, indice_minimum;
	for(int i = 0; i < 5; i++)
	{
		// On sauvegarde la premiere valeur du tableau en disant que c'est le minimum
		minimum = tableau2[i];
		indice_minimum = i;

		for(int j = i + 1; j < 5; j++)
		{
			if (tableau2[j] < minimum)
			{
				minimum = tableau2[j];
				indice_minimum = j;
			}
		}

		int tmp;
		tmp = tableau2[i];
		tableau2[i] = tableau2[indice_minimum];
		tableau2[indice_minimum] = tmp;
	}


	// On affiche le tableau une fois trié
	for(int i = 0; i < 5; i++)
		printf("%d ", tableau2[i]);

	printf("\n");

ça fonctionne maintenant le tableau est bien trié mais je ne comprends pas pourquoi es ce que tu as une explication Kamaris car pour moi on est obligé de rentrer dans la boucle d'indice j
et indice_minimum est initialisé à ce moment.

Hors ligne

#7 Le 11/04/2020, à 15:17

zephyre123

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

Kamaris j'ai compris si on initialise pas la valeur de indice minimal dans la boucle i alors la valeur de indice minimal est aléatoire et on ne sait pas ou on commence à rechercher le minimum dans la boucle j.
J'ai compris et j'ai trouvé les explications tout seul.
Merci encore Kamaris.

Hors ligne

#8 Le 11/04/2020, à 16:07

kamaris

Re : Erreur de segmentation trie par valeur minimal [RESOLU]

Non, ici indice_minimum n'aura pas une valeur aléatoire, car on rentre dans le test de la boucle en j pour i = 0, puis à nouveau pour i = 1, i = 2, et après on n'y rentre plus.
Donc indice_minimum garde ensuite sa dernière valeur prise : 2.
Pour remédier à ça, il faut effectivement initialiser indice_minimum en même temps qu'on initialise minimum, avant la boucle en j.
Pour y voir clair dans tout ça, tu peux tracer la valeur de tes variables au cours de l'exécution du programme, avec un printf dans la boucle en j.

Remarque : si on n'était pas rentré dans le test pour i = 0, alors indice_minimum aurait pu avoir une valeur aléatoire, à condition que ton code se trouve dans une fonction (autre que la fonction principale).
Si le code se trouve directement dans main(), alors indice_minimum est initialisé à 0.

Hors ligne