Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 23 utilisateurs en ligne, consultez le détail
Auteur Message
zephyroth
#0 Message posté le : 27-06-2007 à 19:12:59


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
aïe aïe aïe ...

Bon je vous explique :

Prenons l'image ppm suivante:

P3

#Commentaire

155 200

15

4 4

15

000 000 000 1500

000 0157 000 000

000 000 0157 000

15150 000 000 000



Il faut qu'elle soit stockée en mémoire de la manière suivante :

000 3 -----> 1500 1 -----> 000 1 -----> 0157 1 -----> 000 4 -----> 0157 1 -----> 000 1 -----> 15150 1 -----> 000 3 /

Problème j'arrive bien à créer la première cellule de la liste mais quoi que je fasse les autres cellules que je veux créer remplace la première ...

Voici 2 bouts de code, une correction serait la bienvenue surtout que je bloque depuis des heures !

La création de l'image

public Image (String s) throws IOException, FileNotFoundException, FinFichier

	{

		FileReader fr = new FileReader(s);

		BufferedReader f = new BufferedReader(fr);

		f.readLine(); // lit le P3

		f.readLine(); // lit le commentaire

				

		largeur = lireInt(f);

		hauteur = lireInt(f);

		profondeur = lireInt(f);

		nom = s;

		Liste Image = new Liste();

		int nbOcc = 1;

			

		pixel = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

		Image.ajouterFin(pixel);

		for(int i=0; i<hauteur; i++)

		{

			for(int j=0; j<largeur; j++)

			{

				tmp = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

				if(tmp.getRed() == pixel.getRed() && tmp.getGreen() == pixel.getGreen() && tmp.getBlue() == pixel.getBlue())

				{

					pixel = tmp;

					pixel.nbOcc++;

				}

				else

				{

					Image.ajouterFin(tmp);

					pixel = new Cellule(lireInt(f), lireInt(f),lireInt(f), nbOcc);

				}

			}

			System.out.print("-");

			

		}

		Terminal.sautDeLigne();

		Terminal.sautDeLigne();

		f.close();

	}


Et la méthode ajouterFin(Cellule):

// Ajoute une cellule en fin de liste

	public void ajouterFin (Cellule c)

	{

		if (tete == null){

			tete = c;

		}

		Cellule tmp = tete;

		while (tmp.suivant != null){

			tmp = tmp.suivant;

			tmp.suivant = c;

		}

	}
zephyroth
#1 Message posté le : 28-06-2007 à 01:00:09


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
j'ai réussi à coder quelque chose qui fonctionne presque (c'était pas terrible ce que j'avais fait toute @ l'heure!)

pixel = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

		pixel2  = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

		tmp = pixel2;

		for (int i=0; i<nbPix; i++)

		{ 

			while(tmp.getRed() == pixel.getRed() && tmp.getGreen() == pixel.getGreen() && tmp.getBlue() == pixel.getBlue())

			{

				nbOcc++;

				pixel2 = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

				tmp = pixel2;

			}

			Image.ajouterFin(pixel);

			pixel = tmp;

			pixel2 = new Cellule(lireInt(f), lireInt(f), lireInt(f), nbOcc);

			tmp = pixel2;

			Image.Afficher();

		}

		

		System.out.println(" ");

		f.close();


"Image.Afficher()" me permet de voir si la liste créée à l'ouverture est correcte ... mais çà bloque toujours à un moment donné ...
Pouvez-vous me dire s'il ya des erreurs ? des améliorations ? (sûrement)
jblecanard
#2 Message posté le : 28-06-2007 à 11:04:12


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4017
Je vois que


while (tmp.suivant != null){

	tmp = tmp.suivant;

	tmp.suivant = c;

}



Ne va pas du tout ! C'est normal que ta première cellule soit remplacée à chaque fois. Il faut écrire :


while (tmp.suivant != null){

			tmp = tmp.suivant;

}

