Chodzi o indeksy a nie o wartości. Mususz sprawdzić, czy współrzędne rządanego piksela leżą w granicach obrazka.
A jeśli posługujemy się typem unsigned char to nigdzie nie ma sensu sprawdzać jego zakresu bo nie ma technicznej możliwości żeby przyjął inną wartość niż 0..255. Char ma tylko 8 bitów czyli 2^8 = 256 stanów (unsigned 0..255 lub signed -128..127)
- 1
- 2

- Rejestracja:ponad 21 lat
- Ostatnio:prawie 12 lat

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
adf88 napisał(a)
Chodzi o indeksy a nie o wartości. Mususz sprawdzić, czy współrzędne rządanego piksela leżą w granicach obrazka.
Acha no to teraz rozumiem czemu mam to sprawdzać w funkcji odczytu i zapisu.
adf88 napisał(a)
A jeśli posługujemy się typem unsigned char to nigdzie nie ma sensu sprawdzać jego zakresu bo nie ma technicznej możliwości żeby przyjął inną wartość niż 0..255. Char ma tylko 8 bitów czyli 2^8 = 256 stanów (unsigned 0..255 lub signed -128..127)
No tak masz racje, tyle że zakładamy, iż użytkownikiem programu jest ktoś kto nie zna się na tym. Oczywiście damy mu do zrozumienia w funkcji głównej żeby wpisał liczbę z tego zakresu, ale jeśli on się uprze i wpisze inną? Przecież może to zrobić bo klawiatura da mu tą możliwość. Zatwierdzi i co? Program albo sie wysypie, albo po prostu nic sie nie stanie, w sumie nie wiem, ty pewnie wiesz. Ale tak czy siak nie poinformuje użytkownika, że nie wykonał operacji, którą chciał wykonać, a nasz program musi być przecież idiotoodporny ;-P. Jeśli się mylę to oczywiście usunę to z tej funkcji.
Zrobiłem coś takiego:
byte getPixel(int x, int y) //zwraca wartość (kolor) piksela na pozycji [left, top]
}
if(x>get.width() || y>get.height())
{
cout<<"Blad! Podane indeksy wykraczaja poza obszar obrazu.";
cout<<"Wpisz indeksy maksymalnie do ["<<get.width()<<"]["<<get.height()<<"].";
}
else
return tab[x][y];
}
void putPixel(int x, int y, byte value) //zapis piksela
{
if(x>get.width() || y>get.height())
{
cout<<"Blad! Podane indeksy wykraczaja poza obszar obrazu.";
cout<<"Wpisz indeksy maksymalnie do ["<<get.width()<<"]["<<get.height()<<"].";
}
else if(value<0 && value>255)
{
cout<<"Blad! Wartosc nie nalezy do zakresu 0-255.";
cout<<"Dokonaj zapisu ponownie, podajac wlasciwa wartosc.";
}
else
tab[x][y] = value;
}
Tylko nie wiem czy ma tam być get.width() i get.height(), czy po prostu width i height.

- Rejestracja:ponad 21 lat
- Ostatnio:prawie 12 lat
byte b = ...;
//i chodźby nie wiem co przypisać do 'b' poniższy warunek ZAWSZE będzie spełniony
if((b >= 0) && (b <= 255))
//a skoro zawsze będzie spełniony to po co sprawdzać ?
W zmiennej typu byte nie da się zapisać wartości innej niż 0..255. Nie da się, nie ma takeij możliowści. Nawet jak napiszemy:
byte b = 43981;
to nasz bajt nie będzie miał wartości 43981, tylko 205. Dlaczego ? A no daltego, że liczba 43981 to szesnastkowo to 0xABCD, przy zamianie na byte początek liczby jest ucinany i tylko najmłodszy bajt jest zostawiany, bajt 0xCD = 205.
Zakres trzeba sprawdzać przy zamienianiu liczby (np. wczytanej liczby int) na byte. A metody klasy Image przyjmują już zamieniony byte więc nie muszą nic sprawdzać.
seba_fonia napisał(a)
Tylko nie wiem czy ma tam być get.width() i get.height(), czy po prostu width i height.
width lub getWidth()

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
No rozumiem. Tylko, że użytkownik chyba nie będzie wiedział w końcu jaką wartość mu zapisało :). Więc właściwie to co napisałem nie tyle było błędne, co zbędne do prawidłowej pracy programu o ile dobrze rozumiem :).
Dobrze, że napisałeś mi
width lub getWidth()
bo oczywiście zrobiłem błąd w zapisie (get.width()).
Wszystko już poprawione, sprawdzanie zakresu wartości wyrzuciłem, rozumie, że sprawdzanie zakresu indeksów jest dobrze. Pozostaje mi tylko rozbić to na moduły :).
Dzięki wielkie!

