Forum > Software > Potrzebny przeciętny programista c lub ktoś kto lubi zabawę ze wskaźnikami

Strona 1 z 1 1
skocz

mekintosz

Wysłane 2014-11-18 21:04 , Edytowane 2014-11-18 21:05

Dostałem taki, niedokończony kod od mojego kolegi (prawdopodobnie jakaś praca domowa, zagadka, cokolwiek, nie wiem), gdzie za zadanie ma "używając jednego przypisania" zmienić wszystkie pola daty. Nie mam dziś dużo czasu, ani jakoś głowy, żeby teraz na szybko sobie zrobić powtórkę jak to się działało z tymi wskaźnikami, a z c/cpp nie miałem już chwilę do czynienia. Normalnie bym to olał, ale muszę przyznać, że samo rozwiązanie mnie ciekawi, w związku z tym jakiś "spec" może?:-)

HP Spectre 4110x - i5 6200U, 8GB RAM, 256GB SSD, Full HD

Inferno

Wysłane 2014-11-18 22:21 , Edytowane 2014-11-18 22:22

O to chodzi ?? 
http://ideone.com/kq8PmK


void set_date(int r, int m, int d)
{
     int &x = date(YEAR);      //?
     int f[3] = {r,m,d};
     memcpy((void *)&x, (const void *)f, (sizeof(int)*3));  
}


Mike*[PL]*

Wysłane 2014-11-18 22:43

Moze tak?
Cała tablica tworzona jest tylko po to, żeby wygodnie w pętli wywołać funkcje date(int);
void set_date(int r, int m, int d){
    int *x = new int[3]{r,m,d};
    for(int i=1;i<=3;i++){
        date(i) = x[i-1];
    }
    delete []x;
}

Mówiąc jedno przypisanie, rozumiem, że nie masz na myśli wywołania f. date, bo tutaj nie da się ustawić wszystkiego za jednym zamachem, gdzie tablica ma 3 el. a f. zwraca referencje do pojedyńczego elementu (zakładam, że f. date(); jest nietykalna). Zauważ też, że w linijce ze wskaźnikiem masz inicjalizację, więc na upartego można powiedzieć, że prócz wywołań date(); nie ma żadnego przypisania ;-)

mekintosz

Wysłane 2014-11-18 23:08 , Edytowane 2014-11-18 23:11

Zapytałem i nie, jest to jakieś zadanie które dostał, o wdzięcznej nazwie "pointer magic - hacker's task" (xDD) i absolutnie nie może być tam żadnych pętli, ani przepisywania całej nowej tablicy jak i kopiowania pamięci. Ta linijka, to przez niego dopisana była, w ciemno.

Domyślam się, że może chodzić tam pewnie o to, że parametry przekazywane do funkcji set_date są jakoś logicznie ułożone kolejno w pamięci, tak jak tablica i chodzi np. o przypisanie pointerowi "d" nowego adresu, gdzie te parametry się znajdują, ale jak to zrobić, nie za bardzo kojarzę, choć pewnie to, że date zwraca referencję ma tutaj coś do roboty :D Coś czuję, że jutro sobie nad tym tematem chyba usiądę dłużej jak się wyrobię z pracą :D (żeby się okazało później, że to oczywiste i wstyd pozapominać takie w sumie ciekawe rzeczy :-P)

HP Spectre 4110x - i5 6200U, 8GB RAM, 256GB SSD, Full HD

Mike*[PL]*

Wysłane 2014-11-19 00:09 , Edytowane 2014-11-19 00:15

Żeby zrobić tak jak mówisz, musisz zmodyfikowac f. date();, poniewaz tam masz tablice statyczna, nie dynamiczna (po kazdym zakonczonym wywolaniu funkcji, tablica jest "zamrazana" do czasu kolejnego wywolania, po to, aby nie "zerowala" swoich wartosci przy kazdym wywolaniu funkcji). Jesli chcesz ulozone elementy w pamieci jeden obok drugiego, to musisz utworzyc tablice i ja przekazac funkcji date(), inaczej sie nie da. Dodatkowo tablica 'd' musi byc dynamiczna.
Sprobuj tak: (teraz 'd' jest wskaznikiem [statycznym] do tablicy, nie tablica)

int& date(int val,int *ptr = 0){
     static int *d = new int(3);                //tablica musi stac sie dynamiczna (za pomoca statycznego wskaznika)
     if(ptr){
     delete []d;                                   //jesli dostarczylismy nowa tablice, to usuwamy stara
     d = ptr;                                       //i przejmuje nowa
     }
     return d[val-1];
}

//wywolujac funkcje, pobieram parametry, ktore nastepnie sa kopiowane do tablicy(gdzie sa ulozone jeden po drugim w pamieci)

void set_date(int r, int m, int d){
     int new_table = new int[3]{r,m,d};
     date(1,new_table);
}

//wywoluje f. date(); z dwoma argumentami (teraz zadziala 'if' w date(); i podmieni tablice, pierwszy argument (1), jak i rezultat f. date(); olewamy)

Strona 1 z 1 1
skocz

Kto jest online: 0 użytkowników, 198 gości