Суббота, 20 Апреля 2024, 03:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Массив Point в WindowsForm
Массив Point в WindowsForm
scriptoДата: Суббота, 02 Апреля 2011, 12:16 | Сообщение # 1
был не раз
Сейчас нет на сайте
Привет всем.Подскажите пожалуйста как в проекте WindowsForm в заголовочном файле объявить один из параметров как массив Point.
Пробовал так

#include "stdafx.h"
#include "Form1.h"
using namespace System::Drawing;

//расставить вершины
void draw_top(int &n, Point point[]);

Но компилятор ругается.Что нужно подключить?
И вообще как создать глобальный массив Point и где?

MorglodДата: Суббота, 02 Апреля 2011, 13:55 | Сообщение # 2
Вечно пилящий двиг
Сейчас нет на сайте
чем ругается?
----------------
кажется надо указать размер массива... biggrin


вначале был #include

scriptoДата: Суббота, 02 Апреля 2011, 20:48 | Сообщение # 3
был не раз
Сейчас нет на сайте
Вы вообще знаете как передается массив?Если не разбираетесь,то не давайте пожалуйста безответственных комментариев.
PesetsДата: Суббота, 02 Апреля 2011, 20:52 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
вопрос вполне уместен "чем ругается?"
и где остальной код?
Quote (scripto)
И вообще как создать глобальный массив Point и где?

Внезапно:
Code
Point your_array_name[your_array_length];

Где тебе нужно, там и создавай)





Сообщение отредактировал Pesets - Суббота, 02 Апреля 2011, 20:53
scriptoДата: Суббота, 02 Апреля 2011, 21:02 | Сообщение # 5
был не раз
Сейчас нет на сайте
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!!!!)

PesetsДата: Суббота, 02 Апреля 2011, 21:16 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Quote (scripto)
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);

Тогда можно будет создавать глобальные переменные, но будут сложности с управлением памятью (и вообще, это плохой стиль).



scriptoДата: Суббота, 02 Апреля 2011, 21:28 | Сообщение # 7
был не раз
Сейчас нет на сайте
Да,приложение типа WindowsFormApplication.
Quote
void draw_top(int &n, array<Point> ^point)

На это не ругается.

пробовал и так:

Code
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[])

А тут как лучше?

PesetsДата: Суббота, 02 Апреля 2011, 21:44 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Quote (scripto)
void draw_top(int &n, Point *points);

А вот так массив передать не получится) CLR не даст.

В первом случае глобальных переменных не будет (хотя, если их грамотно инкапсулировать wink ), вызываем так:

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];

Добавлено (02.04.2011, 21:44)
---------------------------------------------

Quote (scripto)
А тут как лучше?

Честно, не знаю. CLR не соответствует стандартам C++ (Билдер, кстати, тоже), поэтому лично я его не особо жалую и не изучаю. Думаю, тебе бы сходить на специализированный форум, там лучше расскажут.





Сообщение отредактировал Pesets - Суббота, 02 Апреля 2011, 21:45
scriptoДата: Суббота, 02 Апреля 2011, 22:08 | Сообщение # 9
был не раз
Сейчас нет на сайте
То есть можно объявить
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;
PesetsДата: Суббота, 02 Апреля 2011, 22:28 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Quote (scripto)
И где обявить в Form1.h глобальную такую переменную после этого

Ну я же сказал, что нельзя array делать глобальной переменной. Объявить в другом месте - пожалуйста, но только в динамической памяти.



scriptoДата: Суббота, 02 Апреля 2011, 22:32 | Сообщение # 11
был не раз
Сейчас нет на сайте
То есть я никак не смогу воспользоваться данными записанными в массив points,создфнные через array из другого файла?
PesetsДата: Суббота, 02 Апреля 2011, 22:34 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
Да, вот такой вот финт ушами, вроде, должен помочь)
Code
public ref class PointContainer
{
public:
   static array<Point> ^points;
};

Ну, и это куда-нибудь в хидеры или сразу после "using namespace"





Сообщение отредактировал Pesets - Суббота, 02 Апреля 2011, 22:35
scriptoДата: Пятница, 08 Апреля 2011, 00:59 | Сообщение # 13
был не раз
Сейчас нет на сайте
попробую отпишусь

Добавлено (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: добавьте код конструктора
    //
      
   }

  protected:
   /// <summary>
   /// Освободить все используемые ресурсы.
   /// </summary>
   ~Form1()
   {
    if (components)
    {
     delete components;
    }
   }
  private: System::Windows::Forms::RadioButton^  radioButton1;
  protected:  
  private: System::Windows::Forms::RadioButton^  radioButton2;
     
  private:
   /// <summary>
   /// Требуется переменная конструктора.
   /// </summary>
   System::ComponentModel::Container ^components;

