Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 30.3.2012, 14:33   #1
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom 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.
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 7.4.2012, 22:43   #2
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom 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.
Geomaster je offline   Odgovor sa citatom ove poruke
Stara 7.4.2012, 23:28   #3
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Funkcije u windows.h biblioeci...

Ta multifunkcionalnost ume pomalo da nervira. Evo pogledaj recimo ovu funkciju CreateProcess .
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 8.4.2012, 15:10   #4
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom 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.
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 8.4.2012, 15:59   #5
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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)
Ne razumem zasto bi kastovao konstantu '0' u DWORD pa uzeo adresu? Zasto ne samo 0?

EDIT:
offtopic: Kako bi preveo 'flag' na srpski u ovom kontextu, bas me zanima?

Poslednja ispravka: Belphegor (8.4.2012 u 16:07)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 8.4.2012, 16:27   #6
ozzytheking
Član
 
Član od: 13.7.2009.
Poruke: 151
Zahvalnice: 67
Zahvaljeno 29 puta na 26 poruka
Određen forumom 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}.
ozzytheking je offline   Odgovor sa citatom ove poruke
Stara 8.4.2012, 16:46   #7
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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;
}
error:
Citat:
error C2143: syntax error : missing ')' before '{'
A sa CB-om g++ 4.6.2:
error:
Citat:
error: taking address of temporary [-fpermissive]|
Sto znaci da je "(DWORD){0}" u stvari privremena promenljiva sa vrednosti 0 (adresa joj je drugacija)

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;
}
a sa g++ radi. Mora da su neka stara sintaksna pravila?

Poslednja ispravka: Belphegor (8.4.2012 u 16:53)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 8.4.2012, 21:52   #8
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: Funkcije u windows.h biblioeci...

Citat:
ozzytheking kaže: Pregled poruke
@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.
Onda se izvinjavam, ali stvarno, u svim APIjima koje sam koristio, nije se dogodilo da ne mogu da prosledim NULL out parametru a da program crashuje. Ima izuzetaka, naravno, kada je upravo poenta funkcije da vrati nešto u takvom parametru, kada nema smisla proslediti NULL.
Geomaster je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


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


Sva vremena su po Griniču +2 h. Sada je 0:30.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com