Savail Temat założony przez niniejszego użytkownika |
dynamiczne przydzielanie pamieci - pytanie » 2010-10-23 19:50:43 Witam Na poczatku skakalem sobie troche po tutkach na tej stronce. Ominalem sobie tutka o dynamicznym przydzielaniu pamieci bo nie wiedzialem po co mi to bedzie potrzebne... ;p teraz juz wiem ze to dosc wazne i musze nadrobic braki. #include <dirent.h> #include <iostream> #include <string.h> #include <conio.h>
int main() { using namespace std; DIR * d = opendir( "data" ); int i = 0; while( readdir( d ) != NULL ) i += 1; closedir( d ); i -= 2; int * texture_new = new int[ i ]; double * texture_w_new = new double[ i ]; double * texture_h_new = new double[ i ]; texture_new[ 90 ] = 45; cout << texture_new[ 90 ]; getch(); delete[] texture; }
Powyzszy kod liczy ilosc elementow w folderze i zgodnie z ta iloscia, ustawia rozmiar dynamiczneych tablic... Zalozmy ze i = 2, czyli rozmiar tablic powinien takze wynosic 2. Niestety okazuje sie ze rozmiar tych nowych tablic jest nieograniczony, tak jak w powyzszym przykladzie moge przypisac 90-temu elementowi jakas wartosc, a zdaje mi sie ze maksymalny indeks wynosi 2?Czy moze tak wlasnie dzialaja dynamiczne tablice, ze samemu trzeba pilnowac maksymalnego rozmiaru? |
|
michalp |
» 2010-10-23 20:12:03 Możesz przypisać 91 "elementowi tablicy" wartość bo kompilator nie sprawdzi czy jest to poprawne (nie ma jak). W rzeczywistości ruszasz inny fragment pamięci (nie należący do dynamicznej tablicy).
Czy moze tak wlasnie dzialaja dynamiczne tablice, ze samemu trzeba pilnowac maksymalnego rozmiaru? |
Tak samo jak musisz sam zwalniać dynamiczne zaalokowane zmienne, tak samo musisz pilnować zakresu tablicy do którego się odwołujesz. |
|
malan |
» 2010-10-23 20:12:11 Najpierw to sprawdź, czy i na pewno jest równe dwa. Potem pogadamy o tablicach :). |
|
Savail Temat założony przez niniejszego użytkownika |
» 2010-10-23 20:16:41 michalp>>edit:: aha ok dzieki malan>> wlasnie te liczenie plikow jest troche dziwne ;p. Wiem ze niepokoi cie te i-=2; ale w folderze zawierajacym pliki txt wlasnie trzeba o 2 zmniejszyc, bo normlanie i jest o 2 wieksze niz rzeczywista ilosc plikow w folderze, chociaz nie wiem czemu |
|
ison |
» 2010-10-23 21:06:11 wiesz jak działa operator '[' i ']'? zapis jest równoznaczny z gdzie gwiazdka to operator wyłuskiwania zmiennej ze wskaźnika jeśli wykraczasz poza zakres to zwyczajnie 'chodzisz' po nie swojej pamięci zmieniasz wtedy jakąś inną zmienną i albo może program ci się wysypać albo nie - zależy na co trafisz ;) |
|
Savail Temat założony przez niniejszego użytkownika |
» 2010-10-23 21:14:58 ok, zeby nie zakladac nowego tematu... Mam program skladajacy sie z kilku plików zrodlowych. Przykladowy plik zrodlowy nazywa sie ladowanie.cpp... Zawiera on 2 funkcje: wczytywanie bitmapy, wyswietlanie. W obu funkcjach wykorzystywane sa powyzej wspomniane 3 tablice. A wiec powinny one zostac zadeklarowane w pliku ladowanie.h ale czy jest to dozwolone aby umiescic w pliku ladowanie.cpp tak "wierzchem"(nie w funkcji) ponizszy blok kodu? int ile_bitmap() { DIR * d = opendir( "data" ); int i = 0; while( readdir( d ) != NULL ) i += 1; closedir( d ); return i - 3; } int rozmiar = ile_bitmap(); GLuint * texture = new GLuint[ rozmiar ]; double * texture_w = new double[ rozmiar ]; double * texture_h = new double[ rozmiar ];
Taki kod umieszczony na wierzchu wykonuje sie chyba tylko raz prawda? A wiec zdaje mi sie ze to nie problem ale wole sie upewnic opinią profesjonalistow ^^ :D edit:wykasowalem 2 pierwsze linijki z powyzszego kodu bo nie byly potrzebne... |
|
Savail Temat założony przez niniejszego użytkownika |
» 2010-10-24 14:04:30 moze pokaze o co mi chodzi w praktyce bo troche trudno to wytlumaczyc: ladowanie.cpp: #include "laduj.h" #include <sdl/sdl_opengl.h> #include <sdl/sdl_image.h> #include <dirent.h> #include <iostream>
int ile_bitmap() { DIR * d = opendir( "data" ); int i = 0; while( readdir( d ) != NULL ) i += 1; closedir( d ); return i - 3; } int rozmiar = ile_bitmap(); GLuint * texture = new GLuint[ rozmiar ]; double * texture_w = new double[ rozmiar ]; double * texture_h = new double[ rozmiar ];
void Laduj::Load() { std::string obrazy[] = { "bandit.png", "tlo.png" }; for( int i = 0; i < rozmiar; i++ ) { SDL_Surface * surface; surface = IMG_Load( obrazy[ i ].c_str() ); texture_w[ i ] = surface->w; texture_h[ i ] = surface->h; GLenum format; switch( surface->format->BytesPerPixel ) { case 3: format = GL_RGB; break; case 4: format = GL_RGBA; break; default: exit( 1 ); } glGenTextures( 1, & texture[ i ] ); glBindTexture( GL_TEXTURE_2D, texture[ i ] ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); glTexImage2D( GL_TEXTURE_2D, 0, surface->format->BytesPerPixel, texture_w[ i ], texture_h[ i ], 0, format, GL_UNSIGNED_BYTE, surface->pixels ); if( surface ) { SDL_FreeSurface( surface ); } } } void Laduj::Draw( int tex_x, int tex_y, int tex_w, int tex_h, int pos_x, int pos_y, int zoom_x, int zoom_y, int tex_nr ) { glBindTexture( GL_TEXTURE_2D, texture[ tex_nr ] ); const double left = tex_x / texture_w[ tex_nr ]; const double right = left + tex_w / texture_w[ tex_nr ]; const double bottom = tex_y / texture_h[ tex_nr ]; const double top = bottom - tex_h / texture_h[ tex_nr ]; glPushMatrix(); { glBegin( GL_QUADS ); { glColor3f( 1, 1, 1 ); glTexCoord2f( right, top ); glVertex2f( pos_x + zoom_x, pos_y ); glTexCoord2f( left, top ); glVertex2f( pos_x, pos_y ); glTexCoord2f( left, bottom ); glVertex2f( pos_x, pos_y + zoom_y ); glTexCoord2f( right, bottom ); glVertex2f( pos_x + zoom_x, pos_y + zoom_y ); } glEnd(); } glPopMatrix(); }
ladowanie.h: #ifndef LADUJ_H_ #define LADUJ_H_ #include "wyswietl.h" #include <gl/gl.h> #include <string.h> #include <iostream>
class Laduj { public: void Load(); void Draw( int tex_x, int tex_y, int tex_w, int tex_h, int pos_x, int pos_y, int zoom_x, int zoom_y, int tex_nr ); }; #endif
Chodzi mi o ten fragment w pliku ladowanie.cpp(jest on na samym poczatku): int ile_bitmap() { DIR * d = opendir( "data" ); int i = 0; while( readdir( d ) != NULL ) i += 1; closedir( d ); return i - 3; } int rozmiar = ile_bitmap(); GLuint * texture = new GLuint[ rozmiar ]; double * texture_w = new double[ rozmiar ]; double * texture_h = new double[ rozmiar ];
Czy dozwolone jest ustawienie takiego fragmentu kodu "wierzchem"? Czy spowoduje to pozniej jakies bledy? |
|
malan |
» 2010-10-24 22:27:49 int rozmiar = ile_bitmap(); GLuint * texture = new GLuint[ rozmiar ]; double * texture_w = new double[ rozmiar ]; double * texture_h = new double[ rozmiar ]; Potrzebujesz tych zmiennych w kilku plikach projektu? Jeśli nie, to... odradzałbym takie rozwiązanie, bo nie wygląda to za ładnie i łatwo w takiej sytuacji o błędy. Poza tym..., te zmienne globalne... Spróbuj to napisać inaczej. :) |
|
« 1 » 2 |