- Rejestracja:ponad 21 lat
- Ostatnio:prawie 12 lat
Tylko, że użytkownik chyba nie będzie wiedział w końcu jaką wartość mu zapisało
jaką wartość "mu zapisało", czy jaką wartość zapisał program przez ciebie napisany ? :>
Jeśli użytkownik poda nieprawidłową wartość to mu się ładnie pisze "ty sku... co to za głupoty piszesz !!!!" ;) To ty masz pełną kontrolę nad tym jak działa program, to ty musisz przewidzieć wszystko. Użytkownik już tylko ma korzystać, nie musi wiedziec co i jak "mu zapisało", byle program wiedział. Program musi odpowiednio zinterpretować polecenia user'a.

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
adf88 napisał(a)
Jeśli użytkownik poda nieprawidłową wartość to mu się ładnie pisze "ty sku... co to za głupoty piszesz !!!!" ;)
[green] No właśnie o to mi chodziło, tylko ja w tej funkcji chciałem to ubrać w słowa takie, żeby prowadzący nie padł z wrażenia ;-P. I temu miało służyć sprawdzenie wartości przed zapisem. Czyli nie było to błędne? :-)

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
adf88 napisał(a)
Czyli nie było to błędne?
Było błędne. Sprawdzałeś warunek, który zawsze jest spełniony. To tak, jakby napisać
if(true){...}
Zawsze jest spełniony? Czyli zanim funkcja zostanie wykonana ta liczba już zostanie przerobiona na byte, tzn. ucięta i o tym, że użytkownik wypisuje bzdury trzeba go poinformować pisząc odpowiednią regułę w funkcji głównej? Jeśli tak no to ok rozumiem :)

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
Jeszcze mam jedno pytanie. Muszę zrobić ten program wielomodułowo i nie wiem jak zrobić definicję operatora przypisania.
Wewnątrz klasy mam teraz deklarację:
Image& operator=(const Image& image);
Czy definicja powinna wyglądać tak:
void Image::operator=(const Image& image)
{
assignFrom(image, 0, 0, image.getWidth(), image.getHeight());
}
Czy raczej ma tu także znaczenie użycie Image& i jeśli tak to w którym miejscu?
Z góry dzięki :)

- Rejestracja:około 18 lat
- Ostatnio:prawie 14 lat
- Postów:35
Z przeczytaniem nie mam problemu. Ze zrozumieniem owszem - bynajmniej opisów błędów. Myślę, że to jest pytanie nie na miejscu, bo jeśli problemu z tym bym nie miał, to bym nie pisał tego posta.
Usunąłem kilka błędów, które zrozumiałem, a teraz potrzebuję pomocy. Pozdrawiam.
Edit: Ok już wiem co było źle.
- Rejestracja:około 11 lat
- Ostatnio:około 3 lata
- Postów:31
Mam pytanie bo pisze ten sam program. Czy tą funkcje ktora tworzy nowy obraz na podstawie fragmetu innego to mozna by napisac aby wywolac ja na wczesniej utworzony obiekt. Przykladowo tworzymy
Image x(10,10) i potem na ten obiekt wywolujemy metode/konstruktor ktory wycina z niego czesc?
Bo wy tu piszecie ze ta funkcja wycinajaca kawalek obrazu przyjmyje referencje i na inny obraz a w poleceniu jest ze ma przyjac tylko wspolrzedne do wyciecia.
- 1
- 2