-
Fototrend
Új hozzászólás Aktív témák
-
Jester01
veterán
csillagászati okai vannak?
Igen. Az év hossza (kb) 365.242199 nap. Vagyis 4 évente majdnem egy teljes nap (0.97) csúszás van.
Ha ezt teljes napként korrigáljuk, akkor 100 év alatt már kb 0.78 nappal ''túlkorrigáltunk'', ezért azt visszavesszük (igazából elég lenne 125 évenként, de így egyszerûbb). Így viszont megint alulkorrigálunk, ezért a 400 éves szabály. És így tovább. Ráadásul a szökõmásodpercekrõl még nem is beszéltünk.Jester
-
Jester01
veterán
Az ncurses sem kifejezetten linuxos és azt különben is csak a referencia miatt tettem be.
Maga a curses (mert azt írtam) az platformfüggetlen, van windowsra is.
A winapinál meg ne keverjük a szezont a fazonnal. Winapi, mert az operációs rendszert szerencsétlen módon windowsnak hívják. De ezek nem grafikus függvények, mint ahogy egy csomó más winapi függvény sem. Például a kurzor pozíciót a SetConsoleCursorPosition függvénnyel lehet állítani.
Sajna konkrétan devc-hez nem értek, nem tudom mire lehet rávenni és mire nem.
A haragos smileyt meg mivel érdemeltem ki?Jester
-
Jester01
veterán
Akkor biztos a szokásos wildcard globbingra gondol (* és ?), ehhez az fnmatch függvény kell még neked.
Az adatbázis készítéshez megnyitod a megadott kiindulási directoryt (opendir), végigmész a bejegyzéseken (readdir) amiket kiírsz egy szövegfájlba. Ha directoryról van szó, akkor rekurzívan meghívod ezt a feldolgozó függvényt. A végén szépen bezárod a directoryt (closedir).
Keresésnél simán sorokat olvasol az adatbázis fájlból és az fnmatch függvényt hívogatva ellenõrzöd az illeszkedést. Ha nem találtál semmit, akkor meghívod az adatbázis készítõ függvényt és újra próbálod.
Még arra érdemes esetleg figyelni, hogy abszolút elérési utat használj.
Ha konkrét kérdésed van írj ide, dobj mailt, vagy nyugodtan keress aimon.Jester
-
Jester01
veterán
Igen, ez az oprendszer része. Kérdés, van-e hozzá header és lib, de ne már, hogy ne legyen.
Header Declared in Wincon.h, include Windows.h.
Library Link to Kernel32.lib.
DLL Requires Kernel32.dll.
Egyébként egy win32 curses implementáció a pdcurses. [link]
[Szerkesztve]Jester
-
Jester01
veterán
viszont nem igazán tudom értelmezni a clrscr() -t
Ez a kód egy-az-egyben a microsoft oldaláról van, csak kitörölték a megjegyzéseket Itt az eredeti: [link]
ha egy konzolablakban véget ér valahol a szöveg, akkor az utolsó karakterhelyen áll valamilyen lezárókarakter
Nem.
hogyan oldhatnám meg, hogy takarékosság miatt pontosan csak az utolsó sorig törölje a képernyőt
Megjegyzed mennyit írtál ki.
az adott kurzor-pozíción álló karaktert adja vissza
ReadConsoleOutputCharacter [link]Jester
-
Jester01
veterán
az mit jelent hogy ''invalid use of array with unspecified bounds
Nemtom, szerintem pont olyasmit, amihez ismerni kellene a méretet. (sizeof pl.)
szóval egy függvénynek akarom átadni a tömböt paraméterként, és a fv belül kéne, h tudja a sorok és oszlopok számát
Ehhez át kell adnod a méretet is paraméterben.Jester
-
Jester01
veterán
még csak most tanulgatom a C-t, nem megy minden elsőre
Semmi probléma, próbálkozz és kérdezz nyugodtan
Alapvetően szebb, ha nem globális a tömböd. És hogy egyszerűbb legyen dolgozni vele,
rakd bele egy struktúrába, pl így:struct cell {
...
};
struct state {
int xsize;
int ysize;
struct cell* cells;
...
};
Innentől kezdve elég egy state típusú változót átadni a függvényeidnek, és egyben megkapják a szükséges információkat. Ha valóban kétdimenziós tömböt akarsz, akkor
struct cell** cells kell, csak ilyenkor bonyolultabb az inicializálás és felszabadítás (cserébe viszont egyszerűbb az indexelés).Jester
-
Jester01
veterán
aha, akkor ezt most a main-be írjam?
A típus deklarációt ne (azt kirakhatod egy header fájlba), csak a példányosítást.
mit tárolnék a cell típusban?
Amit akarsz, te írtad: egy két dimenziós tömbben tárolnám az egyes cellák tulajdonságait, azaz a tömb minden eleme egy struktúra lennestruct state {
int xsize;
int ysize;
struct cell** cells;
...
};
A kétdimenziós tömb tulajdonképpen egy pointertömbre mutató pointer, ezért ciklusban kell lefoglalni:
[link]
Figyelj oda, hogy a te példádban definiáltál egy cella nevű globális változót, amire nincs szükséged. Ha tulajdonképpen rövid nevet akartál, akkor egy typedef kell elé:typedef struct cell
{
int vmi;
int vmi;
...
} cella;Jester
-
Jester01
veterán
válasz emitter #1000 üzenetére
A foglaláskor és a felszabadításkor a belsõ ciklusban cella[i] kell, hiszen az i. sort (oszlopot) piszkáljuk. Általában (persze nem mindig) eleve gyanúsak az olyan ciklusok amelyek magjában nincs hivatkozás a ciklusváltozóra. Te pedig ugyanazt a változót írtad felül úrja meg újra.
A bekérõ kód kicsit zavarosra sikerült, a végtelen ciklustól eltekintve is.
A temp változót fölösleges kinullázni, hiszen úgyis értéket adsz neki.
A típusa feltehetõleg int, mivel a scanf azzal tér vissza. Márpedig ha ez így van, akkor ne NULL-lal hasonlítsd össze, mert az pointer.
Az az összehasonlítás egyébként teljesen felesleges, hiszen a kilépési feltétel elegendõ. Nézd meg hogyan lehet bekapcsolni a figyelmeztetéseket a fordítóban, szokott segíteni. Gcc pl. a fenti összehasonlításért is szól:
warning: comparison between pointer and integer.
A végtelen ciklus pedig azért van, mert a scanf abbahagyja a beolvasást az elsõ olyan karakternél amit nem tud értelmezni. Igy aztán legközelebb megint belefut. Ki kell ûríteni az input puffert, pl. ilyesmivel:while(getchar() != '\n');
[Szerkesztve]Jester
-
Jester01
veterán
Also hatar=0
Felso hatar=1.5
Hany reszre osszam be a szamkozt?15
0.100
x y
_____________________
0.000 3.980
0.100 3.952
0.200 3.876
0.300 3.753
0.400 3.584
0.500 3.374
0.600 3.125
0.700 2.842
0.800 2.530
0.900 2.194
1.000 1.842
1.100 1.481
1.200 1.120
1.300 0.769
1.400 0.440
1.500 0.151
Google szerint jók
(A dx kiíratásnál kimaradt egy f betű a formátumstringből)Jester
-
Jester01
veterán
válasz emitter #1014 üzenetére
Sajnos az üres sort már a scanf lekezeli, úgyhogy muszáj lesz fgets/sscanf párosra átállni.
A 9,10g esetet pedig úgy lehet megvizsgálni, hogy megköveteljük a sorvég jelet a második szám után:do{
char buf[80];
char c;
printf(''Mekkora palyan szeretne jatszani? (sor,oszlop) '');
fgets(buf, 80, stdin);
temp=sscanf(buf, ''%d,%d%[\n]'', &mx, &my, &c);
} while( (temp!=3) );
Ezzel most még az a baj, hogy a sor lehet hosszabb mint 80 karakter, házi feladat, hogy ezt még ellenőrizd.Jester
-
Jester01
veterán
válasz emitter #1016 üzenetére
miért foglal a progim a windóz szerint 44kB-ot, mikor van összesen 6 int változóm, összesen 12bájtot kéne foglalni nekik, nem?
Programkód, verem, betöltött dllek ...
Egyébként az int az 32 bites szóval 24 byte.
én számításaim alapján 2mb-ot kéne foglaljon, mégis 4megát foglal
Lásd fennt, valamint van overhead is. Plusz ha debug verziót fordítasz akkor sokkal több helyet foglal.
segítsetek pls
Honnan tölthetem le a kódot?Jester
-
Jester01
veterán
válasz emitter #1024 üzenetére
Ez az eredeti verzió. Az mindenképpen igaz, hogy a ciklusnak addig kell futni, amennyit foglalsz. Csak nem a ciklus a rossz, hanem a foglalás, mivel a progidban egyébként az y az első koordináta. Szóval így:
mezo=malloc(my*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
for(i=0;i<my;i++)
{
mezo[ i ]=malloc(mx*sizeof(palya));Jester
-
Jester01
veterán
válasz emitter #1028 üzenetére
1. A létező fájlt illene bezárni akkor is, ha a felhasználó nem kér felülírást.
2. Ha a c != 'i', akkor a return miatt visszatér, így a while-ban nincs is mit ellenőrizni. Amit különben is elrontottál, hiszen csak akkor lépne ki, ha a c egyszerre 'i' és 'n' is, ami lehetetlen.
3. Az itoa inicializálatlan területre fog írni. Ha szöveges mentést akarsz csinálni, akkor egyszerűbb az fprintf(f, ...) formát használni.Bináris mentéshez fwrite.
4. A mentésednek nem sok értelme lesz, ha nem írod bele a pálya méretét.
5. fclose előtt nem szükséges fflush (de nem is árt - ezt akár benne is hagyhatod)Jester
-
Jester01
veterán
válasz emitter #1032 üzenetére
Azért mert neked kell előre lefoglalni a helyet a stringnek.
Ugyanez igaz a scanf-re is, gondolom ezért fagy a progid.
És ha már lefoglaltad a helyet, akkor biztosítani kell, nehogy túl sokat írj bele (ez az ún. buffer overrun, ami azon kívül, hogy bug még biztonsági rés is)
A helyet statikusan vagy dinamikusan foglalhatod. Pl. az itoa esetén legrosszabb esetben 12 byte hely kell, úgyhogy a char* s helyett írhatsz char s[ 12 ]-t.
De továbbra is ajánlom az fprintf-et mert akkor nem kell bufferrel szórakozni.Jester
-
Jester01
veterán
válasz Boolash #1043 üzenetére
Mail ment, de ide is beírom:
Azt leszámítva, hogy a bill() függvény nincs definálva sztm ez jó. Legalábbis szintaktikailag. Mi a pontos hibaüzenet?
Most pedig néhány megjegyzés:
1) A kiíratások után fflush(stdout) kell, nem pedig fflush(stdin).
2) Kerüld a gets() függvényt, mert nem ellenõrzi a hosszt. Mi történik, ha 15 karakternél hosszabb telefonszámot írok be? Helyette használhatod az fgets() függvényt.
3) A gotoxy varázslás helyett ajánlom, hogy nézz utána a printf formátumsztringeknek. Pl. egy ''%-30s %15s %-30s'' vagy hasonló szerintem megfelel a célnak.
De különben még mûködik is
[Szerkesztve]Jester
-
Jester01
veterán
válasz Protezis #1060 üzenetére
Csak kicsit pontosítok: a hülye VC sehol nem keresi a fájlt. A relatív útvonalak mindig az aktuális munkakönyvtárhoz képest értendők. Ha a progidat egy másik dirben állva parancssorból indítom, akkor sem fogja megtalálni. Ha a progidat tartalmazó könyvtárra van szükséged, akkor a GetModuleFileName API függvénnyel kérdezd le az exe abszolút fájlnevét, és abból vágd le a könyvtár nevét.
Jester
-
Jester01
veterán
Először rendezd abc sorrendbe a beadott szót. Ez gondolom menni fog.
Utána csinálj egy tömböt amiben jelzed, ha egy betűt már felhasználtál.
Alapesetben ez legyen csupa igaz érték (true/1).
Egy másik tömbben pedig a permutált indexeket gyűjtöd, ez alapesetben egyesével nő.
Rögvest írd is ki, mert ez lesz a legelső permutáció.
A következőt pedig úgy kapod meg, hogy az utolsó karaktertől elindulsz és mindig megkeresed a következő fel nem használt betűt. Ha már nincs ilyen, akkor lépsz eggyel visszább (ha nem tudsz, akkor kész vagy). Amint találtál egyet, ismét elindulsz előre és szépen veszed az első fel nem használt betűt.
Igy valahogy:for(i = len - 1; i >= 0; i--)
{
int current = indices[ i ];
used[current] = 0;
current = findnextunused(used, current + 1, len);
if (current < len)
{
indices[ i ] = current;
break;
}
}
if (i < 0)
{
break;
}
indices[++i] = findnextunused(used, 0, len);
for(i++; i < len; i++)
{
indices[ i ] = findnextunused(used, indices[i - 1] + 1, len);
}
A findnextunused függvényem második paramétere a keresés kezdőpozíciója.
A megtalált betűt be is jelöli, hogy használatban van.
Biztos van egyszerűbb módja, mindig is utáltam a kombinatorikát
Emitter: a rekurziót is utálom De azért persze szoktam használni.
MOD: [ i ]
[Szerkesztve]Jester
-
Jester01
veterán
válasz emitter #1075 üzenetére
fscanf példád azért nem jó, mert a \n whitespace, és mint ilyen, azt jelenti, hogy bármennyi bármilyen whitespace lehet ott. Helyette (ha mindenképp fscanf kell) a fscanf(f, ''%*[\n]'') lehet jó. Mit jelent az, hogy új sorra pozícionálni? Eldobni a sorból hátralévõ összes karaktert? fscanf(f, ''%*[^\n]%*[\n]'').
Az fgetc() karaktert olvas be.
A sor helyes, csak nem azt csinálja amire te feltehetõleg gondolsz. Az i egymás utáni hívások esetén 48 vagy 49 lesz (a 0 és az 1 ascii kódja).Jester
-
Jester01
veterán
válasz emitter #1070 üzenetére
remélem működni fog, mert ezt most hirtelen a szám-rendezősből írtam át
Sajna nem fog
qsort (tomb, elemszam, maxhossz*sizeof (char), string_cmp);
...
ahol maxhossz a tomb legnagyobb sztrigjének a hossza
Itt egy (char*) elemeket tartalmazó tömböt rendezel. Vagyis helyesen:
qsort (tomb, elemszam, sizeof(char*), string_cmp)
A stringek hossza nem számít. Amúgy jelen feladat esetén ha a string betûit rendezzük, akkor a generált permutációk már eleve a jó sorrendben jönnek ki. Tehát nem ilyen rendezés kell, hanem az eredeti (a számos), csak nem int hanem char típussal.Jester
-
Jester01
veterán
-
Jester01
veterán
válasz emitter #1082 üzenetére
Az & jel nem kell a fscanf-be, mivel már eleve pointered van.
Ellenben a függvényhívásnál viszont kell.fscanf(fajl,''%d'',mx);
...
load(''proba.txt'', &mx, &my, mezo);
MOD: Ja és mielõtt lábon lövöd magad: a második fscanf-be nyilván my-t akartál írni
[Szerkesztve]Jester
-
Jester01
veterán
válasz emitter #1089 üzenetére
A temp az minek is? A c változót hol inicializálod? A ciklusban j miért 4*(*mx) -ig megy?
Gondolom azt akartad csinálni, hogy a temp-be beolvasod a sort, és aztán abból alakítod át a saját adattípusodra. Ez persze fölösleges, ha úgyis fgetc-t hívsz.for(i=0;i<*my;i++) //az allas beolvasasa
{
for(j=0;j<*mx;j++)
{
mezo[ i ][ j ].akna=fgetc(fs)-48;
mezo[ i ][ j ].reveal=fgetc(fs)-48;
mezo[ i ][ j ].mark=fgetc(fs)-48;
mezo[ i ][ j ].szomsz=fgetc(fs)-48;
printf(''%d'',mezo[ i ][ j ].akna);
}
MOD: az persze kérdés, hogy a mentett állásban táblasorok után van-e enter, vagy egy sor az egész. A fenti kód akkor működik, ha egy sor.
[Szerkesztve]Jester
-
Jester01
veterán
válasz emitter #1092 üzenetére
Ez most jónak tűnik, kivéve, hogy a temp változó mérete eggyel kisebb mint kellene, mert a fscanf tesz egy lezáró nulla byteot a beolvasott string végére. De hogy ettől fagy-e azt nem tudom. Esetleg a program másik részében lehet hiba. (Miért nem rakod ki az egészet a weboldalra? )
Amúgy a k változóra nincs szükség, mert egyszerűen 4*j módon számítható. De ez nyilván nem hiba. Legközelebb holnap este leszek, remélem addig segít valaki más[Szerkesztve]
Jester
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!