• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

Mi treba pomos okolu edna funkcija vo C++

  • Ја почнал/а темата
  • #1

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
 

StarBuck

Intern
16 февруари 2008
1,295
48
Берлин
StarBuck's setup  
Processor & Cooler
Quad-Core Intel Xeon E5 3,7
Storage
256 GB SSD
RAM
12 GB DDR3-RAM
Video card
Dual AMD FirePro D300 GDDR5 4GB
Monitor
IPS
OS
Yosemite
unsigned int *i = reinterpret_cast<unsigned int*>(0x00123456);

?
 
  • Ја почнал/а темата
  • #4

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);
 
  • Ја почнал/а темата
  • #6

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*, ...)'
 
  • Ја почнал/а темата
  • #7

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");
Хех, и пак може да има грешка.

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

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 на таа адреса...

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

Се надевам дека ќе биде ок.
 
  • Ја почнал/а темата
  • #11

DigiSoft

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

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

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

Нови мислења

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

Статистика

Теми
43,517
Мислења
822,419
Членови
28,049
Најнов член
Mandej
На врв Дно