No to przecież to napisałemolo16 pisze:Nie. Jest o wiele peostrzy w obsłudze.Spark89 pisze:i jest dla bardziej rozgarniętych
[C++] Program wyswietlający kolejno cyfry
Dziwnym cudem nagle zadzialalo!
Ale dziwi mnie fakt ze taki program:
Po uruchomieniu i dojsciu do funkcji scanf(..) i wpisaniu liczby wywala błąd i nie mam pojecia z jakiego powodu. Program jest chyba ok?
Ale dziwi mnie fakt ze taki program:
Kod: Zaznacz cały
#include <stdio.h>
int main()
{
unsigned char x;
scanf("%u",x);
printf("Dziala :D %u\n",x);
return 0;
}parametr %u odnosi się zarówno do typu unsigned char jak i do typu unsigned int więc to nie ma nic wspólnego z wyskakiwaniem błędu...
pisząc:
mówisz kompilatorowi: "odczytaj ze standardowego wejścia (klawiatury) zmienna typu unsigned int/char i zapisz ja pod adres znajdujący się w zmiennej x..."
jeśli za x wstawisz 5 to program będzie chciał wcisnąć pobrana wartość do pamięci komputera pod ten właśnie adres nadpisując wektory przerwań co prowadziłoby do zabójstwa systemu operacyjnego.
Na szczęście systemy windows maja zabezpieczenia przed takim odwołaniem się do początkowych adresów pamięci chroniąc je przed nie powołanym dostępem.
Niektóre kompilatory łykają taki zapis jednak jak widać builder jest na to uodporniony...
poprawny zapis powinien zawierać operator adresu & przekazując tym samym funkcji scanf adres a nie wartość zmiennej x:
tak zapisana funkcja każe pobrać wartość z klawiatury i zapisać ją do komórek pamięci pod taki adres jaki ma adres zmienna x... czyli zapis do zmiennej x tej wartości pobranej krótko mówiąc...
Zapominanie o & w funkcji scanf to bardzo częsty błąd początkujących programistów.
Dość wredny błąd bo niby dobrze napisany program w ogóle nie działa albo działa ale w zupełnie inny sposób jakbyśmy tego chcieli...
pisząc:
Kod: Zaznacz cały
scanf("%u", x);jeśli za x wstawisz 5 to program będzie chciał wcisnąć pobrana wartość do pamięci komputera pod ten właśnie adres nadpisując wektory przerwań co prowadziłoby do zabójstwa systemu operacyjnego.
Na szczęście systemy windows maja zabezpieczenia przed takim odwołaniem się do początkowych adresów pamięci chroniąc je przed nie powołanym dostępem.
Niektóre kompilatory łykają taki zapis jednak jak widać builder jest na to uodporniony...
poprawny zapis powinien zawierać operator adresu & przekazując tym samym funkcji scanf adres a nie wartość zmiennej x:
Kod: Zaznacz cały
scanf("%u", &x);Zapominanie o & w funkcji scanf to bardzo częsty błąd początkujących programistów.
Dość wredny błąd bo niby dobrze napisany program w ogóle nie działa albo działa ale w zupełnie inny sposób jakbyśmy tego chcieli...
Dzieki za pomoc Spark89
Rzeczywiscie to moje przeoczenie było. Prosze o nie zamykanie tego tematu bo gdybym jeszcze miał jakis problem z którym sobie sam nie poradze to bede pisal
[ Dodano: 2008-10-23, 15:16 ]
Witam
Czemu tak napisany program nie chce mi wyswietlac cyfr po przecinku? Caly czas po przecinku jest "0"
A powino wyswietlic 2.50
[ Dodano: 2008-10-23, 15:16 ]
Witam
Czemu tak napisany program nie chce mi wyswietlac cyfr po przecinku? Caly czas po przecinku jest "0"
Kod: Zaznacz cały
#include <stdio.h>
int main()
{
float wynik;
wynik = 5 / 2;
printf("%.2f", wynik);
return 0;
}Spróbuj tego :
Kod: Zaznacz cały
#include <stdio.h>
int main()
{
float wynik;
wynik = 5.0 / 2.0;
printf("%.2f", wynik);
return 0;
}grysek67,
w przypadku dzielenia stałych typu int piszemy:istotna jest ta kropka przy liczbie 5.
Jeżeli chodzi o zmienne, to zapis powinien wyglądać tak
zakładając, że zmienna a jest typu integer.
w przypadku dzielenia stałych typu int piszemy:
Kod: Zaznacz cały
wynik = 5./2;Jeżeli chodzi o zmienne, to zapis powinien wyglądać tak
Kod: Zaznacz cały
wynik = (float)a/2;