C - if nie sprawdza poprawnie warunku

C - if nie sprawdza poprawnie warunku
K4
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:2
0

Witam, mialem napisac program przeksztalcajacy liczby dziesietne na szesnastkowe, napisalem jakies 10% kodu i nagle spotkalem sie z bledem ktorego nie moge rozwiazac, mianowicie: przy sprawdzeniu(39 linijka) if("wynik funkcji">"liczba") nigdy warunek nie jest pozytywny, nawet jezeli "wynik funkcji" przekracza wielokrotnie wartosc "liczba". Nawet przy debugowaniu wyraznie widac ze obie liczby sie roznia tzn "wynik funkcji" jest wiekszy od "liczba", niestety zawartosc if zostaje i tak pominieta i nici z obliczen.

Kopiuj
 #include<stdio.h>

int power( int wykladnik);
void itob(int n, char s[1000], int b);




main()
{
	
	char wynik[1000];
	int znaki=0;
	int g=0;
	
	printf("wpisz liczbe do konwersji\n\n");
	scanf("%d",&znaki);
	printf("wpisz zadany typ liczby wyjsciowej (16)\n\n");
	//scanf("%d",&g);
	g=16;
	itob(znaki,wynik,g);
	printf("liczba w systemie szesnastkowym:\n\n%s",wynik);
	
	
}


void itob( int n, char s[1000], int b)	//funkcja przeksztalcajaca liczbe dziesietna na liczbe szesnastkowa
{
	int bufor;
	int i,sign,wykl,d=0;
	
	if((n=sign)<0) {n=-n;}			//zmienia znak liczby na dodatni
	i=0;
	
	for(d=0;d<100;d++)				//petla wyszukujaca najwiekszy wykladnik liczby 16
	{
			
		if(power(d)>=n)		//TUTAJ JEST PROBLEM!sprawdzenie czy wynik potegowania wiekszy niz liczba wejsciow
		{	
			wykl=d-1;				
			d=102;					//jesli tak to wyjscie z petli
		}
	}
	
	d=0;
	for(i=wykl;i>=1;i--)			//obliczanie kolejnych wykladnikow wstecz
		{
		s[d++]=(n/power(i));
		n=(n%power(i));
		}
	
	bufor=n/power(wykl);

	if(b!=14)
	s[0]='C';
}


int power( int wykladnik)		//funkcja potegujacaa liczbe 16
{
	
	int i, p;
	
 	p=1;
	for(i=1;i<=wykladnik;++i)
	
	p=p*16;
	
	 return p;
	
}              
edytowany 2x, ostatnio: klimek476
twonek
popraw wcięcia, bo to jakaś masakra jest: http://format.krzaq.cc/, style file
Craith
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:146
0

Przypisujesz n = sign w bloku sprawdzającym ifie zamiast porównać

edytowany 1x, ostatnio: Craith
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
3
Kopiuj
int i, sign, wykl, d=0;
if ((n=sign)

używanie niezainicjalizowanej zmiennej - UB

Craith
zlodziej plusow :D
twonek
Ale nawet gdyby porównywał, to nadal byłoby UB. A poza tym wydaje mi się, że on chce przypisać. Dlatego nie łapkuję Twojej odpowiedzi.
Craith
no oke, ale mimo wszystko jezeli chce sie jawnie przypisac to nie wypada raczej tego robic w ifie bo rzuca sie w oczy jako blad
twonek
To nie jest błąd, jedynie niezalecana praktyka. OP był na tyle świadomy, że opakował to w nawiasy przed porównaniem z zerem.
K4
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:2
0

faktycznie, jak moglem tego nie zauwazyc to ja nawet nie. Dzieki bardzo wszystkim!!

Xitami
Bo kto by tam na warning'i paczał?
Xitami
A czemu więcej niż 5 linijek? A za to potencjowanie to siadaj, nawet nie dwa
Xitami
g=16, jak z forgem model T, na dowolny byle hexalny

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.