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

Problem ze wskaźnikiem do tablicy char (VS C++)

Ostatnio zmodyfikowano 2009-08-04 22:42
Autor Wiadomość
skirki
Temat założony przez niniejszego użytkownika
Problem ze wskaźnikiem do tablicy char (VS C++)
» 2009-08-03 19:40:17
Mam taką zmienną tablicową
static array<unsigned char>^ bitmapa_wczytana;
i klase
C/C++
class BMP
{
public:
   
    BMP( char & );
    ~BMP();
    //     void wczytajBMP(char & A) { bitmapaWczytana = A; }
    void zapiszWielkoscNaglowka();
    void zapiszSzerokoscBitmapy();
    void zapiszWysokoscBitmapy();
   
    int zapiszIloscKolorow();
    int zwrocLiczbeKolorow();
    long zwrocWysokoscBitmapy();
    long zwrocSzerokoscBitmapy();
   
   
   
private:
    //      char &              bitmapaWczytana ;               
    static int iloscKolorow;
    static int wielkoscNaglowka;
    static long szerokoscBitmapy;
    static long wysokoscBitmapy;
};
Wczytuje sobie bitmape do tablicy:
bitmapa_wczytana = File::ReadAllBytes( openFileDialog1->FileName );
i teraz chciałbym przypisać adres tablicy bitmapa_wczytana do zmiennej prywatnej klasy (przez konstruktor lub przez funkcje wczytaj BMP) ale nie potrafię tego prawidłowo napisać.

Bo taki zapis nie jest poprawny:
wczytajBMP( bitmapa_wczytana ); gdzie void wczytajBMP( char & A ) { bitmapaWczytana = A; }
Ani taki:
BMP bitmapa( bitmapa_wczytana );
Mógłby mi ktoś wytłumaczyć jak powinno być poprawnie i czemu nie można przypisać wskaźnikowi do tablicy adresu tablicy.

Z góry dziękuje za odpowiedz.
P-8977
WunM
» 2009-08-03 20:28:06
Bo tablica jest wskaźnikiem.
P-8983
skirki
Temat założony przez niniejszego użytkownika
» 2009-08-04 22:27:48
Dzieki wielkie zadziałało, a mam jeszcze takie pytanie:

na początku deklaruje sobie wskaźnik do ref clasy
C/C++
BMP ^ bitmapa;
a następnie w funkcji button1
C/C++
private: System::Void button1_Click( System::Object ^ sender, System::EventArgs ^ e )
{
    bitmapa = gcnew BMP;
    array < unsigned char >^ bitmapa_wczytana;
    openFileDialog1->Filter =( "Bitmapa|*.bmp" );
    if( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
    {
        bitmapa_wczytana = File::ReadAllBytes( openFileDialog1->FileName );
        pictureBox1->ImageLocation = openFileDialog1->FileName;
        bitmapa->wczytajBitmape( bitmapa_wczytana );
       
    }

klasa BMP wygląda tak
C/C++
ref class BMP
{
public:
    BMP() { };
    ~BMP() { };
    void wczytajBitmape( array < unsigned char >^ A ) { bitmapaWczytana = A; }
    char pokaz( int i ) { return bitmapaWczytana[ i ]; }
   
private:
    array < unsigned char >^ bitmapaWczytana;
   
   
};
i tutaj moje pytanie czy po wykonaniu funkcji button1 stracę zmienną bitmapa?
tj czy program automatycznie zwolni pamięć, czy nie?

przy testach wyszło mi ze w pamięci ciągle jest ta zmienna ale nie były wykonywane żadne inne operacje więc możliwe że w pamięci poprostu zostały szczątki tej dużej tablicy charów?



//::Używaj tagów. :)
P-9049
manfred
» 2009-08-03 20:31:41
Zrób z tej klasy refklasę (zamiast class bodajże ref class), wtedy będziesz sobie mógł trzymać gcwskaźnik do tej tablicy (czyli typ array<unsigned char>^). Wtedy będziesz musiał tworzyć jej obiekty jak wszystkie inne refklasy, czyli trzymać przez gcwskaźnik (BMP^) i tworzyć przez gcnew.
Nie "VS C++", tylko C++/CLI.
P-19127
manfred
» 2009-08-04 22:42:00
To przecież .NET, masz garbage collector, nie przejmuj się, że jakiś tam obiekt wisi, jak GC sobie o nim przypomni to go wykurzy. Chociaż wygląda na to, że ciągle trzymasz refa do tego obiektu, jeśli chcesz go oddać w ofierze panu GC, to wyzeruj ref (bitmapa = null; ).
P-19136
« 1 »
  Strona 1 z 1