• 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
840 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 (344,100 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 (344,100 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ź 329 wizyt
pytanie zadane 16 stycznia 2020 w C i C++ przez Igor Użytkownik (740 p.)
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Padoski Użytkownik (990 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...