Witam Was wszystkich. Musze przygotować mały referat z c++ i w zwiazku z tym chcialem sie Was spytac czy zmienna jest rowniez funkcja i czy funkcja jest rowniez zmienna. Za pomoc z gory dziekuje.
Pozdrowionka!
Kuba
Patrząc od strony kodu maszynowego (czy tam Assemblera) to i zmienna i funkcja są zapisywane jako adres do pierwszej instrukcji/zmiennej więc można uznać, że pod tym kątem jest to to samo.
Jeśli w zmiennej będziesz miał kod maszynowy i skoczysz pod adres zmiennej (tak jak skacze się pod adres funkcji aby ją wykonać) to wykonasz kod jaki się tam znajduje.
Dzieki za odpowiedz. Ja wlasnie slyszalem ze zmienna jest rowniez funkcja lecz nie na odwrot.
Z punktu widzenia programowania to funkcja jak najbardziej moze byc traktowana jak zmienna. Mozemy przekazywac ja jako parametr, jak zmienna (w praktyce jak juz Marooned wspomnial jest to jedynie adres).
Z punktu widzenia matematyki, to zmienna moze byc traktowana jak funkcja, bo daje nam jakas wartosc.
Ale swoja droga to takie dyskusje sa jakos malo sensowne. Ja wole myslec w kategoriach adresow i lokacji.
a ja jeszcze dodam, ze mnemoniki rozkazow i zmiennych sa takie same - decyduje jedynie kolejnosc
Słyszałeś, że dzwonią, ale nie bardzo potrafisz określic okolicę, w której jest ten dzwon...
Funkcja może byc użyta jako zmienna oraz istnieją zmienne typu funkcyjnego, np.:
int(CALLBACK* drawproc)(HDC,HDC,int,int,int,int,int,void*,void*);
// hehe ilośc odp/min ;]
// do postu poniżej: faktycznie jest to tylko wskaznik do funkcji, ale też faktycznie ma taka pokręcona nazwę (nie ja ją wymyslałem).
yy zmienna typu funkcyjnego ? pointer do funkcji brzmi lepiej imho ;p ale nie bede sie czepial ;>
funckja nie moze byc uzyta jako zmienna, jako ze funkcje ZAZWYCZAJ sa w bloku pamieci read-only/tylko-do-odczytu, tak ze moze byc uzyta co najwyzej jakos stala..
a zmienna jako funkcja? n/p jesli mozemy uzystac do niej pointer, a jeszcze lepiej jesli ta zmienna jest pointerem na jakies tam miejsce w pamieci gdzie jest kod funkcji...
((void(*)(void))"\x90\xc3")( ); // ;>
W C++ jest jeszcze cos takiego jak obiekt funkcyjny. Czyli z jednej strony jest to obiekt (zmienna), z drugiej strony moze zachowywac sie jak funkcja.
Dyskusja jest w ogole dosyc filozoficzna. Czy jesli cos sie zachowuje jak funkcja to jest funkcja czy nie? Dla mnie funkcja to kawalek kodu. Nie wskaznik do kawalka kodu, tylko sam kawalek kodu. A zmienna to miejsce w pamieci, w ktorym trzymane sa dane okreslonego typu, a nie adres tego miejsca.
Krolik: masz racje. Przeciez my mowimy o tym co sie znajduje w danej lokacji, a nie o adresach ktore skadinad tez w jakiejs lokacji sa.
Gynvael: moze byc zmienna, moze... takie cuda jak w asm sie robi... :P Ale faktem jest, ze w C++ to kompilator zwykle do read-only daje :( A szkoda, bo uniemozliwia to tworzenie SMC (self-modifing code), co jest ciekawym sposobem utrudniania zycia crackerom.
yyy - co za read-only ??? przecież nie ma takiej pamięci :| (pomijam ROM bo tam nie możemy zapisywać :d)
że niby to nie przejdzie???
void func()
{
ety:
asm jnz inna_ety
...
asm mov bx,ety
asm mov word ptr [bx],9090h
}
być może walnąłem się ze składnią - nie używałem asm pod c++ (tylko pod Pascalem) - ale wiadomo o co biega - dlaczego to miałoby nie przejść?
Marooned: chodzi o to ze w PE do danego segmentu sa flagi czy pamiec ma byc read/write/executable.. a pozniej system sprawdza czy probojesz zapisac costam w pamieci ktora nie moze byc modyfikowana.. jesli tak to prog sie wysypuje...
wyciag z opisu formatu
[code]
SECTION FLAGS = DD Flag bits for the section. The section flag bits have the following definitions:
- 000000020h __Code section.
- 000000040h __Initialized data section.
- 000000080h __Uninitialized data section.
- 040000000h __Section must not be cached.
- 080000000h __Section is not pageable.
- 100000000h __Section is shared.
- 200000000h __Executable section.
- 400000000h __Readable section.
- 800000000h __Writeable section. <=--- o to chodzi
[/code]
o dziwo winda to respektuje i uwaza na to (od 98 w zwyz na pewno, nie wiem jak wyzej)... tj chodzi mi o readable/writable... executable chyba nie bardzo
kod co napisales byl afair pod dosa (16sto bitowe adresowanie..) etc, tam to dzialalo na pewno ;> jako ze dos nie mial zadnych mechanizmow ochronnych etc (real mode wkoncu nie ?:>)... natomiast winda, jako ze pracuje w trybie chronionym, ma troche bardziej skompilkowane mechanizmy zarzadzania pamiecia, ktore m.in. pozwalaja na "oflagowanie" ;> tego
co do SMC, mozna przeciez przestawic flagi w PE ;> i wszystko potem ladnie dziala ;>
a.. nie kazdy kompilator ustawia "pozadnie" te flagi...
Krolik: sorx, ja po prostu nie mysle ksiazkowymi definicjami ;>>>
/* W ELF jest analogicznie = m.D. */
Eee nie no - luz - ja byłem przekonany, że rozmawiamy o trybie rzeczywistym! A jak to chroniony to nie było pytania :)