Avatar billede jespersahner Nybegynder
23. november 2004 - 20:56 Der er 25 kommentarer og
1 løsning

Flere referencer til variabler af simpel type

Når man arbejder med objekter, kan man jo have flere referencer til samme objekt, f.eks.:
Point p,q;
p=new Point();
q=p;
p.x=5;
System.out.println(p.x+" "+q.x);

q og p peger på samme objekt, hvorfor q.x har samme værdi som p.x.

Er det samme muligt for variabler af simple typer?

Baggrund:
I visse sammenhænge kan man have glæde af at "mappe" en rækker variabler til f.eks. en array-struktur a la:
int[] a={i,j,k};
a[0]=5;

Dette vil imidlertid ikke ændre indholdet af 'i', da 'a' peger på et andet sted i memory.

Men kan man alligevel oprette en array-struktur, der peger på en række eksisterende variabler, således at ændringer i array-elementerne "smitter af" på de andre variabler?
Avatar billede mikkelbm Nybegynder
23. november 2004 - 20:59 #1
Det kan du ikke med simple datatyper
Avatar billede mikkelbm Nybegynder
23. november 2004 - 21:00 #2
Så skal du bruge wrapperklasserne til dem: Integer, Double, Float osv...
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:01 #3
->mikkelbm: I der her tilfælde ønsker jeg af performance-hensyn kun at arbejde med simple typer
Avatar billede mikkelbm Nybegynder
23. november 2004 - 21:01 #4
Så tvivler jeg på det kan lade sig gøre. Jeg ved i hvert fald ikke hvordan.
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:04 #5
->mikkelbm: Kan man ikke vha. f.eks. reflection eller lign. "få oplyst" den fysiske memory-adresse og så den vej rundt opnå effekten ved at lave flere variabler pege på samme fysiske adresse?
Avatar billede mikkelbm Nybegynder
23. november 2004 - 21:06 #6
Det ved jeg ikke om man kan i Java. Desværre.
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:09 #7
->mikkelbm: Fair nok :-)
Avatar billede arne_v Ekspert
23. november 2004 - 21:30 #8
Det kan ikke lade sig gøre.

Et array vil blive gemt i en klump sammenhængende memory.

De enkelte variable vil næppe ligge i en klump sammenhængende memory.

Altså kan det ikke lade sig gøre at betragte dem som et array uanset hvad
man gør.
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:33 #9
->arne_v: Er der ikke en "work-around" via reflection eller lign.?
Avatar billede arne_v Ekspert
23. november 2004 - 21:37 #10
Jeg mener ikke engang at du kan få en "adresse".

Men selvom du kunne det, så kunne du ikke få noget drysset tilfældigt ud i memory
til at kunne opfattes som et kontinuert array.

Medmindre du kopierer data.
Avatar billede arne_v Ekspert
23. november 2004 - 21:39 #11
Hvis i er på adresse 1000, j på 1600 og k på 1640, så kan du lade a pege
på adresse 1000, men så bliver a[0] 1000, a[1] bliver 1004 og a[2] bliver 1008.

Det hænger ikke sammen.
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:53 #12
->arne_v: Tænker lige højt..

I mit Point-eksempel er p.x og p.q begge simple typer, og de peger på samme adresse, da p og q peger på samme objekt. Det kan altså lade sig gøre her uden at man har brugt wrappere eller lign.
Avatar billede jespersahner Nybegynder
23. november 2004 - 21:55 #13
->arne_v: Mente selvfølgelig p.x og q.x
Avatar billede arne_v Ekspert
23. november 2004 - 22:11 #14
Ja.

Men det er også en helt anden problem stilling.

Fordi p og q er referencer (adresser) og peger på det samme, så må
p.x og q.x nødvendigvis også pege på det samme.
Avatar billede simonvalter Praktikant
23. november 2004 - 22:18 #15
bare en lille kommentar :)
interessante spørgsmål du stiller og jeg har set at du i flere af dem lægger vægt på performance. Nu ved jeg selvfølgelig ikke hvad det er du prøver og lave og hvor kritisk performance er for systemet.. men har du prøvet og gå den direkte vej uden at optimere og se hvordan det klarer sig?
Nu vil du hellere bruge primitive typer frem for et wrapper objekt... men har ikke noget imod at benytte reflection (hvis det da var muligt) som jeg vil tro ville være endnu langsommere.
Jeg har godt nok ikke skullet lave programmer hvor alt skal være optimeret men har læst flere bøger om emnet og den første regel har altid været at man først skal have et godt design.. derefter kan man kigge på om der er dele der kan optimeres.
Avatar billede jespersahner Nybegynder
23. november 2004 - 22:25 #16
->arne_v: Ja måske.

