Minden process indulásakor egy fix random poollal indul, ezért a rand függvény alapból mindig ugyanazokat az egymás utáni számokat adja vissza. A megoldás erre az srand függvény, ami egy általad megadott értékre állítja a random poolt. Ha ez az érték (nem megjósolhatóan) kvázi-véletlen, akkor kapod azt, amit szeretnél. Viszonylag jó kvázi-véletlen számot lehet kapni például úgy, hogy a gettimeofday() függvénnyel lekéred az epocs óta eltelt milliomodmásodperceket és xor-olod a processed pid-jével. Valódi véletlenszámokat pedig a /dev/random olvasásával kaphatsz, ezeket a billentyűleütések/egérmozgások/hálókártyainterruptok között eltelt időből kalkulálja ki a kernel.
Stringeket c-ben így nem lehet összehasonlítani. A "help" kifejezés egy h,e,l,p,0 byteokat tartalmazó, csak olvasható bytesorozatot fog létrehozni egy, a process számára csak olvasható memóriaterületen, majd pedig a "help" kifejezésekben ennek a helynek a pointere lesz. Az argv[i]=="help" pedig nem akkor lesz igaz, ha az i. argumentum az, hogy "help", hanem akkor, ha ugyanarra a "help"-re mutat. Tehát soha nem lesz igaz, mivel az argv-k pedig írható memóriaterületen vannak.
Ami neked kell, az egy strcmp. (Az strcasecmp még jobb, az nem különböztet meg kis és nagybetűt). Ehhez kell egy #include is. Használata az if-ben: !strcmp(argv[i],"help"). A '!' nem véletlenül kell oda, sajnos a standard libc függvényei néha egy kicsit viccesek :( Itt pl az strcmp akkor lesz igaz, ha a stringek különböznek.
Egyébként a példa progidban a #include mögé kell még egy is, valamint a main-ból a gcc csak return-nal szereti, ha kilépsz (ez utóbbi warningon kívül más bajt általában nem okoz).
A parancssori argumentomkat szeretném felhasználni a prgramok (pédál kapcsolók használata). Ám az alábbi kód nem az csinálja amit szeretnék. Vajon mi a baj? Ha a címen lévő értéket (&arv[i]) akarom összehasonlítani akkor azt monja a fordító hogy pointer inttel nem lehet összahasonlítani.
#include
int main (int argc, char* argv[])
{
int i;
printf("A parancssori argumentumok száma: %d\n\n", argc);
for (i = 0; i < argc; i++)
{
printf("Az %d. argumentum %s\n", i, argv[i]);
}
for (i = 0; i < argc; i++)
{
if (argv[i]=="help") {printf("Segítséget kértél!");}
}
}
Kező programozóként véletlen számokat szertnék genrálni 1 és 10 között. A mellékelt kis pogram futásának az eredménye azonban mindig 1. Mit szúrok el? Előre is kösz a helpet!
#include #include
int main()
{
int i = 0;
i = rand()%10;
printf("A veletlen szam 0 es 10 között: %d\n", i);
return 0;
}
Egy eszrevetel. Bar a problemat nem oldja meg, de.
libc doksi, arithmetic functions - parsing of numbers - parsing of integers:
- Function: long int atol (const char *STRING)
This function is similar to the `strtol' function with a BASE
argument of `10', except that it need not detect overflow errors.
The `atol' function is provided mostly for compatibility with
existing code; using `strtol' is more robust.
- Function: int atoi (const char *STRING)
This function is like `atol', except that it returns an `int'.
The `atoi' function is also considered obsolete; use `strtol'
instead.
a strtol() pedidg ott van legfelul, PgUp-ra kell picit tenyerelni.
Egy nagyon alap problémám lenne, egy stringben lévő számot szeretnék egésszé konvertálni.
Erre van egy függvény:
int atoi(const char *string);
És ha minden jól ment, akkor a visszatérési értéke az egész szám lesz.
Nos, az a problémám, hogy fogom megkapni a visszatérési értéket.
Mert Windows alatt így működik:
szam=atoi(const char *string);
Viszont Linux alatt reklamál a fordító, hogy lehagytam az elejéről az int szót.
Elég nevetségesnek tűnik, de én még nem jöttem rá :)
Aki tud segíteni, annak előre is köszi.
Ize megy szepen. Viszont lenne meg vele egy problemam.
Ha a programot(bot) elinditom, akkor az _nem_ lep ki.
Csak Control-C-re. Es ilyenkor nem keletkezik gmon.out.
Tehat valahogy ugy kene megcsinalni, hogy meg lehessen szakitani a futasat.
Mert ha veletlenul megszakadna a szervertol, akkor ujra kapcsolodik.
Tehat most meg vagyok love.
Szoval valahogy ezt kene meg megcsinalnom jol...
Tehat a Control-C hogy tudom megadni ugy, hogy gmon.out is legyen belole?
Ha debuggolni akarsz (és nem profile-t csinálni) akkor gcc -g akarmi.c -o akarmi majd ddd akarmi (de Pl. a KDevelop vagy az Anjuta tud IDE-n belül is debuggolni, de a ddd az igazi. Meg van egy kdbg is ami nekem annyira nem jött be, meg egy gvd (gnu visual debugger) ami szintén nem rossz, bár nekem a ddd jött be igazán).
Namost debuggolni akarsz, vagy profilirozni?
Debuggolasra a gdb, xxgdb valo.
Egyebkent jol latom, hogy te az objekt modult (valami.o) akarod futtatni? En altalaban a kesz programot szoktam futtatni (abbol ismerszik meg, hogy nincs kiterjesztese).
Na egy oriasi problemam lenne.
Nemtok normalisan megirni egy Makefile-t es nem tudom, hogy mit, es hol csesztem el.
Ez egy kicsit hosszu ide leirni, de ha valakinek lenne egy szabad 5 perce, akkor megnezne?
(atkuldenem neki levelben az egesz programot)
Nem nagy progi vegulis.
Eleg fontos lenne....