programování v C - pomoc s nalezením chyby v programu
Dobrý den,
prosím vás, mohli by jste se mrknout na následující zdrojový kód a pomoci mně tak najít chybu?
Program má za úkol načíst číslo po znacích (počet sekund) a vypsat kolik je to dnů, hodin, minut a sekund.
Překladač (gcc) nehlásí žádnou chybu.
Zajímavé je, že na stolním pc (ubuntu 11.10) program po překladu nepracuje jak má, např při vstupu 654321 mi program napíše, že vstup byl 25606129.
Ale na jiném pc (fedora 15) po přeložení toho samého zdrojáku, pracuje program jak má.
Program jsem psal ve Vimu a překládal pomocí gcc
#include <stdio.h>
int main()
{
int vstup;
int pocet_sek;
int den;
int hod;
int pom;
int min;
printf("Zadej pocet sekund:\n");
while ((vstup = getchar()) >= '0' && vstup <= '9'){
pocet_sek = pocet_sek * 10 + (vstup - '0');
}
printf("Zadali jste: %d sekund\n", pocet_sek);
den = pocet_sek / 86400;
if (den == 0){
pom = pocet_sek % 86400;
}
else{
pom = pocet_sek % (den * 86400);
}
hod = pom / 3600;
if (hod == 0){
pom = pom % 3600;
}
else{
pom = pom % (hod * 3600);
}
min = pom / 60;
if (min ==0){
pom = pom % 60;
}
else{
pom = pom % (min * 60);
}
printf("%d den, %d hodiny, %d minuty, %d sekundy, %d vas vstup \n", den, hod, min, pom, pocet_sek);
return 0;
}
Změna předmětu, původně: programování v C (host) (los)
No určitě ti tam na začátku chybí:
pocet_sek = 0;
děkuju moc
po doplnění pocet_sek = 0; program začal pracovat jak má, ale jak je tedy možné, že na druhém pc vše jelo i bez toho?
OMG lebo NAHODOU bolo pred spustenim programu na tom mieste v pamati 0.
To nastavení na 0 za tebe udělal překladač. Ale počítat s tím nemůžeš, tohle by sis měl ošetřovat sám.
alebo tak (je to teoreticky mozne, aj ked C prekladace to tusim zvycajne nerobia, ale neviem jaky prekladac je v ubuntu :)
neinicializujes premennu a pouzivas ju. pocet_sek = pocet_sek * 10 + (vstup - '0'); je najprv pouzitie premennej pocet_sek az potom priradenie.
Keby som bol docent a urobil by mi to niekto na skuske tak by letel vmomente von aj keby mu program "nahodou" fungoval. Pretoze kvoli takym veciam (a lebo programuju uz aj cinski kuchari-casnici) je vsetok SW na svete totalna sracka.
Pochopil jsem.
Po druhé už stejnou chybu neudělám.
udelas, ptz to je dost bezna chyba :) Ja osobne sa snazim uz ked pisem to
pocet_sek = pocet_sek * tak presne v tomto momente sa zastavim a skontrolujem ci ma v kazdom priapde pocet_sek nejaku hodnotu, ak nie tak hend aj pridam inicializaciu a az tak pokracujem dalej s pisanim toho riadku, asi som paranoid :D Ale zato moj SW zvycajne funguje.
Inac tvoj vypocet je nezmyselny a podla mna aj nespravny. Normalne matematicky a logicky je to takto, ak sa nemylim:
to je cele.
A este v tom uvodnom cykle by si mal pred nasobenim 10 urobit test na maximalnu hodnotu unsigned int (porovnat s UINT_MAX/10) pretoze ked ti to pretecie (user zada viac jak 4miliardy) tak tam budes mat tiez nezmysly. A pouzivat unsigned int, nie klasicke int (potom aj v printf pouzit %u)
BTW. pre buducnst - kazde vyvojove prostredie ma debugger.