1>d:\documents\etudes\6семестр\сппо\lab\lab6_graph\graph_in windowsform\Graphic.h(9) : error C2728: System::Drawing::Point: собственный массив не может содержать этот управляемый тип 1> Вы имели в виду "array<System::Drawing::Point>"?
В c# с такими проблемами не сталкивался,в winapi тоже.А тут не поиму,что не так.Это и есть весь код.Пусть заработает просто это,тело функции потом будет.Суть то не в этом
Добавлено (02.04.2011, 21:02) --------------------------------------------- Нужно бы в файле Form1.h.и что-то типа: Point *p; а создавать массив динамически в друом месте.Где Point встроенная структура(не POINT от МFC!!!!)
1>d:\documents\etudes\6семестр\сппо\lab\lab6_graph\graph_in windowsform\Graphic.h(9) : error C2728: System::Drawing::Point: собственный массив не может содержать этот управляемый тип 1> Вы имели в виду "array<System::Drawing::Point>"?
Вот с этого и надо было начинать. Я имел ввиду то, что написал. Контейнера "array" ни в одном стандарте С++ нет, равно как и ошибки C2728. Программа пишется на CLR, я так понимаю? Тогда либо передаем в функцию array:
Code
void draw_top(int &n, array<Point> ^point)
Но создать статический array CLR не даст, если я не ошибаюсь Либо использовать массив не с Point'ами, а с указателями на них:
Code
Point *pointarray[100500];
void draw_top(int &n, Point **points);
Тогда можно будет создавать глобальные переменные, но будут сложности с управлением памятью (и вообще, это плохой стиль).
Как вызывать эти функции? И в файле Form1.h где объявить глобальный массив?Хотелось бы что-то типа Point *p;
а создавать динамически массив в другом месте
Добавлено (02.04.2011, 21:28) --------------------------------------------- Предложите вариант?необязательно именно Point.В Builder писал void __fastcall TForm1::Image1Click(TObject *Sender) { //раставить вершины if(RadioButton1->Checked) draw_top(n, point); ... а функции объявлялась в другом файле как void draw_top(int &n, POINT point[])
А вот так массив передать не получится) CLR не даст.
В первом случае глобальных переменных не будет (хотя, если их грамотно инкапсулировать ), вызываем так:
Code
<тело какой-то функции> array<Point> ^points = gcnew array<Point>(100500); int n; ... draw_top(n, points);
Во втором случае сложнее:
Code
Point *points[100500];
<тело какой-то функции> int n; for (int i = 0; i < 100500; i++) points[i] = new Point(); ... draw_top(n, points); ... for (int i = 0; i < 100500; i++) delete points[i];
Честно, не знаю. CLR не соответствует стандартам C++ (Билдер, кстати, тоже), поэтому лично я его не особо жалую и не изучаю. Думаю, тебе бы сходить на специализированный форум, там лучше расскажут.
Сообщение отредактировал Pesets - Суббота, 02 Апреля 2011, 21:45
То есть можно объявить array<Point> ^points; а в другом месте инициализировать: points = = gcnew array<Point>(100500);?
И где обявить в Form1.h глобальную такую переменную после этого
Code
#pragma once
namespace graph_inwindowsform {
using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing;
Добавлено (08.04.2011, 00:59) --------------------------------------------- Не огли бы поподробнее об этом,попробовал так
Code
#pragma once #include "Graphic.h" using namespace System::Drawing;
ref class GlobalObjects { public: static array<System::Drawing::Point> ^points;
};
#define nmax = 1000;
int n = 0; //количество вершин
namespace graph_inwindowsform {
using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing;
/// <summary> /// Сводка для Form1 /// /// Внимание! При изменении имени этого класса необходимо также изменить /// свойство имени файла ресурсов ("Resource File Name") для средства компиляции управляемого ресурса, /// связанного со всеми файлами с расширением .resx, от которых зависит данный класс. В противном случае, /// конструкторы не смогут правильно работать с локализованными /// ресурсами, сопоставленными данной форме. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: добавьте код конструктора //
#pragma region Windows Form Designer generated code /// <summary> /// Обязательный метод для поддержки конструктора - не изменяйте /// содержимое данного метода при помощи редактора кода. /// </summary> void InitializeComponent(void) { this->radioButton1 = (gcnew System::Windows::Forms::RadioButton()); this->radioButton2 = (gcnew System::Windows::Forms::RadioButton());
За дефайны в плюсах обычно ругают. За дефайны с таким синтаксисом бьют лопатой по голове, пока голова не отвалится.
Code
int n = 0; //количество вершин
Советую это тоже запихать в класс GlobalObjects (или вообще без нее обойтись). Ибо когда количество кода перевалит этак за 10 тыщ строк, ты будешь очень долго вспоминать, какая глобальная переменная в каком пространстве имен у тебя валяется (или под что у тебя там отведена переменная с именем "n").
Спасибо.А так,по учебе нужно написать прогу с графом, уже писал подобное на builder,на winapi,на с# ,а тут возникли непредвиденные проблемы как видишь.Еще раз спасибо.Думаю,что дальше разберусь.Может порекомендуешь какую-нибудь литиратуру по clr с c++?