C++ dyskusyjne pytanie!

0

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

0

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.

0

Dzieki za odpowiedz. Ja wlasnie slyszalem ze zmienna jest rowniez funkcja lecz nie na odwrot.

0

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.

0

a ja jeszcze dodam, ze mnemoniki rozkazow i zmiennych sa takie same - decyduje jedynie kolejnosc

0

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).

1

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")( ); // ;>

0

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.

0

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.

0

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ść?

1

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:

  1. 000000020h __Code section.
  2. 000000040h __Initialized data section.
  3. 000000080h __Uninitialized data section.
  4. 040000000h __Section must not be cached.
  5. 080000000h __Section is not pageable.
  6. 100000000h __Section is shared.
  7. 200000000h __Executable section.
  8. 400000000h __Readable section.
  9. 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. */

0

Eee nie no - luz - ja byłem przekonany, że rozmawiamy o trybie rzeczywistym! A jak to chroniony to nie było pytania :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1