• Важно
    Имате проблем со најава или регистрација на it.mk?
    Побарајте го решението на вашиот проблем ТУКА!

Mi treba pomos okolu edna funkcija vo C++

DigiSoft

Баниран/a
7 февруари 2008
63
7
Vaka znaci.

Vo memorija postoi adresa na primer 0x00123456 i na taa adresa ima funkcija printf. E sega jas sakam od moj program vo C++ da ja povikam ovaa funkcija no ne kako printf tuku preku nejzinata memoriska adresa.

Doznav deka za ova se koristi komandata

reinterpret_cast

deklaracijata na printf funkcijata e

int printf(const char *, ...);

Znaci moeto prasanje e kako ovaa deklaracija na printf da ja povrzam preku reinterpret_cast so memoriskata adresa 0x00123456 taka sto ponatamu vo programot kje si ja koristam kako normalna funkcija printf.

Aj ve molam za pomos zosto nikako ne moze da mi vleze ova vo glava.

Fala
 

DigiSoft

Баниран/a
7 февруари 2008
63
7
Fala za odgovorov ama pak ne mi e jasno. :D ako ova go napisam kako kje ja koristam ponatamu printf?
 

TataMata

Intern
13 јуни 2008
115
1
Функциски поинтер. Ух. Нешто слично вака???

Код:
int (*printf_fn)(const char *, ...);
printf_fn = 0x00123456;
printf_fn("test"n);
 

DigiSoft

Баниран/a
7 февруари 2008
63
7
E ova vekje mi e pojasno. TataMata dali ova bi rabotelo?

Znaci jas sakam


printf = 0x00123456 //ova e psevdokod znaci ova ne e C++ (sakam vakvo nesto da dobijam)

int main()
{
printf("bla bla bla\n");
}

Dali ako go koristam tvojot nacin ili onoj od StarBuck bi mozel da dobijam nesto vakvo??

Fala za dosegasnata pomos...

Go probav kodot na StarBuck i se kompajlira uspesno ali da mi kaze ako moze koj se vlezni parametri koe e funkcijata malku ako moze da mi go objasni toa so go napisa.

Go probav i kodot na TataMata ama mi javuva error:
invalid conversion from `int' to `int (*)(const char*, ...)'
 

DigiSoft

Баниран/a
7 февруари 2008
63
7
Добро еве сега ќе го поставам прашањето најпросто што можам.

Имам искомпајлирана верзија на printf функцијата и се наоѓа на адресата 0x00123456. Како да ја повикам.

Е од ова попросто неможам да објаснам :D
 

TataMata

Intern
13 јуни 2008
115
1
Нормално дека мојот код има грешка. На брзина склепано, нели?

Код:
typedef int (*PRINTF_FN_TD)(const char *, ...);

PRINTF_FN_TD printf_fn;
printf_fn = reinterpret_cast<PRINTF_FN_TD>(0x00123456);
printf_fn("testn");

Хех, и пак може да има грешка.

Инаку кодот мој користи функциски поинтер. Не е лошо да прочиташ едно туториалче.
 

DigiSoft

Баниран/a
7 февруари 2008
63
7
Нормално дека мојот код има грешка. На брзина склепано, нели?

Код:
typedef int (*PRINTF_FN_TD)(const char *, ...);

PRINTF_FN_TD printf_fn;
printf_fn = reinterpret_cast<PRINTF_FN_TD>(0x00123456);
printf_fn("testn");

Хех, и пак може да има грешка.

Инаку кодот мој користи функциски поинтер. Не е лошо да прочиташ едно туториалче.

Ејјј фала братче за кодов, сега ми е многу појасно...
Инаку не сум многу добар во C++ и уште учам зошто сум принуден, а професионално и со љубов го знам и го користам Delphi.
thanks :D

PSS:
Uspeav i go iskomajlirav kodot. Dali ova sega mozam print_fn da go koristam normalno kako printf? a da go koristi vekje kompajliraniot koda na adresata 0x00123456
 

TataMata

Intern
13 јуни 2008
115
1
Ако е се во ред преку print_fn може да се повика printf на таа адреса...

Ама може да има проблеми, но тогаш треба да се оди на пониско ниво (асемблер, начин на пренос на параметри, дали повикувачот или повиканата функција го чистат стекот). Знае да биде грдо.

Се надевам дека ќе биде ок.
 

DigiSoft

Баниран/a
7 февруари 2008
63
7
Ако е се во ред преку print_fn може да се повика printf на таа адреса...

Ама може да има проблеми, но тогаш треба да се оди на пониско ниво (асемблер, начин на пренос на параметри, дали повикувачот или повиканата функција го чистат стекот). Знае да биде грдо.

Се надевам дека ќе биде ок.

Баш асемблерот е она што сакав да го избегнам :D
 

Нови мислења

Последни Теми

Статистика

Теми
44.272
Мислења
920.364
Членови
32.934
Огласи
1.074
Најнов член
Persej10
На врв Дно