Implementacja obrazu monochromatycznego

Implementacja obrazu monochromatycznego
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

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)

seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0
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:

Kopiuj
   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.

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0
Kopiuj
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:

Kopiuj
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()

seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0

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!

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

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.

seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0
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? :-)

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

Czyli nie było to błędne?
Było błędne. Sprawdzałeś warunek, który zawsze jest spełniony. To tak, jakby napisać

Kopiuj
if(true){...}
seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0
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ć

Kopiuj
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 :)

seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0

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:

Kopiuj
   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 :)

quetzalcoatl
  • Rejestracja:około 18 lat
  • Ostatnio:ponad 6 lat
0

hmm... masz problemy z przeczytaniem nazw plikow, numerow linii i opisow bledow ktore sie pojawiaja w logu kompilacji..?


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
seba_fonia
  • Rejestracja:około 18 lat
  • Ostatnio:prawie 14 lat
  • Postów:35
0

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.

W1
  • Rejestracja:około 11 lat
  • Ostatnio:około 3 lata
  • Postów:31
0

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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)