Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • Kop├şrovanie referen─Źnej premennej.

Kop├şrovanie referen─Źnej premennej.

C,C++,C#

Moderátori: psichac, Moderátori

Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Radus » 20 Sep 2018, 21:37

Zdrav├şm, p├ínov program├ítorov.
Viete mi pros├şm poradi┼ą ako rie┼íite kop├şrovanie referen─Źnej premennej? Majme napr├şklad ┼ítrukt├║ru ┬┤a┬┤ a z nej potrebujem spravi┼ą k├│piu ┬┤b┬┤, ale samozrejme ke─Ć nap├ş┼íeme b=a a v b zmen├şme nie─Źo, zmen├ş sa to aj v a, lebo sme len skop├şrovali referencie, ve─Ć to pozn├íme...
Máte nato nejakú fintu? Či v C, C# alebo VB.
Narazil som len sp├┤sob s pou┼żit├şm serializ├ície a pomocou streamu znovuvytvoren├şm objektu, ale to sa mi zd├í ako ┼íkraba┼ą si hlavu dookola...
Vo VB som to chcel oklama┼ą pomocou takejto funkcie:
K├│d: Vybra┼ą v┼íetko
    Private Function copy_struct(ByVal _a As a_struct) As a_struct
        copy_struct = _a
    End Function

...ale neoklamal som :) Aj ke─Ć je tam ozna─Źenie ┼że funkcii sa pred├íva len hodnota (ByVal)...st├íle je to referencia a objekt ostane jeden...
Existuje na to nejak├ę elegantn├ę rie┼íenie? (Prejs┼ą ┼ítrukt├║ru pomocov cyklov to ru─Źne kop├şrova┼ą mi pros├şm nera─Ćte...)
Radus
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 925
Vek: 36.78
Zalo┼żen├Ż: 27.10.2009
Bydlisko: Prešov
Karma: 6

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod peterple » 20 Sep 2018, 22:52

Neexistuje.

Ak chce┼í kop├şrova┼ą ┼ítrukt├║ru, objekt ktor├Ż si si vymyslel s├ím tak si to mus├ş┼í spravi┼ą s├ím, lebo len ty rozumie┼í ─Źo je ─Źo a ako to treba robi┼ą. A to je to ─Źo robi┼ą nechce┼í, lebo je to pod─ża teba ru─Źne. Ale inak sa to ned├í.

V objektov├Żch jazykoch m├í ten prapredok v┼íetk├Żch objektov aj funkciu clone (JAVA) alebo Clone (C#) ale rob├ş to ─Źasto hl├║posti lebo prd rozumie tomu ako s├║ natrepan├ę data v objekte.
S├║ situ├ície ke─Ć objekt mus├ş by┼ą kop├şrovateln├Ż, alebo odlo┼żiteln├Ż. V takom pr├şpade jeho autor za sp├┤sob kop├şrovania alebo s├ęrializ├íciu ru─Ź├ş. A t├║ n├ímahu s vytvoren├şm t├Żch funkci├ş si d├í.

Pre─Źo to tak je? Tu treba vidie┼ą hlboko do memory mana┼żmentu konkr├ętneho jazyka. A pritom to zah┼Ľ┼ła aj znalos┼ą danej hw architekt├║ry.
Nejak├ę ─Ź├ştanie k tomu
https://stackoverflow.com/questions/78536/deep-cloning-objects

a lep┼íie n├ízornej┼íie nazna─Źen├ę probl├ęmy pre JAVA
https://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java

Z├íver - ak objekt m├í mo┼żnos┼ą serializ├ície tak je to najpohodlnej┼íia met├│da ako ho skop├şrova┼ą. Na druhej strane je najmenej efekt├şvna.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1775
Vek: 52.03
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 48

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Radus » 20 Sep 2018, 23:13

─Äakujem za odpove─Ć, aspo┼ł to m├ím polopate :)
Nie ┼że by som to pomocou cyklov nechcel robi┼ą, toti┼ż to ja to tak robim teraz, lebo sa mi to zd├í trochu jednoch┼íie ako serializ├ícia (nemysl├şm d─║┼żkou k├│du ale programov├ęho za┼ąa┼żenia)...tak len to─żko.
Chcel som len vedie┼ą ─Źi neexistuje nejak├í jednoduch┼íia cesta...
─Äakujem za vysvetlenie.
R.
Radus
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 925
Vek: 36.78
Zalo┼żen├Ż: 27.10.2009
Bydlisko: Prešov
Karma: 6

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod martin knocik » 21 Sep 2018, 07:43

Existuje relativne jednoducha cesta pomocoua pointerov. 2 pointery odkazujuce na jednu a tu istu štrukturu.
http://mkbci.com

FEL UNIZA 2015, Ing.

─żudstvo je v├şrus ktor├Ż napadol Zem

nerobme si ┼ąa┼żk├║ hlavu z debilov ─Źo n├ím ani po ─Źlenky nesiahaj├║, bu─Ćme radi ┼że my da─Źo dok├í┼żeme a smejme sa im ak├ş s├║ sprost├ş
martin knocik
Zasl├║┼żil├Ż ─Źlen
Zasl├║┼żil├Ż ─Źlen
Pr├şspevky: 1459
Vek: 27.79
Zalo┼żen├Ż: 23.01.2008
Bydlisko: Tren─Źianska Turn├í
Karma: 6

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod pocitujlasku » 21 Sep 2018, 08:25

martin knocik: celkom ma to zaujima, len si to akosi neviem predstavit. Ako pomocou 2 pointerov skopirujes data z jednej premennej do druhej bez toho, aby si ich rucne mapovat a nastavoval. On chce urobit kopiu s tym, aby boli nezavisle.
Intel, Nvidia, Ubuntu, Firefox, Asus, Nissan, Jelinek 52%, Metal
---------------------------------------------------------------------------------------------
Jedn├şm z nejv─Ťt┼í├şch projev┼» ned┼»v─Ťry v Boha je hromosvod na kostele.
pocitujlasku
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 4298
Vek: 35.76
Zalo┼żen├Ż: 20.07.2007
Bydlisko: Poprad
Karma: 17

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Radus » 21 Sep 2018, 08:51

To je pr├íve to ─Źo sa stane ke─Ć nap├ş┼íe┼í "b" ┼ítrukt├║ra = "a" ┼ítrukt├║ra, lebo pri referen─Źn├Żch typoch je meno ┼ítrukt├║ry u┼ż odkaz na referenciu nie na hodnotu, ─Źi┼że nie─Źo ako pointer. (Plat├ş to aj pre meno po─ża). Tak┼że sa presne to stane - m├í┼í 2 odkazy na jednu ┼ítrukt├║ru...
Rozm├Ż┼í─żal som ─Źi e┼íte nevytvori┼ą univerz├ílnu rekurz├şvnu funkciu na kop├şrovanie ┼ítrukt├║ru...
Radus
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 925
Vek: 36.78
Zalo┼żen├Ż: 27.10.2009
Bydlisko: Prešov
Karma: 6

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Marekodzapadu » 21 Sep 2018, 10:04

Odporucam si precitat literaturu k danemu jazyku, lebo co jazyk to ina implementacia :). Existuju dva typy, shallow copy (plytke) a deep copy (hlboke).

Napr pre C:
K├│d: Vybra┼ą v┼íetko

/* deep copy - static */
typedef struct _str_t {
    char value [40];
}str_t;

...
str_t * mojaDynamickaStruktura_A = malloc(sizeof(str_t)); /* Alokujeme si dynamicku strukturu A */
str_t * mojaDynamickaStruktura_B = malloc(sizeof(str_t)); /* Alokujeme si dynamicku strukturu B */

memcpy(mojaDynamickaStruktura_A, "heslo", 5); /* nakopiruje retazec "heslo" do struktury */
memcpy(mojaDynamickaStruktura_B, mojaDynamickaStruktura_A, sizeof(mojaDynamickaStruktura_A); /* skopirujme strukturu A do struktury B*/
/* obe struktury budu identicke, ale kazda ma svoju vlastnu pamat */
   
/* #shallow copy - dynamic */   
typedef struct _buf_t {
    char *pvalue;
    char id;
}buf_t;

...
str_t * mojaDynamickaStruktura_X = malloc(sizeof(buf_t)); /* Alokujeme si dynamicku strukturu X */
str_t * mojaDynamickaStruktura_Y = malloc(sizeof(buf_t)); /* Alokujeme si dynamicku strukturu Y*/
mojaDynamickaStruktura_Y.pvalue = malloc(40); /* alokujeme pamat pre pointe pvalue */
memcpy(mojaDynamickaStruktura_Y.pvalue, "heslo", 5); /* nakopiruje retazec "heslo" do bufferu na ktory ukazuje pvalue */ 
 
memcpy(mojaDynamickaStruktura_B, mojaDynamickaStruktura_A, sizeof(mojaDynamickaStruktura_A); /* skopirujme strukturu A do struktury B*/
/* kam ukazuje pValue v mojaDynamickaStruktura_B.pvalue ??? */
   
   
/* #teraz plny deep copy */   
str_t * mojaDynamickaStruktura_K = malloc(sizeof(buf_t)); /* Alokujeme si dynamicku strukturu X */
str_t * mojaDynamickaStruktura_L = malloc(sizeof(buf_t)); /* Alokujeme si dynamicku strukturu Y*/

mojaDynamickaStruktura_K.pvalue = malloc(40); /* alokujeme pamat pre pointer pvalue */
mojaDynamickaStruktura_K.id = 15); /* dame nejake id... */
memcpy(mojaDynamickaStruktura_K.pvalue, "heslo", 5); /* nakopiruje retazec "heslo" do bufferu na ktory ukazuje pvalue */ 
 
memcpy(mojaDynamickaStruktura_L, mojaDynamickaStruktura_K, sizeof(mojaDynamickaStruktura_L); /* skopirujme strukturu A do struktury B*/
mojaDynamickaStruktura_L.pvalue = malloc(40); /* alokujeme pamat pre pointre pvalue */
memcpy(mojaDynamickaStruktura_K.pvalue, mojaDynamickaStruktura_L.pvalue, 5); /* nakopiruje retazec "heslo" do bufferu na ktory ukazuje pvalue */ 
           
/* Obe struktury su identicke, a kazda ukazuje na svoju cast pamata, ktora je tiez identicka co sa tyka obsahu */
Marekodzapadu
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 174
Vek: 7.11
Zalo┼żen├Ż: 25.04.2010
Karma: 1

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod zen » 22 Sep 2018, 20:58

Radus nap├şsal:Tak┼że sa presne to stane - m├í┼í 2 odkazy na jednu ┼ítrukt├║ru...

Ja som sa tymto stretol v Python. Aj ked sa mi to podarilo vyriesit, stale mi vrta hlavou, NA CO JE TO DOBRE, mat dva odkazy na tu istu strukturu.
Samoz┼Öejm─Ť, ┼że d─Ťde─Źek nem├í kapesn├ş hodinky poh├ín─Ťn├ę elekt┼Öinou. Takov├Ż nesmysl si m┼»┼że vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 375
Zalo┼żen├Ż: 22.11.2013
Bydlisko: Cadca
Karma: 5

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod peterple » 22 Sep 2018, 21:36

Dobr├ę je to na to ┼że je to najjednoduch┼í├ş sp├┤sob pri odovzd├ívan├ş parametrov funkci├ím. Napr├şklad bude┼í ma┼ą nejak├Ż zoznam hodn├┤t. A chce┼í urobi┼ą funkciu ktor├í vypo─Ź├şta priemer. Tak niekde si dr┼ż├ş┼í odkaz na ten zoznam. A zavol├í┼í funkciu na v├Żpo─Źet priemeru. Ako parameter bude odkaz na ten zoznam. Vo funkcii vznikne do─Źasn├í premenn├í ktor├í ukazuje tie┼ż na ten zoznam. A u┼ż to m├í┼í dva odkazy ─Źo ukazuj├║ na t├║ ist├║ ┼ítrukt├║ru.
In├Ż pr├şklad je zjednodu┼íi┼ą si z├ípis. Ak m├ím nejak├Ż objekt ktor├Ż sa sklad├í z objektov a tie zase z objektov. A ja potrebujem niekde pracova┼ą ve─ża kr├ít s nejak├Żm jedn├Żm ale hlboko zanoren├Żm. Tak si vytvor├şm premenn├║ ktor├í ukazuje na ten objekt, aby som to nemusel zapisova┼ą st├íle dokola. A zase m├ím dva odkazy na to ist├ę. Je to pohodln├ę a e┼íte u┼íetr├şm ─Źas ─Źo by sa to st├íle muselo vyhodnocova┼ą.

D├┤le┼żit├ę je aby tie ─Ćal┼íie odkazy boli naozaj do─Źasn├ę a ─Źo najsk├┤r ako ich nepotrebuje┼í zanikli. Lebo ak nie a ty zru┼í├ş┼í ten origin├íl a predpoklad├í┼í ┼że GC ti uvoln├ş pame┼ą, tak si si pr├íve nabehol a vyrobil si memory leak.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1775
Vek: 52.03
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 48

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod zen » 23 Sep 2018, 21:36

peterple nap├şsal:Dobr├ę je to na to ┼że je to najjednoduch┼í├ş sp├┤sob pri odovzd├ívan├ş parametrov funkci├ím. Napr├şklad bude┼í ma┼ą nejak├Ż zoznam hodn├┤t. A chce┼í urobi┼ą funkciu ktor├í vypo─Ź├şta priemer. Tak niekde si dr┼ż├ş┼í odkaz na ten zoznam. A zavol├í┼í funkciu na v├Żpo─Źet priemeru. Ako parameter bude odkaz na ten zoznam. Vo funkcii vznikne do─Źasn├í premenn├í ktor├í ukazuje tie┼ż na ten zoznam. A u┼ż to m├í┼í dva odkazy ─Źo ukazuj├║ na t├║ ist├║ ┼ítrukt├║ru.


Ta vyhoda mi porad unika. V Python by som to pisal takto:

K├│d: Vybra┼ą v┼íetko
def priemer(a):
  return (sum(a)/len(a))
#-----
a=[1,2,3,4]
print(priemer(a))


Akoze ten odkaz uz mam, tak preco s nim nerobit? Funguje to, no alespon v tomto priklade to len komplikuje:;

K├│d: Vybra┼ą v┼íetko
def priemer(a):
  b=a
  return (sum(b)/len(b))
#-----
a=[1,2,3,4]
print(priemer(a))
Samoz┼Öejm─Ť, ┼że d─Ťde─Źek nem├í kapesn├ş hodinky poh├ín─Ťn├ę elekt┼Öinou. Takov├Ż nesmysl si m┼»┼że vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 375
Zalo┼żen├Ż: 22.11.2013
Bydlisko: Cadca
Karma: 5

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod maskrtnik01 » 23 Sep 2018, 21:57

K├│d: Vybra┼ą v┼íetko
def priemer(a):
  return (sum(a)/len(a))
#-----
a=[1,2,3,4]
print(priemer(a))


Ja aj tu vid├şm dve premenn├ę, alebo ak chcete odkazy. Jeden je parameter funkcie priemer. Druh├Ż patr├ş inej funkcii. Nemus├ş sa jedna┼ą o glob├ílnu premenn├║, tak┼że to ┼że maj├║ rovnak├Ż n├ízov e┼íte neznamen├í ┼że existuje len jedna premenn├í.
maskrtnik01
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 764
Vek: 22.05
Zalo┼żen├Ż: 20.07.2010
Bydlisko: okolie KE
Karma: 3

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Radus » 23 Sep 2018, 22:56

Ahoj Zen. Peterple to myslel tak, ┼że keby si funkcii neodovzdal referenciu na premenn├║ ale rovno jej hodnotu, dan├í funkcia by vytvorila k├│piu tej premennej a pracovala by ─Ćalej s ┼łou.Teda pama┼ą by sa alokovala 2x. Ak funkcii odovzd├í┼í odkaz na referenciu (teda len odkaz kde sa nach├ídza premenn├í v pamati), dan├í funkcia pracuje st├íle s tou istou premenou. Tak┼że m├í┼í quazi 2 a viac odkazov na dann├║ premenn├║(┼ítrukt├║ru). Dajme tomu raz v tele programu a raz v danej funkcii ktor├║ vol├í┼í. Pod─ża m┼ła by mal ma┼ą u┼ż├şvate─ż mo┼żnos┼ą si zvoli┼ą ─Źi chce pou┼żiva┼ą hodnotu alebo referenciu premennej. Pri hodnotov├Żch typoch to ide, m├íme nato pointery a podobne. Pri referen─Źn├Żch typoch to u┼ż nejde, st├íle sa pred├íva len odkaz na referenciu. Je to dan├ę aj in├Żm umiestnen├Żm t├Żchto typov v pamati. Tie┼ż nech├ípem, ak program dok├í┼że bez probl├ęmov zalo┼ż┼ą nov├║ premenn├║ typu mojej vlastnej ┼ítrukt├║ry alebo po─ża, pre─Źo sa ned├í jednoducho vytvori┼ą jej k├│pia...ale ako vysvet─żovali viac sk├║sen├Ż ├║┼żivatelia, asi to neje tak├ę jednoduch├ę...
No ni─Ź, ost├íva n├ím sa s t├Żm len zmieri┼ą.
Radus
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 925
Vek: 36.78
Zalo┼żen├Ż: 27.10.2009
Bydlisko: Prešov
Karma: 6

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod peterple » 23 Sep 2018, 23:10

presne tak ako p├ş┼íe maskrtnik01. U┼ż v tom prvom k├│de m├í┼í dve referen─Źn├ę premenn├ę. Tu je pekne vidie┼ą ako si program├ítor vo vy┼í┼í├şch jazykoch nevie v├┤bec predstavi┼ą ─Źo sa v tom po─Ź├şta─Źi deje.
napr ┼że
K├│d: Vybra┼ą v┼íetko
a=[1,2,3,4]
┬┤
v skuto─Źnosti vyrob├ş referen─Źn├║ premenn├║ s n├ízvom a ta m├í velkos┼ą dan├║ pou┼żit├Żm CPU teda 32 alebo 64bit a obsahuje adresu nejak├ęho kusu pam├Ąte. A teraz kde a ako. Nu┼ż to je dnes tak ┼że sa zavol├í kon┼ítruktor objektu List a ako parametre sa mu d├í ten zoznam prvkov a on si zist├ş ko─żko tam t├Żch prvkov je a ─Źo s├║ za─Ź. Nepozn├ím python, ale dajme tomu ┼że sa v vyp├Żta z OS kus pam├Ąte a a to je ten objekt list. A potom vytvor├ş postupne zoznam objektov v tomto pr├şpade ─Ź├şsel. To je v┼íetko intern├í z├íle┼żitos┼ą toho objektu List. Ten si zapam├Ąt├í ko─żko a kde a ak├ę tie prvky s├║. Teda cel├ę to v pam├Ąti zaber├í kus ─Ćal┼íej pam├Ąte. Do premennej a sa d├í len adresa kde bol ten objekt list vytvoren├Ż.
A teraz ide┼í vola┼ą t├║ funkciu priemer. A t├í m├í ako jeden parameter objekt pola. U┼ż teraz vieme ┼że je to v pam├Ąti ten samotn├Ż objekt plus data. T├í funkcia sa nem├┤┼że odvol├íva┼ą na nejak├║ konkr├ętnu adresu, lebo ju m├┤┼że┼í zavola┼ą s x r├┤znymi po─żami. A tak je tam zase len mieste─Źko na referenciu na ─żubovoln├ę pole (objekt) a to si si zase nazval a. Pri zavolan├ş funkcie sa len prekop├şruje t├í adresa z jedn├ęho a ktor├ę vid├ş ten hlavn├Ż program do in├ęho a, ktor├Ż vid├ş t├í funkcia.

To ┼że si tam potom pridal premenn├║ b nem├í ┼żiadny pr├şnos. In├ę by to bolo keby ako som spom├şnal to a bol nejak├Ż komplikovan├Ż objekt. Napr├şklad to bude excelovsk├Ż s├║bor. A ty chce┼í spo─Ź├şta┼ą priemer v nejakom riadku. Tak aby si nemusel v┼żdy referencova┼ą syst├ęmom workBook.worksheet("data").cell(1,0) ....
tak si vytvor├ş┼í referen─Źn├║ premenn├║ wkSh=woorkBook.worksheet("data")
Teda zase len prekop├şruje┼í odkaz na existuj├║ci objekt do tvojej lok├ílnej premennej wkSh
a u┼íetril si pri ka┼żdom cykle cel├║ t├║ referen─Źn├║ re┼ąaz ktor├í samozrejme poriadne zdr┼żuje. Pri jednom ─Ź├şsle to nespozn├í┼í ale ke─Ć ich bude par mili├│nov tak to zbad├í┼í a riadne. Lebo prech├ídza┼ą zoznamy cez indexy je najhor┼íie ─Źo len m├┤┼że by┼ą z poh─żadu r├Żchlosti.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1775
Vek: 52.03
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 48

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod zen » 24 Sep 2018, 11:40

peterple nap├şsal:In├ę by to bolo keby ako som spom├şnal to a bol nejak├Ż komplikovan├Ż objekt. Napr├şklad to bude excelovsk├Ż s├║bor. A ty chce┼í spo─Ź├şta┼ą priemer v nejakom riadku. Tak aby si nemusel v┼żdy referencova┼ą syst├ęmom workBook.worksheet("data").cell(1,0) ....
tak si vytvor├ş┼í referen─Źn├║ premenn├║ wkSh=woorkBook.worksheet("data")
Teda zase len prekop├şruje┼í odkaz na existuj├║ci objekt do tvojej lok├ílnej premennej wkSh


Toto chapem. K+
Samoz┼Öejm─Ť, ┼że d─Ťde─Źek nem├í kapesn├ş hodinky poh├ín─Ťn├ę elekt┼Öinou. Takov├Ż nesmysl si m┼»┼że vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 375
Zalo┼żen├Ż: 22.11.2013
Bydlisko: Cadca
Karma: 5

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod peterple » 24 Sep 2018, 20:18

V prvom rade: Nikomu never.
Radus nap├şsal:Pod─ża m┼ła by mal ma┼ą u┼ż├şvate─ż mo┼żnos┼ą si zvoli┼ą ─Źi chce pou┼żiva┼ą hodnotu alebo referenciu premennej. Pri hodnotov├Żch typoch to ide, m├íme nato pointery a podobne. Pri referen─Źn├Żch typoch to u┼ż nejde, st├íle sa pred├íva len odkaz na referenciu. Je to dan├ę aj in├Żm umiestnen├Żm t├Żchto typov v pamati. Tie┼ż nech├ípem, ak program dok├í┼że bez probl├ęmov zalo┼ż┼ą nov├║ premenn├║ typu mojej vlastnej
┼ítrukt├║ry alebo po─ża, pre─Źo sa ned├í jednoducho vytvori┼ą jej k├│pia...ale ako vysvet─żovali viac sk├║sen├Ż ├║┼żivatelia, asi to neje tak├ę jednoduch├ę...
No ni─Ź, ost├íva n├ím sa s t├Żm len zmieri┼ą.

To ┼że sa ned├í jednoducho urobi┼ą k├│pia objektu nie je celkom pravda. D├í sa, ale nie celkom jednoducho. ┼Że to mus├ş ├şs┼ą je jasn├ę z nasleduj├║cej ├║vahy.
V┼íetky modern├ę jazyky (JAVA, C#, JavaScript, Python, ....) robia alok├íciu dynamick├Żch premenn├Żch automaticky. To bol toti┼ż zabij├ík pre programy v C a C++. Bu─Ć tam zost├ívali memory leaky, alebo aplik├ícia (niekedy aj cel├Ż OS) padol na hubu, lebo sa niekto odvolal na premenn├║ ktor├í u┼ż neexistovala.
Preto sa tak rozmohla t├í JAVA lebo perfektne rie┼íila ten druh├Ż probl├ęm. Tak┼że princ├şp hry je asi tak├Żto:
  1. nejak├ę behov├ę prostredie si mana┼żuje pam├Ą┼ą. M├í jedno ve─żk├ę vrece a to vol├í heap (hromada) Tam vytv├íra dynamick├ę datov├ę ┼ítrukt├║ry.
  2. program├ítor potrebuje vytvori┼ą dynamick├Ż objekt pou┼żije na to k─ż├║─Źov├ę slovo new a meno kon┼ítruktora objektu ─Źo potrebuje. V nov┼í├şch jazykoch ani to new u┼ż nie je treba. Nap├ş┼íe napr o={color: "red"} a je to.
    Takto si postupne vytv├íra objekty ako potrebuje. Tie ─Źo nepotrebuje neuvo─ż┼łuje z hromady, ale len ru┼í├ş na ne referencie.
  3. Potom niekto komu sa nad├íva GC (garbage collector) pr├şde a v┼íetky kusy pam├Ąte na ktor├ę neukazuje ┼żiadna referencia ozna─Ź├ş ako vo─żn├ę. To znamen├í ┼że ich to behov├ę prostredie m├┤┼że zase prideli┼ą, ke─Ć program vol├í ┼że chce kus vo─żnej pam├Ąte na nov├Ż objekt. Super, len┼że..
  4. Tak├Żm to hospod├íren├şm by sme t├║ haldu rozorali na st├íle men┼íie a men┼íie vo─żn├ę bloky. Lebo tie vytvoren├ę objekty nezanikaj├║ v opa─Źnom porad├ş ako vznikali ale takmer n├íhodne, ako si ┼żel├í program├ítor aplik├ície. Vznikne fragment├ícia. Nie─Źo podobn├ę ako fragment├ícia disku ktor├í vznikne mazan├şm u┼ż nepotrebn├Żch s├║borov.
  5. No a teraz zrazu treba ulo┼żi┼ą do pam├Ąte obr├ízok ve─żk├Ż jak bl├ízon. Heap je s├şce polopr├ízdny ale je tak rozoran├Ż, ┼że s├║visl├í ─Źas┼ą takejto ve─żkej pam├Ąte k dispoz├şcii nie je. Tak┼że by to skon─Źilo hl├í┼íkou nie je dos┼ą pam├Ąte. Je jasn├ę ┼że ─Ź├şm dlh┼íie by tak├Żto syst├ęm be┼żal, t├Żm by bolo hor┼íie. Ako je mo┼żn├ę ┼że server be┼ż├ş aj roky bez re┼ítartu a dok├í┼że ma┼ą st├íle ve─żk├ę kusy pam├Ąte ke─Ć je to treba?
  6. V┼íetko odrie GC. Okrem toho ┼że vypr├ízd┼łuje nepotrebn├ę kusy pam├Ąte. Tak ich dok├í┼że aj defragmentova┼ą. A to sa d├í len tak, ┼że objekt ktor├Ż zostal niekde medzi dvomi vo─żn├Żmi kusmi pam├Ąte prekop├şruje niekam inam pekne do s├║visle obsadenej pam├Ąte
  7. V minulosti to robil trocha idiotsky. Preto┼że zastavil beh v┼íetk├Żch rozbehnut├Żch programov, upratal a potom sa fi─Źalo zase ─Ćalej.
    Potom to robil trocha lep┼íie a to zastavenie sa dos┼ą zredukovalo.
    No a teraz to dok├í┼że robi┼ą s├║─Źasne (konkurentne) za behu ostatn├Żch programov. Dos┼ą ─Źasto sa pritom vyskytuje stav ┼że v pam├Ąti s├║ dve k├│pie toho ist├ęho objektu, pri─Źom niektor├ę referencie ukazuj├║ u┼ż na ten nov├Ż a niektor├ę e┼íte st├íle na ten star├Ż objekt. GC trpezlivo prer├íba tie star├ę referencie na tie nov├ę a ke─Ć u┼ż ┼żiadna star├í referencia neexistuje tak ten star├Ż objekt zma┼że a tak z├şska z dvoch kusov pam├Ąte jeden s├║visl├Ż.
Cel├í t├íto vychyt├ívka nie─Źo stoj├ş. Jednak je potrebn├ę prida┼ą do ka┼żd├ęho objektu jednu ─Ćal┼íiu referenciu. Teda je o 4 alebo 8 byte v├Ą─Ź┼í├ş. Druhak je pri referencovan├ş ka┼żd├ęho prvku objektu treba vykona┼ą o jednu strojov├║ in┼ítrukciu na vy┼íe (nejak├Żch p├ír nanosekund). Nu┼ż ale ─Źo by sme neurobili pre pou┼ż├şvate─żov aby im ten telef├│n neprestal reagova┼ą na 0,3 sekundy.
To potom po─Źu┼ą sopliakov ako vykrikuj├║ ┼że im to laguje.

No a potom so p├şsal ┼że ka┼żd├Ż objekt m├í met├│du clone ktor├í ho dok├í┼że skop├şrova┼ą. Ot├ízne je len ─Źi je to to ─Źo sme chceli (plytk├ę, hlbok├ę). Niektor├ę objekty to clone maj├║ udr┼żovan├ę pri ka┼żdom deden├ş. Alebo m├í objekt na to ┼íp├ęci funkci. Napr├şklad v javascripte existuje cloneNode() na kop├şrovanie Node vr├ítane toho ┼że si m├┤┼żem vybra┼ą ─Źi naklonova┼ą aj v┼íetky child dan├ęho Node.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1775
Vek: 52.03
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 48

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod zen » 25 Sep 2018, 12:47

Radus nap├şsal:Pod─ża m┼ła by mal ma┼ą u┼ż├şvate─ż mo┼żnos┼ą si zvoli┼ą ─Źi chce pou┼żiva┼ą hodnotu alebo referenciu premennej.

Asi budes muset hladat. V Python som to nasiel:
K├│d: Vybra┼ą v┼íetko
a=[0,0,0]
b=a
print(a,b)
a[0]=1
b[2]=1
print(a,b,a==b)
print("With deepcopy")
a=[0,0,0]
import copy
b=copy.deepcopy(a)
print(a,b)
a[0]=1
b[2]=1
print(a,b,a==b)


Output:
K├│d: Vybra┼ą v┼íetko
[0, 0, 0] [0, 0, 0]
[1, 0, 1] [1, 0, 1] True
With deepcopy
[0, 0, 0] [0, 0, 0]
[1, 0, 0] [0, 0, 1] False
Samoz┼Öejm─Ť, ┼że d─Ťde─Źek nem├í kapesn├ş hodinky poh├ín─Ťn├ę elekt┼Öinou. Takov├Ż nesmysl si m┼»┼że vymyslit jen Saturnin. (Zdenek Jirotka, 1942)
zen
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 375
Zalo┼żen├Ż: 22.11.2013
Bydlisko: Cadca
Karma: 5

Re: Kop├şrovanie referen─Źnej premennej.

Odosla┼ąod Radus » 25 Sep 2018, 14:02

...─Ćakujem za objasnenie problematiky, budem musie┼ą e┼íte poh─żada┼ą.
R.
Radus
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 925
Vek: 36.78
Zalo┼żen├Ż: 27.10.2009
Bydlisko: Prešov
Karma: 6


Nasp├Ą┼ą na C,C++,C#

Kto je pr├ştomn├Ż

U┼ż├şvatelia prezeraj├║ci si toto f├│rum: ┼Żiadny registrovan├Ż pou┼ż├şvate─ż a 1 hos┼ą.

Forums ©
Autor str├ínky je Ondrej Z├ívodsk├Ż(zawin), o graficky design sa star├í ─Żubo┼í Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
─îas potrebn├Ż k spracovaniu str├ínky 0.73 sek├║nd