-
GAMEPOD.hu
Új hozzászólás Aktív témák
-
emitter
őstag
válasz emitter #1299 üzenetére
hát télleg nagyon béna voltam, úgylátszik kicsit elszoktam a kódolástól, de mostantól megint belejövök
szal csak simán át kellett konvertálni int-be a time_t-t
és sikerült megoldani a másodperc-számlálást mindenféle delay nélkül:
#include <time.h>
#include <stdio.h>
int main()
{
int i, kezdo, akt, t;
kezdo=t=(int)time(NULL);
printf(''Kezdo ido: %d\n'',kezdo);
i=0;
while(1)
{
akt=(int)time(NULL);
if(akt!=t)
{
t=akt;
printf(''%d\n'',akt-kezdo);
i++;
}
if(i==5) break;
}
printf(''Press any key!'');
getchar();
return 0;
}
akkor most ezzel a megpróbálom megcsinálni az aknakeresőm idő-számlálóját
mod: Jester01: azért figyeled az 5 századmásodperces hsz-időkülönbségünket
[Szerkesztve] -
Jester01
veterán
-
Miracle
senior tag
válasz Jester01 #1304 üzenetére
bar keves helyen reklamozzak, de a windows posix kompatibilis, nemi hatekonysagi problemaval (pl. az egymas utani fork()ok kozul az elso 10 faja utana meg tizedmasodpercekben merheto ido lesz )
szpval ha platformfuggetlenseg a cel akkor POSIX fuggvenyekkel lehel a legkulturaltabban megoldani C nyelven, vagy eluloniteni a platformfuggo reszt, es #ifdef..#endifek kozott a ket platformra specializalt kod, de ez joval ganyabb.. szoval inkabb POSIX... a baj azzal lehet nemtudom a melyik szemafor-implementacio resze a posixnak, es melyik kerult bele a kesobbi szabvanyokkal a unix spec.ba, mert ezek mar nem erhetok el windows alatt :-|értelmező késziszótár :: rekurzió --> lásd : rekurzió
-
Jester01
veterán
válasz emitter #1305 üzenetére
info libc, 13.8 Waiting for Input or Output. [link]
Az a lényeg, hogy olyan select hívást használj ami addig blokkol amíg nem lehet olvasni az stdin-t és nem múlik el a következõ frissítés idõpontja. (Ott a példa a doksiban)
Miracle, nyugodtan segíts ám te is, és szólj ha hülyeségekre biztatom EmittertJester
-
Protezis
őstag
válasz Miracle #1282 üzenetére
Köszi a választ, bár nem nagyon könnyítetted meg az életemet
Azonban azt hiszem, kapizsgálom.
Lenne egy másik kérdésem is. C++ -ban hogy hozok létre lokális objektumot a veremben? Nem látom a különbséget a statikus adatszegmensbeli objektum, és a lokális objektum deklarációja között. -
emitter
őstag
válasz Jester01 #1307 üzenetére
De ezzel hogyan tudom megvalósítani a ''stoppert''? Ez ha jól értelmeztem a kódot, egy visszaszámláló, nem pedig egy előreszámláló
azonkívül ezt hogyan tudnám beépíteni? Ha ez a visszaszámlálás idejére blokkol minden inputot, akkor addig nem tud a juzer játszani
szóval nem igazán értem, hogy ezzel mit tudok elérni... főként, hogy a forráskód működését sem igazán értem... pl hol az a rész, ahol számol? semmi ciklus nincs benne
szóval még1x: a proginak számolnia és kiírnia kéne az eltelt sec-eket, lehetőség szerint tudjon pause-t is
ha vki tud jobb (vagy egyszerűbb) megoldást, ne tartsa vissza!
egy másik: mi pontosan magyarul a file descriptor, azon kívül, h fájl-leíró vmi -
emitter
őstag
válasz emitter #1309 üzenetére
egyébként nem is fordul a példakód, ezt dobja:
emitter@LAPTOP:~$ gcc -Wall -o time_select time_select.c
time_select.c: In function ‘input_timeout’:
time_select.c:21: warning: implicit declaration of function ‘TEMP_FAILURE_RETRY’
/tmp/cck7Ph7m.o: In function `input_timeout':
time_select.c: (.text+0x73): undefined reference to `TEMP_FAILURE_RETRY'
collect2: ld returned 1 exit status
emitter@LAPTOP:~$
mod: auto szmálji-konverzió
[Szerkesztve] -
Jester01
veterán
válasz emitter #1309 üzenetére
A TEMP_FAILURE_RETRY gondolom csak egy kis makró volt, ami addig próbálja a selectet amíg 0-t vagy 1-et ad vissza (vagyis nem hibát). Neked ez eleve nem jó, mert majd újra kell számolni a timeout-ot. Szóval simán hagyd el.
Úgy kell használni, hogy nyilvántartod mennyi idõ múlva esedékes a következõ frissítés, ez lesz a timeout értéke az input_timeout hívásban (kicsit át kell alakítani, hogy ne csak másodperceket tudjon). A filedes az az STDIN_FILENO, ahogy a példában is van. Megvizsgálod az input_timeout visszatérési értékét: ha 0 akkor timeout miatt tért vissza, vagyis az idõt kell kiírni. Ha 1 akkor a felhasználó nyomott egy billenytût amit nyugodtan beolvashatsz a getch()-val, már nem fog blokkolni.
Ezután lekéred az idõt, újraszámolod a timeout értékét és ismét mehet a select. Ne a time() függvényt használd, mert nagyobb pontosságra van szükség, hanem a gettimeofday-t.Jester
-
sekli
addikt
Lenne egy nagyon láma kérdésem:
RealBasic-ben, ami lényegében egy VisualBasic, hogy lehet megoldani:
pl.: egy gomb megnyomására történjen valami, és még lefusson egy másik gomb Sub Action() részénél lévő rész is, meg lehetne ugy is oldani, hogy bemásolom, de ugy nagyon macerás lenne vmit módosítani...
HELP! -
Jester01
veterán
válasz Protezis #1308 üzenetére
C++ -ban hogy hozok létre lokális objektumot a veremben?
Ha függvényen belül definiálod, akkor az a verembe kerül, úgy mint minden más változó (automatikus változónak hívják, ha jól tévedek.) Explicit még az alloca és a placement new operátor segítségével, vagy felüldefiniált new operátorral tudsz a veremben létrehozni objektumot (ezek már csak a guruknak )Jester
-
Jester01
veterán
Ha ez a RealBasic Visual Basic 6.0 szintaxisú, akkor így:
Elsõ verzió (ajánlott):
Private Sub Button1_Click()
CommonAction
End Sub
Private Sub Button2_Click()
' button2 code
CommonAction
End Sub
Private Sub CommonAction()
' common code
End Sub
Másik verzió:
Private Sub Button1_Click()
' common code
End Sub
Private Sub Button2_Click()
' button2 code
Button1_Click
End SubJester
-
Jester01
veterán
válasz emitter #1316 üzenetére
5? Azt ne írja már ki ...
nem kaptam választ arra, h mi is az a file-descriptor
Pontosan az, amit írtál. Egy szám amivel alacsony szinten fájlokra lehet hivatkozni. A 0,1,2 sorban az stdin, stdout és stderr, de ezekre van makró. (STDIN_FILENO & co)
A select akkor tér vissza ha valamelyik fájlon a kért írás vagy olvasás elvégezhetõ avagy a timeout letelik. Jelen esetben arra használjuk, hogy térjen vissza ha történt gombnyomás (vagyis ha az stdin-rõl van mit olvasni) vagy letelt a következõ frissítésig hátralévõ idõ.Jester
-
Protezis
őstag
válasz Jester01 #1313 üzenetére
És az adatszegmensbe mikor kerül? Ha static-ként hozom létre?
Jegyzetben ez van:
''a.) sztatikus objektum létrehozása az adatszegmensben
Fraction a, b, c(3), D(5,2), e(”12/65”) ;
b.) lokális objektum létrehozása a veremben
void Add(Fraction f1, Fraction f2 = Fraction(”0/1”))
{
Fraction res(0) ;
...
}
A fenti Add eljárásban szereplő Fraction(0,1) egy úgynevezett objektum konstans. Objektumokat tartalmazó kifejezésekben vagy default paraméterek esetén használhatjuk.
Objektum példányokból további összetett adatstruktúra építhető fel: például tömb, mátrix, létrehozható objektum példányra mutató pointer, vagy objektum példány értékű függvény.
Fraction f = 32 * Fraction(6,8) + Fraction(9,15) ;
Fraction f[5,5], *pFr, Add(Fraction &, Fraction &) ;''
És van a dinamikus, az érthető. De ha a sztatikus objektum kerül az adatszegmensbe, akkor az a) pontban miért nincs előtte, hogy static?
Igen, én is úgy tudtam C-beli tanulmányaim alapján, hogy függvényen belül deklarált változó a verembe kerül, C++ -ban ráadásul belső blokkon belül is deklarálhatunk, és a blokkból való kilépésnél meg is szűnik. De így meg az a) pont nem világos. -
Jester01
veterán
válasz Protezis #1321 üzenetére
Sajnos a static kulcsszót több célra is használja a C és a C++ is
Ha egy változót függvényen és osztályon kívül hozol létre (hogy is mondjuk ezt? ), akkor az az adatszegmensbe kerül. A láthatóságát befolyásolja, hogy static vagy sem. Elõbbi esetben modulváltozó utóbbi esetben globális változó lesz. Globális változó másik modulból extern kulcsszóval deklarálva látható.
Ha függvényen belül vagy, akkor a static az ekvivalens egy modul változóval aminek a láthatósága az adott blokkon belülre korlátozódik.
Tömören: függvényen kívül mindig adatszegmens, a static a láthatóságot adja meg. Függvényen belül a láthatóság mindig az aktuális blokk végéig tart, a static az élettartamot adja meg.
Remélem jól mondomJester
-
emitter
őstag
válasz Jester01 #1318 üzenetére
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
int
input_timeout (int filedes, unsigned int seconds)
{
fd_set set;
struct timeval timeout;
/* Initialize the file descriptor set. */
FD_ZERO (&set);
FD_SET (filedes, &set);
/* Initialize the timeout data structure. */
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
/*
// select returns 0 if timeout, 1 if input available, -1 if error.
return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
&set, NULL, NULL,
&timeout));
*/
}
int
main (void)
{
fprintf (stderr, ''select returned %d.\n'',
input_timeout (STDIN_FILENO, 9));
return 0;
}
pedig 5-öt ír ki, illetve azt amit megadok neki az input_timeout-nál
azt mondtad h szedjem ki a temp_failure-t, hát kiszedtem, de így meg a select ha jól látom, nem is hívódik meg sehol...
a timeout-ot még mindig nem értem: ez a kód hol számol vissza, mettől, és egyáltalán miért jó nekem ha visszaszámol? Vagy hogyan értelmezzem ezt a timeout-dolgot -
Protezis
őstag
válasz Jester01 #1322 üzenetére
Azt olvasom, hogy ha a global scopeban (nem ez a válasz a kérdésedre? ) deklarálok static kulcsszóval egy változót, az a fájl scopeba kerül, adatszegmensben lesz eltárolva, ha függvényen belül deklarálom, akkor csak az adott blokkon belül lesz látható, de a blokkból való kilépéskor nem szűnik meg, értékét megtartja, tehát ekkor is az adatszegmensben lesz eltárolva.
Ez így világosnak tűnik számomra. Lényegében ezt mondtad te is, csak én annyival mondtam többet a jegyzet alapján, hogy mindkét esetben az adatszegmensben lesz. De objektumok esetén is így kell eljárni? De akkor az a.) pontban miért nincs ott a static szó a típus előtt?
Mert úgy a logikus, hogy csak akkor kell adatszegmensben tárolnom valamit, ha annak a program futása alatt végig léteznie kell, ehhez pedig kell a static szó függetlenül a különböző láthatóságokon. Fraction a; mitől sztatikus? pfffff -
Jester01
veterán
válasz emitter #1323 üzenetére
azt mondtad h szedjem ki a temp_failure-t, hát kiszedtem, de így meg a select ha jól látom, nem is hívódik meg sehol
Persze, mert azt is kiszedted Talán azt hagyd benne, a return-nel egyetemben.
return select (FD_SETSIZE, &set, NULL, NULL, &timeout));
Már most nem tudom hogyan magyarázzam, ha az elõzõt nem értetted.
Na még egy próba.
Nézzük onnan, hogy mit szeretnél:
1. Ha a felhasználó megnyom egy gombot, akkor arra reagálni akarsz.
2. Másodpercenként kiírni az idõt.
3. Közben nem terhelni a processzort.
A 3. pont miatt meg kell mondani az operációs rendszernek, hogy az 1. és 2. események bekövetkeztekor fusson a progi. Ezt például a select függvénnyel lehet, ami azt tudja, hogy figyel tetszõleges számú fájlleírót megadott ideig. Billentyûleütés akkor van, ha a stdin fájlból van mit olvasni. Ezt szépen meg lehet adni a select-nek. Sajnos azt viszont nem tudja, hogy másodpercenként térjen vissza akkor is ha nincs billentyûleütés, csak várakozási idõt lehet neki megadni. Ezért a 2. pontot kicsit át kell fogalmazni, mégpedig úgy, hogy nem azt mondod, hogy másodpercenként, hanem azt, hogy a következõ másodpercig. Ezt pedig úgy csinálod, hogy minden frissítésnél illetve a select meghívása elõtt lekéred az idõt (a gettimeofday függvénnyel, mert kell a pontosság!) és a timeout értéket ebbõl számolod, értelemszerûen: timeout = elõzõ frissítés + 1mp - aktuális idõ.
A select visszatérési értéke elárulja, hogy az 1. vagy a 2. feltétel következett-e be, vagyis a felhasználó megnyomott egy gombot (ekkor getch() és eseménykezelés) vagy pedig a várakozási idõ járt le (ekkor idõ frissítése kell.).Jester
-
emitter
őstag
válasz emitter #1323 üzenetére
najó elég béna voltam, nem godnolkoztam
szóval müxik, de nem teljesen úgy ahogy én akarom:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
int
input_timeout (int filedes, unsigned int seconds)
{
fd_set set;
struct timeval timeout;
/* Initialize the file descriptor set. */
FD_ZERO (&set);
FD_SET (filedes, &set);
/* Initialize the timeout data structure. */
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
// select returns 0 if timeout, 1 if input available, -1 if error.
return select (FD_SETSIZE,
&set, NULL, NULL,
&timeout);
}
int
main (void)
{
int i=0;
while(i<10)
{
if( input_timeout(STDIN_FILENO, 1) )
{
printf(''gomnyomas tortent '');
printf(''%d\n'',i);
i++;
}
else
{
printf(''%d\n'',i);
i++;
}
}
return 0;
}
ugyanis pl. 3 mp-ig várok, ok, számol 3-ig
aztán nyomok 1 entert, ekkor azt kéne kiírnia, h ''gomnyomas tortent 4''
majd kéne tovább számolnia, nem?
ehelyett ezt írja:
gomnyomas tortent 4
gomnyomas tortent 5
gomnyomas tortent 6
gomnyomas tortent 7
gomnyomas tortent 8
gomnyomas tortent 9
és mindezt 1 pillanat alatt, mintha már nem számolna a timeout
mit rontottam el -
Protezis
őstag
válasz Jester01 #1327 üzenetére
Kösz szépen
Igen, elolvastam, amit írtál, és ezt mondtad valóban, csakúgy, mint én a válaszomban. Mindössze a jegyzetemet nem értem. Akkor egyetlen magyarázat az ottani példára, hogy azok globális változók, azért nics ott a static (és mégis az adatszegmensben vannak)
Mégegyszer köszönöm -
Mr.gonzales
csendes tag
Sziasztok!
Kérdésem,hogy találkozott-e már valaki a grafilogika nevezetű igen érdekes játékkal,
és e találkozást megörökítette-e pl. c++-ban írt kód formályában is???
Azaz:kódolta-e már valaki ezt a játékot és a forrást - akár nagyon lebutítva - oda tudná e adni nekem?
Előre is köszönöm a segítséget,Jani.zavard össze a világot: mosolyogj hétfőn!
-
emitter
őstag
válasz Mr.gonzales #1332 üzenetére
hi!
én ezt találtam csak az a baj, h prolog nyelven
talán segít valamiben
[link] -
emitter
őstag
válasz Jester01 #1328 üzenetére
na, így egy fokkal jobb, de a fflush vhogy nem műxik
szóval azt szeretném, h ha nyomok 1 entert, vagy bármilyen más billt, akkor az ne jelenjen meg a képernyőn. Ráadásul most csak az entert érzékeli lenyomásként, a többi karakterre nem írja ki h ''gomnyomas tortent''
emitter@LAPTOP:~$ ./time_select
0
gomnyomas tortent 1
2
gomnyomas tortent 3
gomnyomas tortent 4
gomnyomas tortent 5
6
j7
gomnyomas tortent 8
9
emitter@LAPTOP:~$
vagy nem volt érthető, h mi a hiba
ja és getch()-re parázik, csak getchar-t fogadja el
time_select.c.text+0xac): undefined reference to `getch'
collect2: ld returned 1 exit status
mod: kód: [link]
[Szerkesztve] -
Jester01
veterán
válasz emitter #1334 üzenetére
Igen, ez alap linuxon. A bemenet soronként pufferelt és echo módban van.
Használd a wincon.h-t, azért írtam
A terminálkezelõ curses könyvtár átkapcsolja a bemenetet és van benne getch is.
Egy kicsit módosítani kellene a headert, mert az inicializálás eléggé igénytelen módon az aknakeresõ progidhoz van illesztve (ha jól emlékszem arra épít, hogy az elsõ hívás egy képernyõtörlés lesz.)Jester
-
KngAlex
tag
Tud itt valaki assembly-ben programozni?
-
azsolty
csendes tag
Sziasztok! Nemreg ismerkedem a C-vel es van egy-ket dolog ami nem tiszta, remelem lesz itt olyan aki tud es hajlando segiteni
(Elore is bocs a valoszinuleg lama kedesekert!)
Szet akarom szorni a fuggvenyeimet tobb helyre ezert van egy kulon file amiben hasznos fuggvenyek vannak (a .h pedig includeolva a fo .c-bol). Az egyik ilyen egy struktura inicializalasat csinalna.
Valami ilyesmi lenne:
int initparamarray(struct authinfo userinfo);
A fuggvenyben pedig mindenfele memset es default ertek beallitasok vannak.
A bajom az, hogy az inicializalas megtortenik (a fuggvenybol kiiratva a struktura elemket a megfelelo ertekeket kapom), viszont a main()-ben ezek mar uresek. A valtozok viszont inicializalva maradtak, mert tudom irni oket rendesen, csak az ertekek vesznek el. (int -> 0, char -> ures).
Mit csinalok rosszul? -
k.t.a.
senior tag
válasz azsolty #1340 üzenetére
A függvénynek pointereket adj át szerintem, és akkor jó lesz.
Pl.: típus függvénynév( *típus változó1){*változó1 = érték;}
Amikor meghívod akkor meg függvénynév( &változó2);
Talán nem írtam nagy hülyeséget.
Meg tudna valaki lepni egy dinput8.h fájllal a DirectX8SDK-ból. Tudom, hogy le lehet tölteni az m$ oldaláról, de túl sok az egész sdk, meg .... tudjátok. Thx -
Miracle
senior tag
válasz azsolty #1340 üzenetére
ez a parameteratadasi mod, amit itt irsz az ertek szerinti parameter-atadas. az aktualis structrol, amivel meghivod a fv-t keszul egy masolat, es azon dolgozol a fv belsejeben vegig. amikor a fv. visszater a masolatod (ami a fv. torzseben lokalis valtozo) elvesz teljesen. ez termeszetesen mas parametertipusokra is vonatkozik, intek, mas structok, pointerek is.
ha Ct hasznalsz ket megoldas van:
1: visszaadod visszateresi ertekkent, ez nagon nem hatekony, de igy kell kevesebbet gepelni.
2: int initparamarray(struct authinfo *userinfo);
ilyenre modositod a fvt, azaz atirod szepen a mezo-elereseket pointeren keresztulive, es amikor hivod a fv-t pointert adsz at.
ha c++t hasznalsz, akkor eleg modositani a fv. headerjet ilyen modon:
int initparamarray(struct authinfo &userinfo);
es mar meg is oldodott a problema, ez a referencia szerinti atadasértelmező késziszótár :: rekurzió --> lásd : rekurzió
-
Miracle
senior tag
hmm. tomb biztos lehet, hiszen a tomb parameteratadaskor pointerkent viselkedik... struct az lehet gazosabb, az lehet hogy standard C szerint nem, de erdemes megnezni hatha a forditod engedi, vagy hatha a C99 mar tudja...
en alapvetoen C programokhoz is c++ forditot hasznalok, igazi C forditok neha nyuszitettek hulyesegekert, azota inkabb elkerulom oketértelmező késziszótár :: rekurzió --> lásd : rekurzió
-
k.t.a.
senior tag
válasz Miracle #1344 üzenetére
Utána néztem és a függvényeknek nem lehet tömb visszatérési értéke. Ezt az egyetemi jegyzetemben találtam.
Esetleg valaki nem tudna küldeni az adataimnál lévő címre egy dinput8.h fájlt. Mert a 9-es dirctx sdk-ban nincs benne, csak a régebbi 8.0-ásban volt, és szükségem lenne rá. THX -
Miracle
senior tag
hat akkor az egyetemi jegyzetedet olyan bizalommal forgasd hogy aki irta bizony meg nem programozott Cben igazan, ugyanis mint mondtam tombok parameteratadaskor pointerre konvertalodnak, es pointert adhatsz vissza, az pedig mutathat tombre, szoval ugyan annyira lehet tomb parameter, mint visszateresi ertek
értelmező késziszótár :: rekurzió --> lásd : rekurzió
-
azsolty
csendes tag
válasz Miracle #1342 üzenetére
Kosz a kimerito valaszt!
A 2-es verzio mukodik mert struct-ot nem lehet visszaadni. (Mivel osszetettebb muveletek is belekerulhetnek ilyenkor mugysem rossz ha az int altal visszateresi erteket tudok adni a belso folyamatokrol).
A sikeren folbuzdulva lenne egy mas jellegu kerdesem is: tud valaki olyan kesz kodrol ami az egyszeru config file-ok beolvasasat (param=value formatumu text file) elvegzi es osszekapcsolja a belso valtozokkal? Beleneztem mar par opensource programba amelyeknek ilyen a config fileja de tobbnyire tulsagosan bele van integralva a program tobbi reszebe ez a kod ahhoz hogy egyszeruen ki tudjam emelni... -
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Apple Watch Sport 7000 - 38 mm - Doboz/Papírok/Szíj
- Apple Mac Mini M1 - 16 GB / 1 TB - kifogástalan állapotban
- Tunai FireFly: A Bluetooth vevők királya autó aux vagy régebbi hifi!
- Van Damme Silver Lo-Cap 55 Interconnect RCA-pár, Viborg csatlakozókkal! Audiofil hang! 2x1 méter ho
- XBOX One Special Edition kontroller