[C] programme a effet de bord / liste chainée

Résolu/Fermé
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 - 28 déc. 2009 à 11:37
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 - 29 déc. 2009 à 00:31
Bonjour,

je suis coincée à cause d'un programme C qui ne veut pas fonctionner. J'ai essayé plusieurs version mais j'ai toujours le même problème. Je vous pose le décor :
J'ai des individus, représentés par des liste chainée de bits.
Je dois croiser ces individus selon une probabilité pcroise. (je prends un chiffre au hazard entre 1 et 10, s'il est plus grand que pcroise je n'échange pas les bits, s'il est plus petit j'échange les bits et je passe au suivant de ma liste chainée)
mon problème :
Mes deux individus en entrée ne sont pas modifiés.
plus exactement, le programme n'entre jamais dans mon "if"
(je ne peux pas vous filer mon main, il utilise une ribambelle de fonctions dont le code serait trop long à donner ici)

//- Définition de la structure individu (pas de problème ici, je l'utilise dans 5 ou 6 autres fonctions :p)

typedef struct cell
{ bit valeur;
struct cell* suivant;
} Cellule;
typedef Cellule* indiv;

//- Fonction de croisement de population

void croiser(indiv x, indiv y, int pCroise)
{
int longIndiv=length(x);
int k;
indiv tx=x;
indiv ty=y;
for (k=0;k<longIndiv;k++)
{
float r;
r=(float)(rand() / (float)RAND_MAX * 1);
printf("%f \n",r);
if (r<pCroise)
{
printf("je croise \n");
bit t;
t=tx->valeur;
tx->valeur=ty->valeur;
ty->valeur=t;
}
tx=tx->suivant;
ty=ty->suivant;
}
}

6 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 déc. 2009 à 12:15
Je ne lis pas vraiment le code car il n'est pas indenté, mais une fonction comme celle-ci:
void croiser(indiv x, indiv y, int pCroise)
doit t'interpeller car c'est une fonction, qui de toute évidence, n'aura aucun résultat (sauf sur des variables tordues comme des variables globales ou statiques).
Bonne réflexion.
1
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 15
28 déc. 2009 à 20:07
pas besoin de rendre quelque chose puisque je veux agir par effet de bord (modifier, à l'intérieur du programme, les deux variables entrées). Je n'ai donc pas une variable à rendre mais deux.

(dsl le code est indenté dans eclipse mais le copier/coller l'a modifié ^^")
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 déc. 2009 à 21:32
Effectivement, je n'ai pas fait attention au 'typedef' sur un pointeur (personnellement je ne le fais jamais car cela cache quelquechose d'important).
Somme toute, j'ai plusieurs remarques:
- je ne vois pas l'intérêt de passer par tx et ty,
- la fonction 'rand' renvoie un entier compris entre 0 et RAND_MAX, alors si tu divises par RAND_MAX, je te laisse conclure,
- 'rand' n'est pas initialisé, alors tu auras toujours la même série de valeurs,
- je veux agir par effet de bord, je ne suis pas d'accord avec cette expression, il s'agit simplement d'un passage de paramètres par valeur et comme cette valeur est une adresse, on peut modifier la valeur pointée par cette adresse,
- quant à l'indentation, pour la conserver, il existe des balises 'codes', sises après celles des 'gras', 'italique' et 'souligné', qui permettent de la conserver.
Bonne continuation.
0
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 15
28 déc. 2009 à 21:44
-les tx et ty permettent de ne pas rendre une fonction nulle à la fin. Lorsque j'ai parcouru ma liste bit par bit, j'arrive au dernier élément qui pointe sur NULL
-la fonction rand est initialisée dans le main (croisée est un sous programme d'un programme croiser_pop qui permet de croiser une liste d'individus)
-ma fonction random rend bien un float (j'ai testé en faisant le printf après le rand)

et pour l'indentation je l'aurais bien faite si je pouvais modifier le message mais il me semble que c'est impossible de le modifier à présent.
du coup (en effet c'est plus lisible comme ça) :

//- Définition du type Bit

typedef unsigned char bit;

//- Définition de la structure individu

typedef struct cell
	{ bit valeur;
	struct cell* suivant;
	} Cellule;
typedef Cellule* indiv;

//- Fonction de croisement de population 

void croiser(indiv x, indiv y, int pCroise)
{
	int longIndiv=length(x);
	int k;
	indiv tx=x;
	indiv ty=y;
	for (k=0;k<longIndiv;k++)
	{
		float r;
		r=(float)(rand() / (float)RAND_MAX * 1);
		printf("%f \n",r);
		if (r < pCroise)
		{
			printf("je croise");
			bit t;
			t=tx->valeur;
			tx->valeur=ty->valeur;
			ty->valeur=t;
		}
		tx=tx->suivant;
		ty=ty->suivant;
	}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 déc. 2009 à 21:55
Ah ben c'est quand même plus lisible, et là on voit bien l'utilité du 'tx' et ty'.
ma fonction random rend bien un float, ça c'est sûr mais un float de valeur maxi RAND_MAX divisé par RAND_MAX (la multiplication par 1 ne change rien !) ne sera jamais supérieur à 1, en conséquence, tout 'int' (sauf 0) sera supérieur.
Bonne continuation.
0
Laraannain Messages postés 109 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 3 février 2011 15
29 déc. 2009 à 00:31
yep, ça fonctionne ^^

merci beaucoup :)
0