• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Obraz bmp

VPS Starter Arubacloud
0 głosów
1,082 wizyt
pytanie zadane 10 stycznia 2018 w C i C++ przez marcin_kub Obywatel (1,420 p.)

Cześć Wam,

Chciałbym zrobić program, który wczytuje obraz bmp do programu, a następnie zmniejsza lub zwiększa konkretne wartości kolorów RGB. Pliki RGB składają się z nagłowka, w którym znajduje się rozmiar pliku, liczba wierszy, liczba kolumn).

Link do kodu źródłowego

Dla małych plików ok. 15KB wszystko działa jak należy, ale gdy wczytuję plik o rozmiarze 1MB wyświetla mi się błąd, że "Program przestał działać", nie mam kompletnie pomysłu co tu może być nie tak.

komentarz 10 stycznia 2018 przez niezalogowany
Protip (na przyszłość): dodaj symbole do debugowania do programu i uruchom program z debuggerem.

Dla GCC i GDB wygląda to np tak:

$ g++ -g -o myprogram main.cpp My program.cpp

$ gdb ./my program

(gdb) run
komentarz 10 stycznia 2018 przez adrian17 Ekspert (349,240 p.)

Nie trzeba nawet z debuggerem, AddressSanitizer daje wszystkie informacje na tacy. Inna sprawa, że na MinGW pewnie tak po prostu się nie da :/

 g++ -g -fsanitize=address main.cpp && ./a.out
sh: 1: cls: not found
Podaj nazwe pliku do odczytu: /home/adrian/Downloads/tux.png
=================================================================
==14689==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffdd52b00e8 at pc 0x55a3cdf23c8e bp 0x7ffdd52af8f0 sp 0x7ffdd52af8e0
READ of size 1 at 0x7ffdd52b00e8 thread T0
    #0 0x55a3cdf23c8d in nazwa_in(char*) /home/adrian/test/main.cpp:26
    #1 0x55a3cdf25a95 in podstawowe_dane() /home/adrian/test/main.cpp:150
    #2 0x55a3cdf260ca in main /home/adrian/test/main.cpp:187
    #3 0x7fec9a24a1c0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x211c0)
    #4 0x55a3cdf23a19 in _start (/home/adrian/test/a.out+0x1a19)

 

1 odpowiedź

+1 głos
odpowiedź 10 stycznia 2018 przez adrian17 Ekspert (349,240 p.)
char obrazek[bajty_obrazka];

Alokujesz pamięć na stosie która jest znacznie większa od rozmiaru stosu. Coś takiego powinno się robić dynamiczną alokacją.

Poza tym, coś takiego technicznie jest nielegalne w C++ie.

main.cpp:85:31: warning: ISO C++ forbids variable length array ‘obrazek’ [-Wvla]
     char obrazek[bajty_obrazka];
                               ^

Taki Visual Studio by tego w ogóle nie skompilował.

Z innych ciekawostek, wychodzisz poza tablicę.

char bmp_we[200], bmp_out[200];
(...)
// w nazwa_in()
return bmp_in[200];

Czemu nie używasz nigdzie std::string i std::vector?

komentarz 11 stycznia 2018 przez marcin_kub Obywatel (1,420 p.)
Stwierdziłem, że nazwę pliku lepiej przechowywać w tablicy char, a ta funkcja, to nie wiedziałem, jak zwrócić nazwę. Chociaż z drugiej strony w sumie rzeczywiście lepiej by było bazować na stringu. Dzięki za podpowiedź z tą alokacją - już sobie poradziłem z problemem i czytam plik co 3 bajty (stworzyłem 3 zmienne int, które czytają kolejne bajty obrazka, wrzuciłem je w pętle, która co każdy obieg zastępuje je kolejnymi wartościami odczytanymi z obrazka).

Podobne pytania

0 głosów
1 odpowiedź 375 wizyt
pytanie zadane 16 stycznia 2020 w C i C++ przez Igor Użytkownik (740 p.)
0 głosów
1 odpowiedź 397 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Padoski Użytkownik (990 p.)

92,973 zapytań

141,937 odpowiedzi

321,173 komentarzy

62,301 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...