Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

dynamiczne przydzielanie pamieci - pytanie

Ostatnio zmodyfikowano 2010-10-25 16:42
Autor Wiadomość
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.
C/C++
#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?
P-23213
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.
P-23215
malan
» 2010-10-23 20:12:11
Najpierw to sprawdź, czy i na pewno jest równe dwa. Potem pogadamy o tablicach :).
P-23216
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
P-23217
ison
» 2010-10-23 21:06:11
wiesz jak działa operator '[' i ']'?
zapis
C/C++
tab[ n ] = 5;
jest równoznaczny z
C/C++
*( tab + n ) = 5;
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 ;)
P-23218
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?
C/C++
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...
P-23219
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:
C/C++
#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 ]; //-------bottom--------
    const double right = left + tex_w / texture_w[ tex_nr ]; //left-------------right
    const double bottom = tex_y / texture_h[ tex_nr ]; //----------------------
    const double top = bottom - tex_h / texture_h[ tex_nr ]; //-------top------------
    //obrazek jest ladowany do gory nogami, stad wzor ----->
    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:
C/C++
#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):
C/C++
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?
P-23232
malan
» 2010-10-24 22:27:49
C/C++
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. :)
P-23297
« 1 » 2
  Strona 1 z 2 Następna strona