I SAS, som jeg er vant til at programmere i, er arrays ikke selvstændige variabler i gængs forstand men "masker"/"mappings" over allerede eksisterende variabler. Man kan f.eks. skrive:

array a(3) (i,j,k);
a(1)=5;

- herefter vil 'i' være sat til 5.

Det er den samme funktionalitet jeg er på udkig efter her. En sådan konstruktion kan i mange tilfælde give en smidig kode, idet man f.eks. nemt og kompakt kan loop'e over arrays og dermed tilgå de mange enkelte variabler på en kompakt måde.
Avatar billede arne_v Ekspert
23. november 2004 - 22:30 #17
I Java ville du lave et Array eller en ArrayList af de wrappede objekter.

SAS er et fjerde generations sprog. Java er et tredie generations sprog.

(også selvom Java er meget nyere end SAS)

SAS er simpelthen på et højere niveau

(til gengæld tror jeg nok at Java koden skal køre hurtigere end den tilsvarende
SAS kode)

Jeg er da iøvrigt ikke sikker på at man kunne det der da jeg sidst arbejdede
med SAS, men det var også engang sidst i 80'erne.
Avatar billede jespersahner Nybegynder
23. november 2004 - 22:38 #18
->simonvalter: Min interesse her er behandling af data, som man læser ind fra eksterne filer. Det er sandt, at reflection er langsomt, men jeg tænker nok sådan, at det ikke gør noget, at man inden indlæsningen begynder bruger en del krudt på at "køre alle kanoner i stilling" så at sige. Når først dette er sket, bør indlæsningen kunne ske med god performance.

Jeg har i dialog med Arne testet performance omkring simple typer vs. wrapper-objekter og er lidt bange for sidstnævnte.
Avatar billede arne_v Ekspert
23. november 2004 - 22:53 #19
Jo men som jeg også skrev i det spørgsmål: betyder det reelt noget for hele applikationens
performance ?

Og selv om det gør er det så billigere at fintune koden end at købe en 3GHz PC mere ?
Avatar billede jespersahner Nybegynder
23. november 2004 - 23:02 #20
->arne_v og simonvalter: En noget tung work-around på nogle af mine problemstillinger er at lskrive et Java-program, der skriver et andet Java-program, som derefter udføres.

Dette er i øvrigt nogenlunde samme tankegang bag macro-sprog i SAS. Ved visse meget tunge anvendelser er macro-SAS endda utilstrækkeligt, og det kan være nødvendigt selv at skrive et SAS-program, der skriver et andet SAS-program, som derefter udføres.

Men nok lidt vidt at gå her i første omgang, når det bestemt ikke kan afvises, at jeg ikke har helt styr på mit design med mit indtil videre begrænsede Java-kendskab :-)
Avatar billede jespersahner Nybegynder
23. november 2004 - 23:47 #21
Giver reflection eller lign. mulighed for at få oplyst den fysiske memory-adresse for en given variabel, og kan man videre sætte en variabel til at pege på en bestemt fysisk adresse?
Avatar billede arne_v Ekspert
24. november 2004 - 07:23 #22
Nej pointer funktionaliteten er bevidst fravalgt i java. Det giver mindre risiko
for fejl. Det undgår implementation specifikek problem stillinger.

Og du kan faktisk ikke mere med reflection end med bormal Java. Eneste forskel
er at med reflection kan du bruge nformation som først er tilgængelige på
runtime fremfor på compile time.
Avatar billede jespersahner Nybegynder
24. november 2004 - 12:12 #23
->arne_v: Måske en slags work-around..

Arrays er altid objekter, også arrays af simple typer. I stedet for at anvende en variabel af simpel type, kan man anvende arrays af dimension 1 (!), jf.:

int[] a,b;
a=new int[1];
b=a;
a[0]=5;
System.out.println(a[0]+" "+b[0]);

- giver flg. output:
5 5

Jeg ved ikke, om dette principielt er anderledes end at anvende en wrapper, men jeg gætter på at performance er bedre ved denne metode end ved et wrapper-objekt.
Avatar billede arne_v Ekspert
24. november 2004 - 20:07 #24
Du kan godt bruge arrays med 1 element.

Jeg mener ikke at det er en naturlov at de er hurtigere end de boxede simple
data typer.

Men vi har da set nogle eksempler hvor de var.
Avatar billede jespersahner Nybegynder
28. november 2004 - 22:01 #25
->arne_v: Smid lige et svar, så vi kan lukke dette spm.
Avatar billede arne_v Ekspert
28. november 2004 - 22:04 #26
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester