Problem ze wskaźnikiem do tablicy char (VS C++)
Ostatnio zmodyfikowano 2009-08-04 22:42
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 class BMP { public: BMP( char & ); ~BMP(); void zapiszWielkoscNaglowka(); void zapiszSzerokoscBitmapy(); void zapiszWysokoscBitmapy(); int zapiszIloscKolorow(); int zwrocLiczbeKolorow(); long zwrocWysokoscBitmapy(); long zwrocSzerokoscBitmapy(); private: 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. |
|
WunM |
» 2009-08-03 20:28:06 Bo tablica jest wskaźnikiem. |
|
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 a następnie w funkcji button1 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 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. :) |
|
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. |
|
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; ). |
|
« 1 » |