tmp.suivant = c;



Pourquoi t'ennuies-tu avec ça ? L'API Java fournit tout ce qu'il faut pour gérer des listes et des collections. Faire soi même des listes pour apprendre, ok, mais pour développer un projet qui en a besoin, autant prendre celles de l'API.

-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
zephyroth
#3 Message posté le : 28-06-2007 à 11:14:04


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
Bah le truc c'est que je dois me débrouiller sans cette API justement ...
zephyroth
#4 Message posté le : 28-06-2007 à 11:18:58


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
je viens d'essayer la modif proposée ... çà n'avance pas, au contraire maintenant seul un élément est ajouté ensuite mon prog bloque !
jblecanard
#5 Message posté le : 28-06-2007 à 11:41:38


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4017
Oui j'ai oublié de préciser :


if (tete == null){

    tete = c;

}

else{

    Cellule tmp = tete;

    while (tmp.suivant != null){

        tmp = tmp.suivant;

    }

    tmp.suivant = c;

}



Il te faut un else sinon la tête va être ajoutée deux fois.

9a veut dire quoi que ton programme bloque ? Tu as une exception ? ça boucle à l'infini ?

--Message édité par jblecanard le 28-06-2007 à 11:43:31--


-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
zephyroth
#6 Message posté le : 28-06-2007 à 12:42:21


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
boucle à l'infini ...

merci du coup de main !
jblecanard
#7 Message posté le : 28-06-2007 à 16:46:00


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4017
Mon bout de code, sans le "else", boucle en effet à l'infini après l'insertion du premier élément. N'oublie donc pas de corriger suivant mon précédent post. Il va aussi boucler si tu insères deux fois de suite le même objet. Il faut donc insérer des COPIES des objets et pas les objets eux-mêmes.

En effet, si tu met deux fois l'objet "tete", il va l'insérer à la suite, puis boucler lorsque tu voudras encore ajouter un element, puisque tete.suivant va pointer sur tete. Ce ne sera pas le cas si tu insère une copie de tete, dont l'attribut "suivant" sera, lui , différent.

La solution la plus sécuritaire consiste à recréer l'objet inséré dans la méthode d'insertion. La seconde consiste à prendre soit d'insérer des objets différents.

Tu vois ce que je veux dire ?

--Message édité par jblecanard le 28-06-2007 à 16:51:50--


-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
zephyroth
#8 Message posté le : 28-06-2007 à 16:50:28


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
La même chose ...

En fait ce n'est pas ton code qui crée la boucle infini mais la lecture du fichier PPM par mon programme.

Par contre ton code remplace à chaque fois la tete de la liste et au final ma liste ne contient qu'un seul élément ... le dernier à être inséré avant la boucle infinie !

je ne m'en sortirais jamais ...
Pendragon
#9 Message posté le : 28-06-2007 à 20:02:19


Petit scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 26-02-2007
Nombre de messages : 22
Salut,

tu pourrais expliquer l'intérêt de cette représentation d'une image pas une liste chaînée ? parce que perso je comprends pas trop..

-------------------------------------
ex-lenounoursmignon
zephyroth
#10 Message posté le : 28-06-2007 à 20:18:00


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
Je suis en formation.

Et comme c'est casse-tête comme problème, çà m'apprend à être logique ... chose que j'ai du mal à faire
zephyroth
#11 Message posté le : 28-06-2007 à 20:22:25


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 13-07-2005
Nombre de messages : 206
je précise que je viens de réussir à l'instant à ouvrir une image avec cette représentation en mémoire, j'arrive aussi à l'enregistrer mais je m'y prends mal puisque lors de l'enregistrement ma liste se vide entièrement lors de l'écriture ...

Enfin je ne désespère pas ... il me reste aussi le pb du dernier pixel lors de l'enregistrement de l'image (il manque le dernier pixel de chaque image enregistrée) ...

Et après ... bah après on verra !