C++ VS.NET problém s přístupem do paměti naalokovaných komponent – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C++ VS.NET problém s přístupem do paměti naalokovaných komponent – .NET – Fórum – Programujte.comC++ VS.NET problém s přístupem do paměti naalokovaných komponent – .NET – Fórum – Programujte.com

 

kubees0
Duch
22. 6. 2008   #1
-
0
-

Zdravím,
narazil jsem na problém, jehož příčina je pro mě nepochopitelná:

1. V konstruktoru formuláře vytvořím tabulku buttonů a nastavím jim nějaké parametry:



private: System::Windows::Forms::Button^ ** tabulka;



tabulka = new(System::Windows::Forms::Button^*[20]);
for (i = 0; i<20; i++)
{
tabulka[i] = (System::Windows::Forms::Button^*)malloc(30*sizeof(System::Windows::Forms::Button^));
for (j = 0; j<30; j++)
{
tabulka[i][j] = (gcnew System::Windows::Forms::Button());

tabulka[i][j]->Location = System::Drawing::Point(300+29*i+(i+4)/5, 30+24*j+(j+29)/30);
tabulka[i][j]->Size = System::Drawing::Size(30, 25);
tabulka[i][j]->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
tabulka[i][j]->BackColor = System::Drawing::Color::White;
Controls->Add(tabulka[i][j]);
}
}

Vše jde bez problémů nastavit a tabulka se zobrazí na formuláři, ale

2. V metodě nezávislého tlačítka, které mám na formuláři chci nastavovat paramety buttonů v tabulce:


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
tabulka[15][15]->BackColor = System::Drawing::Color::LightPink; // TADY TO SPADNE!!!
}

A při pokusu o tuto změnu program spadne s hláškou
AccessViolationExcption was unhandled
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.


Zajímavé je, že pokud ten samý příkaz jen přesunu ctr+x ctrl+v o pár řádků výš do konstruktoru, tak bez problémů funguje. To samé platí i pro delete (tabulka[15][15]); .
Upravovat jiné komponenty (např. přednastavená tlačítka nebo normální tlačítka vytvořená v konstruktoru) je z vnitřku této metody také možné a funguje to. Vůbec nechápu, proč najednou nesmím zasahovat do té paměti, kterou jsem si v konstruktoru naalokoval.

Předem děkuji za případné vysvětlení i za případné konstruktivní nadávky na můj určitě prasácký kód.

Nahlásit jako SPAM
IP: 78.128.196.–
Quiark0
Věrný člen
22. 6. 2008   #2
-
0
-

No asi to máš blbě :) Nevím sice kde, ale vůbec se mi nelíbí míchání tří různých způsobů alokace (.NETové, new a malloc). Já osobně bych to hodil do .NETového List<> a bylo by to bez problémů.

P.S.: Zkus using namespace System::Windows::Forms ;)

Nahlásit jako SPAM
IP: 194.212.43.–
kubees0
Duch
22. 6. 2008   #3
-
0
-

To Quiark :
using namespace System::Windows::Forms tam je.

Vím, že ta alokace je divná, ale nevěděl jsem, jak jinak to udělat, protože new na vytvoření buttonů nejde (Button b1 = new(Button); => error C2750: 'System::Windows::Forms::Button' : cannot use 'new' on the reference type; use 'gcnew' instead)
a na vytvoření pole buttonů taky ne (error C2728: 'System::Windows::Forms::Button' : a native array cannot contain this managed type) tak jsem použil malloc.

Nemohl bys prosím napsat, jak by ta alokace vypadala pomocí toho List<> ?

Nahlásit jako SPAM
IP: 78.128.196.–
Quiark0
Věrný člen
22. 6. 2008   #4
-
0
-



List<Button^> ^lst = gcnew List<Button^>();
lst->Add(gcnew Button);
...


prostě normální práce s .NETovým List.

Nahlásit jako SPAM
IP: 194.212.43.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý