drahcir Skrevet 4. mars 2009 Skrevet 4. mars 2009 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
pgdx Skrevet 4. mars 2009 Skrevet 4. mars 2009 (endret) 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 4. mars 2009 av pgdx
drahcir Skrevet 5. mars 2009 Forfatter Skrevet 5. mars 2009 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)
Patton Skrevet 5. mars 2009 Skrevet 5. mars 2009 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
drahcir Skrevet 5. mars 2009 Forfatter Skrevet 5. mars 2009 (endret) 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 5. mars 2009 av drahcir
what_no2000 Skrevet 5. mars 2009 Skrevet 5. mars 2009 Denne linken kan være nyttig lesing ift. double i Java: http://firstclassthoughts.co.uk/java/traps...uble_traps.html. Se f.eks på problemstillingene rundt å sjekke likhet mellom to double.
nirolo Skrevet 5. mars 2009 Skrevet 5. mars 2009 Hmm. Jeg får samme oppførsel som trådstarter - mystisk. Skjønner ikke hvilken effekt wtf-variabelen skal kunne ha
drahcir Skrevet 5. mars 2009 Forfatter Skrevet 5. mars 2009 Hmm. Jeg får samme oppførsel som trådstarter - mystisk. Skjønner ikke hvilken effekt wtf-variabelen skal kunne ha Nei, jeg har fortsatt ikke funnet årsaken.
nirolo Skrevet 5. mars 2009 Skrevet 5. mars 2009 Det ser ikke ut som wtf-variabelen egentlig har noe å si. Dersom du bytter ut linjen med set.firstColor = null; så får du samme feil. Ganske snodig siden du på linjen over har lagd et objekt hvor firstColor er null.
nirolo Skrevet 5. mars 2009 Skrevet 5. mars 2009 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.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå