Hirdetés

Új hozzászólás Aktív témák

  • Jester01
    veterán

    Azt hiszem fogalmam sincs, hogy mit is írtál, de azt látom, hogy nem C kód, debuggerekről meg eddig csak hallottam (és még érthető leírás sincs semelyik használatáról sehol). C-vel sem volt dolgom múlt hétig, csak Turbo Pascallal és Pythonnal (előbbiből emelt szintű érettségiig, utóbbival autodidakta módon), de sose használtam semmilyen debuggert.
    Szóval ebben a formában ha csak nem adsz egy leírást a debbuggerek használatáról az alapoktól, nem veszem hasznát egy breakpointnak.
    Egyébként megnéztem a gdb-t, de magas.

    Arra viszont rájöttem, hogy ha a default eset fut le, a c értéke kiürítődik ahelyett, hogy bekérné a getchar() és emiatt a második default futás, hisz a c üres. De hogy az elsőnél miért ugorja át a getchar()-t, azt lenne jó tudni. A c értéke ettől független, az egészen addig a pontig pont annyi, amit a getchar() bekér, amíg a default eset végre nem hajtódik, ott válik valahogy üressé (nincs törlésre utasítás, sőt ha értéket adok neki a printf előtt, akkor az az érték megmarad, de mégis duplán fut a ciklus), majd a ciklus újrafutása mellőzi a getchar()-t. Az alapján, amit a programozásról tudok, ez lehetetlen, egy program nem hagyhat ki csak úgy parancsokat, ha csak utasítást nem kap rá. De itt nincs ilyen, a default esettel vissza kéne mennie a ciklus elejére, ahol a getchar()-nak ismét kérnie kéne a karakterét. De ez nem történik meg egyszer, csak második futásra.

    De, a te C kódodat futtattam. Egy debuggert mihamarabb meg kellene tanulnod, mert azzal tudod a saját programhibáidat felderíteni. gdb-ben nagyjából 8 paranccsal kiválóan el lehet boldogulni (break, run, step, next, continue, print, x, exit) vagy használhatsz valamilyen grafikus felületet.

    Jelen esetben abba futottál bele, hogy a standard input az soronként pufferelt továbbá a getchar szorgalmasan visszaadja a sorvég jelet is. Én például azt írtam be, 5<enter>. Ezt a gép úgy dolgozza fel, hogy az első getchar hívásnál látja, hogy nincs semmi a bemeneti pufferben, tehát beolvas egy egész sort, majd visszaadja az első karaktert (az 5-öt). Erre lefut a switch-ed majd visszamegy a ciklus miatt a getchar-hoz. Ezúttal viszont van még a pufferben valami, mégpedig a sorvég jel, tehát a getchar nem vár és azt adja vissza. Ez ismétcsak a default ágra jut. Hasonló történik akkor is ha másik ágra futsz, a pufferben még mindig benne lesz a sorvég illetve bármi amit a felhasználó még elé írt. Ezt a következő beolvasás vissza is fogja adni.

    Ezért tehát mindig célszerű a teljes sort beolvasni majd igény szerint feldolgozni. Például mi legyen, ha a felhasználó 11-et ír be.

Új hozzászólás Aktív témák