#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());
              
    this->SuspendLayout();
    //  
    // radioButton1
    //  
    this->radioButton1->AutoSize = true;
    this->radioButton1->Checked = true;
    this->radioButton1->Location = System::Drawing::Point(747, 95);
    this->radioButton1->Name = L"radioButton1";
    this->radioButton1->Size = System::Drawing::Size(85, 17);
    this->radioButton1->TabIndex = 0;
    this->radioButton1->TabStop = true;
    this->radioButton1->Text = L"radioButton1";
    this->radioButton1->UseVisualStyleBackColor = true;
    //  
    // radioButton2
    //  
    this->radioButton2->AutoSize = true;
    this->radioButton2->Location = System::Drawing::Point(747, 141);
    this->radioButton2->Name = L"radioButton2";
    this->radioButton2->Size = System::Drawing::Size(85, 17);
    this->radioButton2->TabIndex = 1;
    this->radioButton2->Text = L"radioButton2";
    this->radioButton2->UseVisualStyleBackColor = true;
    //  
    // Form1
    //  
    this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->ClientSize = System::Drawing::Size(892, 466);
    this->Controls->Add(this->radioButton2);
    this->Controls->Add(this->radioButton1);
    this->Name = L"Form1";
    this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
    this->Text = L"Лабораторная работа №6 Работа с графом с помощью WindowsForms";
    this->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Form1_MouseDown);
    this->ResumeLayout(false);
    this->PerformLayout();

   }
#pragma endregion

  private: System::Void Form1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
      Graphics ^g = this->CreateGraphics();
      Point P = e->Location;
      points = gcnew array<Point>(100500);
      //нарисовать вершины
      if(this->radioButton1->Checked)
      {
        
                      draw_top(n, points);
      }
             
             //  graphic.draw_top(ref n, point, P, g);
             
     }
  };
}


Но выдает ошибку:
1>d:\documents\etudes\6семестр\сппо\lab\lab6_graph\graph_in windowsform\Form1.h(125) : error C2065: points: необъявленный идентификатор
1>d:\documents\etudes\6семестр\сппо\lab\lab6_graph\graph_in windowsform\Form1.h(130) : error C2065: points: необъявленный идентификатор
PesetsДата: Пятница, 08 Апреля 2011, 14:57 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
строка 125 (Если я правильно восстановил нумерацию):
Code
GlobalObjects::points = gcnew array<Point>(100500);

строка 130:
Code
draw_top(n, GlobalObjects::points);

Да, и на будущее:




scriptoДата: Суббота, 09 Апреля 2011, 01:05 | Сообщение # 15
был не раз
Сейчас нет на сайте
Я попробовал как ты и сказал-выдает ошибку:
Code

Ошибка    2    error LNK2028: ссылка на неразрешенную лексему (0A00000A) "void __clrcall draw_top(int &,cli::array<class System::Drawing::Point >^)" (?draw_top@@$$FYMXAAHP$01AVPoint@Drawing@System@@@Z) в функции "private: void __clrcall graph_inwindowsform::Form1::Form1_MouseDown(class System::Object ^,class System::Windows::Forms::MouseEventArgs ^)" (?Form1_MouseDown@Form1@graph_inwindowsform@@$$FA$AAMXP$AAVObject@System@@P$AAVMouseEventArgs@Forms@Windows@4@@Z)    graph_in windowsform.obj

Не посмотришь ли программу?она по сути пустая,вот с этим бы разобраться.И спасибо за совет-учту!
http://yemsalat.org/go/upload.php

Добавлено (09.04.2011, 01:05)
---------------------------------------------

Quote
Как со стеной разговариваю...
http://tinyurl.com/6jg4oja
Буквально в первых ссылках и описание проблемы и решение.

Не срабатывает!Пробую-все ругается и ругается компилятор

PesetsДата: Суббота, 09 Апреля 2011, 10:46 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
*facepalm*
Ладно, не буду спрашивать, что ты за "систему ниппель" делаешь, тык



scriptoДата: Воскресенье, 10 Апреля 2011, 11:19 | Сообщение # 17
был не раз
Сейчас нет на сайте
Спасибо.А так,по учебе нужно написать прогу с графом, уже писал подобное на builder,на winapi,на с# ,а тут возникли непредвиденные проблемы как видишь.Еще раз спасибо.Думаю,что дальше разберусь.Может порекомендуешь какую-нибудь литиратуру по clr с c++?
Форум игроделов » Программирование » C/C++ » Массив Point в WindowsForm
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг