Skocz do zawartości

Naruszenie Ochrony Pamięci


Gość sabby7890

Rekomendowane odpowiedzi

Gość sabby7890

Witam,

 

Mam pewien problem:) Otóż zacząłem pisać programy w języku C++, dopiero niedawno przesiadłem się na C - wybrałem go ze względu na jego szybkość. Zająłem się teraz pisaniem programu w GTK 2.0.

 

Staram się napisać program który będzie odpowiednikiem Guitar Pro na Linuksa (może niektórzy znają tą aplikację). Podczas pisania z użyciem bibliotek GTK wszystko idzie dobrze, mogę rysować nuty i tabulaturę, dodawać marginesy itp. Utknąłem jednak w miejscu, od którego powiniem był zacząć:)

 

Otóż program ten deklaruje bardzo dużo zmiennych (jest to program służący do komponowania muzyki):

Tytuł, podtytuł, artysta, notki, tekst utworu - oddzielny dla każdej ścieżki, komentarze dla każdej nuty itp. Oprócz tego musi posiadać kilkanaście innych zmiennych, których niestety nie mogę uniknąć:

 

- ilość ścieżek

- parametry danej ścieżki - instrument, głośność, phaser, tremolo, reverb itp.

- dla każdej ścieżki tablica z nutami (struna, próg, długość dźwięku, tablica parametrów)

- dla każdej nuty - tablica parametrów

- dla każdego taktu - powtórzenie, szerokość fizyczna na ekranie itp

- dla każdego podciągnięcia - tutaj muszę zapisać cały wykres jak to podciągnięcie ma iść

 

Nie wymieniłem wszystkiego, lecz już przy pierwszym punkcie program mi się wysypuje:

Naruszenie ochrony pamięci

 

W C istnieje coś takiego jak malloc(), lecz nie do końca wiem, jak tego używać. Próbowałem:

 

-- basic_callbacks.h --

struct {
          int num_bars;
          int bar_width[4096]            //maksymalna ilość taktów, zazwyczaj nie przekracza 500, więc int
} song_data;

-- basic_callbacks.c --

song_data.num_bars = 10;            //przykładowy kod;

printf(song_data.num_bars);

 

Po uruchomieniu: Narusznie ochrony pamięci

 

Po wykasowaniu jednej zmiennej z której mogłem zrezygnować - wszystko ok. Jednak z wielu nie mogę, dlatego muszę zadać to pytanie: jak ominąć ten problem?

 

W C++ używałem klas i wszystko było ok, tutaj niestety struktury tak nie działają:( Nie chcę używać gtkmm,

chciałbym to napisać w C.

 

Jakby ktoś mógł mnie pokierować, jak ominąć ten problem, byłbym bardzo wdzięczny:)

 

Pozdrawiam,

Tomek

Odnośnik do komentarza
Udostępnij na innych stronach

Gość sabby7890
Naruszenie ochrony pamięci się wywala kiedy odwołujesz się do nieswoich danych. Po prostu kiedy wychodzisz poza zakres tablicy, używasz wskaźnika do obiektu, który wcześniej wykasowaleś itp.

 

Dzięki, rozgryzłem temat:) Pozdrawiam!

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...