Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Глобальный динамический массив


Автор: Snegovik86 18.8.2010, 11:53
Всем доброго времени суток!
Я более менее знаю язык VB, тк его преподавали в универе, сейчас по роду деятельности(разработчик софта и железа основанного на MK) занялся изучением С++.
Столкнулся с проблемой, разработав алгоритм решающий, поставленную задачу, убедившись в его исправности и выгодности отладил его на VB используя глобально объявленные переменные и массивы(алгоритм подразумевает работу с одними и теме же динамическими массивами из разных процедур), которые подразумевалось в С++ затолкать в одну структуру. Но столкнулся с тем что как писать глобально такую структуру и вызывать её в любой функции не представляю. При том что операторы malloc realloc и free мне известны, и я уже с ними работал.
Подразумевалось следующая структура:
Код

 typedef struct 
{
  int x; //координата х
  int y; //координата у
} TK;// точки контура

typedef struct 
{
  int Ymax;    // верхния точка контура
  int Ymin;    // нижняя точка контура
  int CHmktk;  // Число точек в массиве курсивной точки контура
 TK MKTK[0];             // динамический массив курсивных точк контура
}KTK; // курсивные точки контура

Вопрос 1) Возможно ли в структуре реализовать динамический массив?
Вопрос 2) Проблема в мышлении VB и глобально объявленных массивах? И надо просто сделать глобальные переменные а по функции передавать указатель на массив.

Автор: Dem_max 18.8.2010, 12:34
Цитата

Вопрос 1) Возможно ли в структуре реализовать динамический массив?

в структуре можно хранить указатель на динамический массив. 
Код

 typedef struct 
{
  int x; //координата х
  int y; //координата у
  int array*;
} TK;// точки контура

TK tk;
tk.array = new int[200];


Выделили по указателю память на 200 элементов типа int

Цитата

Вопрос 2) Проблема в мышлении VB и глобально объявленных массивах? И надо просто сделать глобальные переменные а по функции передавать указатель на массив.


Если переменные глобальные то передавать указатель не обязательно, если локальные то передавать указатели на массивы.

Автор: SVN74 18.8.2010, 17:30
Структуры в С++ почти как классы, только с меньшей защитой имеют конструкторы и деструкторы...
Код

 typedef struct NM
{
  int x; //координата х
  int y; //координата у
  int *array;
  NM()
  {
    array = new int[200];
  }
  ~NM()
  {
    delete [] array;
  }
} TK;// точки контура

Может Вам лучше использовать классы?

Автор: Snegovik86 19.8.2010, 08:08
Проблема в том что я с ними ещё не работал, и если признаться думал что классы это те же структуры...
С одной точки зрения хочется поглубже узнать язык С++ и написать программу так как правильно с точки зрения языка, а с др. стороны так как проще и удобнее и быстрее. Затеял я работу с глобальными структурами только потому что хочу написать так что получше узнать С++... И как ещё более правильнее я не знаю. Поэтому и прошу помощи.

Автор: mes 19.8.2010, 09:46
Цитата(SVN74 @  18.8.2010,  16:30 Найти цитируемый пост)
 только с меньшей защитой

нельзя ли пояснить ?!  smile 

Автор: SVN74 19.8.2010, 10:47
Цитата(mes @  19.8.2010,  09:46 Найти цитируемый пост)
нельзя ли пояснить ?!  

Это сугубо мое личное мнение. 
1. Структура использует стек, а стек не такой уж и большой, учитывая  что структуры могут только копироваться...
2. В отличие от классов структуры работают по прямому доступу к их типам, а классы через указатели...
3. По умолчанию структура в отличие от класса все типы держит открытыми, а это наталкивает на мысль...
Классы используют кучу, не копируются, доступны только через указатели, по умолчанию все типы закрыты.
На мой взгляд, -  возможности защиты класса выше...

Автор: mes 19.8.2010, 11:15
Цитата(SVN74 @  19.8.2010,  09:47 Найти цитируемый пост)
По умолчанию структура в отличие от класса все типы члены держит открытыми,

из сказанного верно только то что в цитате 
 smile 
больше различий между ними нет
 smile

Автор: JackYF 19.8.2010, 21:25
Цитата(SVN74 @  19.8.2010,  09:47 Найти цитируемый пост)
1. Структура использует стек, а стек не такой уж и большой, учитывая  что структуры могут только копироваться...
2. В отличие от классов структуры работают по прямому доступу к их типам, а классы через указатели...

Мне кажется, вы перепутали С++ с чем-то другим.

Автор: bsa 23.8.2010, 17:56
Snegovik86, в С++ динамический массив называется вектор. Для этого в стандартной библиотеке шаблонов существует соответствующий шаблон, который называется vector. Чтобы его использовать, нужно подключить заголовочный файл <vector>, а в том месте, где нужен динамический массив элементов TK написать std::vector<TK>:
Код
 #include <vector>
 typedef struct 
{
  int x; //координата х
  int y; //координата у
} TK;// точки контура
typedef struct 
{
  int Ymax;    // верхния точка контура
  int Ymin;    // нижняя точка контура
  int CHmktk;  // Число точек в массиве курсивной точки контура
  std::vector<TK> MKTK;             // динамический массив курсивных точк контура
}KTK; // курсивные точки контура
MKTK будет такой же переменной, как и остальные. доступ к элементам массива по индексу MKTK[i]. Так же есть метод size(), который возвращает количество элементов в массиве. Остальное можно почитать в документации. А для начала рекомендую зайти в http://forum.vingrad.ru/index.php?show_type=forum&showtopic=269794&kw=faq-c++ и ознакомиться с ними. Возможно, список литературы окажется очень полезен.  smile 

