|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
30.3.2012, 14:33 | #1 |
Član
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
|
Funkcije u windows.h biblioeci...
Neke windows.h (wincon.h) funkcije imaju za argument pokazivac na promenljivu u koju ce biti smesten broj koji obicno predstavlja broj uspesno obavljenih operacija unutar funkcije i vrlo cesto je potpuno beskorisno znati broj uspesnih <cega god>. Primer. Funkcija za stampanje karaktera na nekoj poziciji na konzoli izgleda ovako - FillConsoleOutputCharacter(Izlaz, 'A', 1, (COORD){1, 1}, &BESKORISNO_*****E) i u promenljivu BESKORISNO_*****E ce biti smesten broj uspesno odstampanih karaktera. E sad, posto mi je trulo da imam promenljivu BESKORISNO_*****E, a ni za sta mi ne treba, uz malo eksperimentisanja dodjoh do zakljucka da FillConsoleOutputCharacter(Izlaz, 'A', 1, (COORD){1, 1}, &(DWORD <tj. unsigned long>){0}) radi identicno. Ono sto mi nije jasno je kako &(DWORD){0} radi.
Skoro sam provalio da kada prosledjujem strukturu kao argument funkciji ne moram prvo da pravim novu promenljivu vec mogu "na licu mesta" da napravim i prosledim strukturu (ovo (COORD){1, 1}). Moje shvatanje ovog je da to radi kao sa primitivnim promenljivama npr. int a = 5; funkcija(a + 1); ali onda ne kapiram zasto &(DWORD){0} radi jer po nekoj logici, taj argument nije fizicka/definisana promenljiva u koju ce (u slucaju funkcije FillConsoleOutputCharacter) biti smesten broj uspesno odstampanih karaktera, vec samo "na licu mesta zbuckan i prosledjen broj tj. njegova adresa". Gde gresim? Malo sam ga zakomplikovao. |
7.4.2012, 22:43 | #2 |
V.I.P. Programiranje
|
Re: Funkcije u windows.h biblioeci...
Jeste da je matora tema, ali odgovoriću svejedno, ako još nisi naleteo na odgovor ili ako nekog drugog bude interesovalo.
Funkcije ne samo u Windows API-ju već u gomili drugih API-ja imaju ovakav način da se vrate neki rezultati. Međutim, naravno, programeri koji su dizajnirali ovaj API su predvideli da ti podaci koji se vraćaju neće uvek biti korisni, odnosno nekog korisnika ne bi uvek zanimali. Iz tog razloga je uglavnom nepisano pravilo da se, ako se u nekom parametru koji bi trebao da služi za izlaz, prosledi nulti pokazivač (odnosno &(DWORD(0) iliti NULL, a u novom C++11 nullptr) tada se ti podaci ni ne vraćaju. NULL je uvek zagarantovan da ne pokazuje na validnu memorijsku lokaciju pa je idealan kandidat za takav placeholder. Dakle, ako funkciju pozoveš kao FillConsoleOutputCharacter(Izlaz, 'A', 1, (COORD){1, 1}, NULL), tada se ovaj parametar gde je NULL neće ni uzimati u obzir. Da je funkcija stvarno pokušala da upiše na memorijsku adresu koju si joj prosledio, dogodio bi se grozan segfault. |
7.4.2012, 23:28 | #3 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Funkcije u windows.h biblioeci...
Ta multifunkcionalnost ume pomalo da nervira. Evo pogledaj recimo ovu funkciju CreateProcess .
|
8.4.2012, 15:10 | #4 |
Član
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
|
Re: Funkcije u windows.h biblioeci...
@Geomaster: Bas je fora u tome da NULL ne sme da se prosledi. I ja sam se vodio tom logikom da ako prosledim NULL kao argument da funkcija nece upisivati nista u lokaciju zadatu argumentom (kao npr time(NULL)), ali to ne radi, odnosno radi kad se program pokrene normalno, ali prilikom debagovanja se javlja SEGF. I to nije slucaj samo sa tom funkcijom, nego sa svim Windows funkcijama (barem onim sa kojima sam ja radio), neke cak ne uspeju ni da urade ono za sta su zaduzene pre nego sto se javi SEGF (konkretno ReadConsoleInput()).
Sad kad pogledam ovo sto je Belphegor postavio, izgleda da ovo "opt" znaci da moze da se prosledi i NULL, ali nijedna od ovih funkcija koje ja koristim nema "opt" kao osobinu/stagod argumenta. |
8.4.2012, 15:59 | #5 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Funkcije u windows.h biblioeci...
'opt' predstavlja opcionalni parametar, pa bi trebalo da moze da bude NULL, obicno pise u dokumentaciji ako moze.
A nekad neki parametar zavisi od drugog, npr. ako je jedan 'flag' postavljen na jednom onda drugi ne moze biti NULL ili ne moze imati neki drugi 'flag'... Mozak da ti se istopi. BTW. Kod mene (vs2010) nece da kompajlira ono dvoje kao parametar: Kod:
foo((COORD){1, 1}, ..., &(DWORD)0) EDIT: offtopic: Kako bi preveo 'flag' na srpski u ovom kontextu, bas me zanima? Poslednja ispravka: Belphegor (8.4.2012 u 16:07) |
8.4.2012, 16:27 | #6 |
Član
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
|
Re: Funkcije u windows.h biblioeci...
Ni ja ne razumem, ali tako radi. Odnosno, ne moze da se napise &(DWORD)0 nego mora &(DWORD){0}.
|
8.4.2012, 16:46 | #7 | ||
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Funkcije u windows.h biblioeci...
Ma nisam ukucao sve u post, ovo sam probao VS2010:
Kod:
typedef unsigned long DWORD; void foo(DWORD* p) { *p = 1; } int main() { foo( &(DWORD){0} ); return 0; } Citat:
error: Citat:
EDIT: A ovo isto ne radi sa VS2010: Kod:
#include <iostream> struct COORD { short x, y; }; void foo(COORD c) { std::cout << "COORD( " << c.x << ", " << c.y << " )" << std::endl; } int main() { foo( (COORD){1,1} ); return 0; } Poslednja ispravka: Belphegor (8.4.2012 u 16:53) |
||
8.4.2012, 21:52 | #8 | |
V.I.P. Programiranje
|
Re: Funkcije u windows.h biblioeci...
Citat:
|
|
Bookmarks sajtovi |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Najbolji web sajt sa flash igrama | AkulM | Male igre | 60 | 4.2.2016 23:44 |
C čudno ponašanje strcpy() funkcije | zokocx | Programiranje | 8 | 5.1.2011 14:10 |
Mata - funkcija i grafik funkcije | Teva | Brbljaonica | 19 | 20.2.2010 11:41 |
Program za crtanje grafika funkcije | metallica2 | Aplikativni softver | 11 | 27.10.2008 21:30 |
Dodatne funkcije na Laptopu | Echo | Prenosni računari | 0 | 23.2.2006 23:40 |