Gå til innhold

Lesing av Double endrer utfall av program


Anbefalte innlegg

Jeg holdt på å rydde litt i koden på et lite program jeg har lagd, men oppdaget noe besynderlig.

 

Programmet leser en bildefil, reduserer antall farger og skriver en png-fil med resultatet. Dette skal være en deterministisk prosess.

 

I prosessen brukes denne klassen (ligger under public class Segmenter i Segmenter.java):

class MyGroup<T> extends HashSet<T>{

public Double firstColor = null;

public int c;

}

firstColor er ikke brukt lengre, så jeg fjernet den fra koden. Men hver gang jeg gjorde det fikk jeg annerledes resultat fra programmet. Jeg forenklet så mye jeg kunne og står igjen med denne linjen inne i programmet:

Double wtf = set.firstColor;

Hvordan kan det påvirke resultatet om denne linjen står der eller ikke? Verken wtf eller firstColor brukes noe annet sted.

 

Filer er vedlagt, prøv gjerne å reproduser (java Segmenter in.jpg 4).

 

Min java:

richard@r2:~/workspace/Segmenter$ java -version

java version "1.6.0_07"

Java SE Runtime Environment (build 1.6.0_07-b06)

Java HotSpot Client VM (build 10.0-b23, mixed mode, sharing)

Segmenter.java.txt

post-27993-1236194538_thumb.jpg

post-27993-1236194547_thumb.png

post-27993-1236194553_thumb.png

Lenke til kommentar
Videoannonse
Annonse

Klarer ikke reprodusere det:

 

pgd@pia-desktop:~/skole/inf237/Test$ diff v1.png-16.png v1.png-162.png
pgd@pia-desktop:~/skole/inf237/Test$ java -version
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
pgd@pia-desktop:~/skole/inf237/Test$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04.2"
pgd@pia-desktop:~/skole/inf237/Test$

To filer laget etterhverandre med og uten din Double wtf laget identisk bilde (som vist av diff).

 

Men jeg vil anbefale deg å kutte ut ting som dette:

class MyGroup<T> extends HashSet<T> {
public Double firstColor = null;

public int c;
}

Instead, hvis du må ...

class MyGroup<T> implements Set<T> {
public Double firstColor = null;

public int c;

private final Set<T> set = new HashSet<T>();

  /// implementer alle metodene som trengs, og redirect kall til set!
}

Endret av pgdx
Lenke til kommentar
Klarer ikke reprodusere det:

 

Nå lastet jeg ned kodefilen herfra og prøvde på en annen maskin, og jeg får ikke identisk bilde med og uten "Double wtf":

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ rm *.class && javac *.java && java Segmenter in.jpg 16
Note: Segmenter.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Colors: 734
Colors: 16
Unchanged 0
Saved in.jpg-16.png

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ notepad Segmenter.java

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ mv in.jpg-16.png med.png

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ rm *.class && javac *.java && java Segmenter in.jpg 16
Note: Segmenter.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Colors: 734
Colors: 16
Unchanged 1
Saved in.jpg-16.png

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ ls -l
total 309
-rwx------+ 1 Trond Ingen    337 Mar  5 08:17 MyGroup.class
-rwx------+ 1 Trond Ingen    629 Mar  5 08:17 Segmenter$1.class
-rwx------+ 1 Trond Ingen   5329 Mar  5 08:17 Segmenter.class
-rwx------+ 1 Trond Ingen   7550 Mar  5 08:17 Segmenter.java
-rwx------+ 1 Trond Ingen 129367 Mar  5 08:12 in.jpg
-rwx------+ 1 Trond Ingen  73409 Mar  5 08:17 in.jpg-16.png
-rwx------+ 1 Trond Ingen  87945 Mar  5 08:16 med.png

Trond@YA001 /cygdrive/c/Documents and Settings/Trond/Mine dokumenter/seg
$ java -version
java version "1.5.0_10"
Java(tm) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(tm) Client VM (build 1.5.0_10-b03, mixed mode, sharing)

Lenke til kommentar

Naa har jeg proevd koden, og jeg faar ikke alltid identisk bilde uten aa endre koden (jeg kjoerer samme kode flere ganger etter hverandre). Double wtf-endringene er da etter min mening bare en tilfeldighet.

 

Hva betyr dette? Jeg lette etter en tilfeldighetsfaktor (f.eks. random funksjon), men fant ingenting ved foerste oeyekast.

 

Forresten ser jeg flere ganger hvor Double == Double blir brukt. Naa vet jeg ikke noeyaktig hva man vil sammenligne, men jeg ser en potensiell feil i kode:

Double a = 1.2;
Double b = 1.2;
System.out.println(a == b); // Blir false
System.out.println(a.equals(b); // Blir true

Lenke til kommentar
Naa har jeg proevd koden, og jeg faar ikke alltid identisk bilde uten aa endre koden (jeg kjoerer samme kode flere ganger etter hverandre). Double wtf-endringene er da etter min mening bare en tilfeldighet.

 

Hva betyr dette? Jeg lette etter en tilfeldighetsfaktor (f.eks. random funksjon), men fant ingenting ved foerste oeyekast.

 

Forresten ser jeg flere ganger hvor Double == Double blir brukt. Naa vet jeg ikke noeyaktig hva man vil sammenligne, men jeg ser en potensiell feil i kode:

Double a = 1.2;
Double b = 1.2;
System.out.println(a == b); // Blir false
System.out.println(a.equals(b); // Blir true

Takk for svar. Det er mulig du er inne på noe. Jeg må ha tenkt litt for mye auto-unboxing av Double ;)

 

Skal teste litt i kveld.

Endret av drahcir
Lenke til kommentar

Tror jeg fant løsningen. Oppgraderte javac fra 1.6.0_07 til 1.6.0_12 - uten noen effekt. Endret så java tilsvarende. Feilen er borte! Har endret fram og tilbake noen ganger og det ser helt klart ut som en bug som er blitt rettet en gang mellom 1.6.0_07 og 1.6..0_12.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...