Автор: Snegovik86 30.8.2010, 09:26
Спасибо большое!  smile Пошёл читать и ваять... 

Автор: Snegovik86 31.8.2010, 10:21
Боюсь что так вот
Код

  std::vector<TK> MKTK;

не получиться по причине того что я работаю не совсем с "чистым" С++, а с IAR C/C++ for Advanced RISC Machines Ltd’s для ARM® Cores, а именно для sam9261. Сделал вывод такой вывод т.к. при подключении <vector> выдаёт тьма ошибок при компиляции...

Автор: ИванМ 31.8.2010, 16:20
Snegovik86, пользуйтесь значит другим компилятором. Потому что vector это неотъемлемая часть c++ и не поддерживать его стыдно.

Автор: djamshud 31.8.2010, 16:32
Дело не в плохом компиляторе, а в том, что не везде уместо поддерживать полностью стандарт С++. То есть урезанный С++ - это не баг, а фича.

Топикстартеру советую гуглить реализации вектора на си. Ну или написать самому.

Добавлено через 24 секунды
Самому можно написать даже с классами.

Автор: ИванМ 31.8.2010, 20:45
Цитата(djamshud @  31.8.2010,  16:32 Найти цитируемый пост)
Дело не в плохом компиляторе, а в том, что не везде уместо поддерживать полностью стандарт С++. То есть урезанный С++ - это не баг, а фича.

В таком случае неуместно его называть C++. Слишком громкое название.

Автор: djamshud 31.8.2010, 23:18
Меня совершенно случайно посетила гениальная мысль. Странно, что у компилятора есть заголовочный файл вектор, а скомпилировать его он не может. Возможно запускается С-компилятор вместо С++?

Автор: bsa 1.9.2010, 01:07
Цитата(Snegovik86 @  31.8.2010,  11:21 Найти цитируемый пост)
не получиться по причине того что я работаю не совсем с "чистым" С++, а с IAR C/C++ for Advanced RISC Machines Ltd’s для ARM® Cores, а именно для sam9261. 

Я тоже пишу ПО под этот проц. Использую для этого gcc. Настроил http://buildroot.uclibc.org/ и получаю удовольствие.

Автор: Snegovik86 10.9.2010, 08:40
Цитата

Возможно запускается С-компилятор вместо С++?

Есть доля правды в такой мысле. Т.К.  у нас всё таки не PC а всего навсего мироконтроллер, хотя и весьма навароченный, для его работы используется смесь двух языков. Поэтому компилятор так и называется 
Цитата

IAR C/C++ for Advanced RISC Machines Ltd’s for ARM® Cores

Интересно другое. Я сделал хранение указателя динамического массива в глобально объявленной структуре, и с уверенностью могу сказать что он действительно работает, но на сколько я понимаю если я объявляю два различных массива 
Код

struct TK * MKTK = malloc((short)z * sizeof(TK));
struct TK * MNTP = malloc((short)z * sizeof(TK));

то элементы этих массивов должны быть абсолютно развязаны между собой в памяти. А у меня при записи в элементы одного массива они пишутся и во второй в ячейку под тем же адресом...
Вышел из положения созданием одного большого массива и сам слежу за распределением памяти...
Цитата

Настроил buildroot и получаю удовольствие.

Совершенно справедливое изречение Одно но!  smile  Мне в целевом устройстве не нужно:
1) раздувать периферию только для того что бы поставить Linux, как следствие увеличение стоимости изделия.
2) время ожидания загрузки ОС 15-20 секунд это очень много
3) всё то что может предоставить ОС
Мне просто нужен высокопроизводительный камень для решения конкретных задач, поэтому я работаю непосредственно с С компилятором и контроллером.
Цитата

Использую для этого gcc

Прошерстил форумы и сам собираюсь уходить с IAR на KEIL. Из этих трёх компиляторов самый компактный и выверенный машинный код получается у KEILa. Разница ощутима при одних и тех же программах.

Автор: icecrashldr 10.9.2010, 10:37
Код

 typedef struct 
{
  int x; //координата х
  int y; //координата у
} TK;// точки контура
typedef struct 
{
  int Ymax;    // верхния точка контура
  int Ymin;    // нижняя точка контура
  int CHmktk;  // Число точек в массиве курсивной точки контура
 TK MKTK[0];             // динамический массив курсивных точк контура
}KTK; // курсивные точки контура


KTK * ktk;
unsigned int needSizeArray;

ktk = malloc(sizeof(KTK) + needSizeArray);


И компактно и быстро, особенно если стукруту надо будет сохранить , передать и все такое ...smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)