Aktív témák
-
Jester01
veterán
válasz
ibizefrenki #118 üzenetére
Ellenorizd azzal, hogy jol mukodik-e
-
Jester01
veterán
Az elsõ két problémára gyári megoldás az strtok függvény. Ha az nem tetszik, kézzel valami ilyesmi lehet:
char* nexttoken(const char** ptr, char delim)
{
char* ret = NULL;
if (*ptr && **ptr)
{
int length;
const char* start = *ptr;
const char* end = strchr(start, delim);
if (end == NULL)
{
length = strlen(start);
*ptr = NULL;
} else {
length = end - start;
*ptr = end + 1;
}
ret = malloc(length + 1);
strncpy(ret, start, length);
ret[length] = 0;
}
return ret;
}
Ha több delimiter van egymás után, akkor ez szépen üres stringeket fog visszaadni. A lista végén NULL-t kapsz, és minden visszaadott tokent neked kell free-vel felszabadítani (mint ahogy a 3. kérdésedben szereplõ strdup esetében is.)
Mivel hossz paramétert nem adsz át, ezért a bemeneti string végén ott kell legyen a lezáró nulla byte különben nagy baj lesz
Amúgy sokszor elég a token pozíciója és a hossza, ekkor megszabadulsz a memóriakezelés nyûgjétõl és gyorsabb is lesz.
Elismerem, hogy egy split az egyszerûbb
[Szerkesztve]
[Szerkesztve] -
Jester01
veterán
Azt sem értem mit is akarsz csinálni
Az fgets mindig lezárja 0-val a beolvasott stringet, ha 1-et adsz át akkor semmit nem fog olvasni. Gondolom fgetc-t akarsz ott használni.
Az eredmeny[0] -ba + vagy - karakterkódja kerül az eredmeny[1]-be meg a szám???
És miért csak a negatív számokat olvasod be?
Arról nem is beszélve, hogy long típust %d-vel akarsz kiírni...
MOD: plusz a beolvasásnál is %d-vel olvasol long-ba, vagyis ha a long típus nagyobb mint az int (64 bites gépen pl.) nem lesz inicializálva a felső 4 byte.
[Szerkesztve] -
Jester01
veterán
Valamelyest a te módszerednél maradva úgy írtam át a progid, hogy az act mindig a következõ emberre mutasson (induláskor az elsõre aki a 0 indexû), ekkor ehhez mindig (M - 1)-et kell hozzáadni. Ezzel a módosítással az 5 7 paraméterekre a 2 5 1 3 4 eredmény adódik ami remélhetõleg jó.
A számítási ciklus nekem ilyen lett:
while (done < N)
{
act += M - 1;
if (act >= x)
{
act = act % x;
}
eh[done++] = szamok[act];
if (act == x - 1)
{
/* ha az utolso volt, akkor nem kell mozgatni a tombben */
/* es a kovetkezo az elso lesz */
act = 0;
} else {
/* ha nem az utolso, akkor a tovabbi elemeket eggyel visszahuzzuk */
/* es a soron kovetkezo elem ezaltal ismet az act indexen lesz */
memmove(szamok + act, szamok + act + 1, (x - act - 1) * sizeof(int));
}
x--;
}
Az elõzõ soremeléses megjegyzésem kicsit módosítom. Nyilván úgy lesz jó, ha a kiíró ciklus eggyel rövidebb és az utolsó elemet külön írod ki. Így megtakarítasz egy if-et a ciklusban ami úgyis csak az utolsó elemre lenne igaz.
Ha nekem kellett volna megoldani ezt a feladatot, akkor valószínûleg nem ezt az utat választom, hanem egy tömbben egyszerûen azt tartom nyilván, hogy az ember él-e még. Így kicsit bonyolultabb lesz ugyan a következõ index megkeresése, de cserébe megtakarítunk egy csomó memóriamásolást.
A végére még egy stilisztikai megjegyzés: nem szerencsés keverni az angol és a magyar elnevezéseket/megjegyzéseket, válaszd ki az egyik nyelvet és következetesen használd azt. -
Jester01
veterán
Beszédesebb változónevek és néhány komment elkelne.
Valamit az ''5 7'' esetre várt jó illetve a kapott eredmény.
Ha jól látom x lenne a még életben lévõ emberek száma, a szamok tömb pedig az emberek eredeti sorszámát tartalmazza ahonnan mindig törlöd azokat akik sorra kerültek.
Ezt a részt itt nem értem:
if (act>=x)
{
act=act%x;
for (i=0;i<x;i++)
for (j=0;j<done;j++)
if (szamok==eh[j])
{
for (k=i;k<N;k++) szamok[k]=szamok[k+1];
x--;
}
act=act%x;
}
Az eredmény kiírásánál pedig egyszerûbb lenne \n nélkül kiírni az összes számot majd a végére egy \n magában. De ez csak apróság.
Szerintem lehetett volna békésebb szöveget keríteni a feladathoz
[Szerkesztve] -
-
Jester01
veterán
Nem, az csak véletlenül jó, mert alacsony szinten a C calling convention szerint a hívó és nem a hívott veszi le a paramétereket a verembõl. Induláskor a main mindenképp megkapja az említett 2 paramétert is (nézd meg debuggerrel). Szintén a calling convention miatt mûködik a void main is, ugyanis a visszatérési érték egy regiszterben van, amiben ígyis-úgyis lesz valami szemét.
int main()
{
return 0;
}
$ gdb a.out
(gdb) br *main
Breakpoint 1 at 0x8048374: file t.c, line 2.
(gdb) r
Starting program: /var/tmp/a.out
Breakpoint 1, main () at t.c:2
2 {
(gdb) x/x $esp+4
0xbf9714d0: 0x00000001 Ez itt az argc
(gdb) x/x $esp+8
0xbf9714d4: 0xbf971544 Ez itt az argv
(gdb) p *(char**)0xbf971544
$1 = 0xbf971b47 ''/var/tmp/a.out'' Ez meg az argv[0], vagyis a prog neve -
Jester01
veterán
Ha már ellenőrzés van benne, akkor beker == 0 helyett <= kellene. Másrészt ha a be.txt-ben nem szám van, akkor a beker változó értéke inicializálatlan lesz és így valami véletlenszerű számot fog kiadni. Szóval még a fscanf visszatérési értékét is ellenőrizni kellene. És akkor még nem is beszéltünk az olyan bemenetről, ami ugyan számmal kezdődik, de az egész nem értelmezhető számként (pl. ''1alma'').
Mondjuk a feladatkiírás szerint ezek az ellenőrzések nem szükségesek. -
Jester01
veterán
Ahogy Brain mondta, azzal az fprintf sorral van a baj. A \n egyszerűen nem kell bele, így egy sorba írja majd a jeleket. Ellenben a ciklus után, de a fájl lezárása előtt, írj ki egy csupasz soremelést ha ez a feladatkiírás szerint szükséges (nem tudom, nem néztem meg)
A bufferes dolog még mindig nem jó, miért nem írod át?
A visszatérési értékről röviden: a main függvénynek a prototípusa int main(int argc, char* argv[]). Minden más csak véletlenül, kompatibilitás és a C calling convention (hogy is van ez magyarul?) jellegzetessége miatt működik. Tessék ezt a formát használni és ennek megfelelően visszatérési értéket is megadni. (Persze a pointer-tömb ekvivalencia miatt az argv lehet char** is)
Aktív témák
Hirdetés
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5080 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! MSI Z390 i5 9400F 16GB DDR4 512GB SSD RTX 2060Super 8GB Corsair Carbide Series 200R 600W
- RITKASÁG: MSI Big Bang Z77 MPOWER
- Xiaomi Redmi 9A 32GB Kártyafüggetlen 1Év Garanciával
- 138 - Lenovo Legion Pro 7 (16IRX9H) - Intel Core i9-14900HX, RTX 4080
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged