roboforum.ru

Технический форум по робототехнике.
Текущее время: 03 май 2025, 15:21

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 25 ноя 2008, 13:33 
Не в сети

Зарегистрирован: 17 дек 2007, 11:45
Сообщения: 5
По заданию имеется некая структура из определенных параметров, необходим динамический массив этой структуры изменяемый в процессе работы программы. Как это сделать в вижене? в компьютерном сишнике все ясно new, delete и вперед...

Пример
Код:
typedef struct __US_Session
{       
  INT Id;                   
  BYTE TimeDevice;
} US_Session_t;

..<CUT>...

US_Session_t Test[]; //Массив
US_Session_t TestA[10]; //Массив на 10 элементов а как быть если не известно начальное количество????

..<CUT>...

void _Set(struct US_Session_t *data,INT Index,BYTE _TimeDevice )
{
data++;
     (data)->Id=Index;
      (data)->TimeDevice=_TimeDevice;
}

void _Init(void)
{
//Сейчас делаю так
_Set(Test,1,10);
...
_Set(Test,n,10);
}



выше приведенный код работает - но меня терзают смутные сомнения - правилен ли он?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 25 ноя 2008, 13:59 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
Смотри хелп по слову malloc.h - это функции распределения памяти. Вроде на МК работают так-же как и на ПК...

Добавлено спустя 14 минут 15 секунд:
int a[]; - это то-же самое, что и int * a;
Но в таком случае мы не знаем длину массива. Если будем много туда писать - можем задеть другие данные. Поэтому надо делать так:

структура * a;
a = calloc(1,sizeof(структура)); //Получаем место для одного элемента.

Если надо добавить n элементов - далее делаем так:

a = realloc(a,n*sizeof(структура)); //При этом данные сохраняются и добавляется еще место.

Только надо учесть, что в добавленном месте может лежать всякий космический мусор...
Если после выполнения a==NULL - значит свободного места недостаточно.

Чтобы удалить все что насоздавали - делаем free(a);

При всем этом можно пользоваться как и обычным массивом, например b=a[10];

Еще надо помнить что все это происходит в области памяти HEAP и ее размер задается в настройках компилятора.

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 25 ноя 2008, 14:04 
Не в сети

Зарегистрирован: 17 дек 2007, 11:45
Сообщения: 5
Спасибо)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 25 ноя 2008, 14:18 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
Если надо много всего хранить - рекомендую использовать внешнюю память. Ну и контроллер, который умеет ее использовать.

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 25 ноя 2008, 14:40 
Не в сети

Зарегистрирован: 17 дек 2007, 11:45
Сообщения: 5
32 Kb внешняя
Atmega128 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 26 ноя 2008, 12:33 
Не в сети

Зарегистрирован: 17 дек 2007, 11:45
Сообщения: 5
Поробовал так как ты советовал но возник непонятный глюк
Код:
typedef struct _DSmall_test
{
BYTE Id;
BYTE day;
}
DS_test_t;

//////////////////////
DS_test_t *Test2;
//////////////////////

void TestPointerArray(void)
{
BYTE i,N;
DS_test_t *Test1;

N=10; //количество элементов массива

////////////////////////////////////////////
//Выделяем память под массив Test1
  Test1 = calloc(N,sizeof(DS_test_t));

//Заполняем его
  for (i=0;i<N;i++) Test1[i].Id=i;

//Выводим на экран
  for (i=0;i<N;i++) printf("%d,",Test1[i].Id);

///////////////////////////////////////////
//Выделяем память под массив Test2
  Test2 = calloc(N,sizeof(DS_test_t));

//Заполняем его
  for (i=0;i<N;i++) Test2[i].Id=i;

//Выводим на экран
  for (i=0;i<N;i++) printf("%d,",Test2[i].Id);
     
     
// освобождение памяти
free(Test1);
free(Test2); 

}


Вроде бы все здорово - массивы создаются и заполняются, но в первом случае выводится на экран
0,1,2,3,4,5,6,7,8,9 (Test1) адрес переменной 3332,3334,3336,3338,3340,3342,3344,3346,3348,3350
а в
9,9,9,9,9,9,9,9,9,9 (Test2) адрес переменной 3356,3358,3360,3362,3364,3366,3368,3370,3372,3374

В чем проблема? структура же одинаковая, разница только в объявлении переменных - первая (Test1) локальная, а вторая глобальная(Test2)
т.е. походу всем элементам массива Test2 присваивается последний элемент


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 26 ноя 2008, 13:04 
Не в сети
Аватара пользователя

Зарегистрирован: 08 окт 2004, 16:43
Сообщения: 2114
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий
А где calloc под Test2?

_________________
Все новости о моих проектах http://savethebest.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 26 ноя 2008, 13:05 
Не в сети
Аватара пользователя

Зарегистрирован: 27 ноя 2004, 00:42
Сообщения: 3339
Откуда: совсем Москва
ФИО: Григорий
Виталий, он там есть

_________________
злой полицейский


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 26 ноя 2008, 15:07 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
А какой размер HEAP указан?

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 27 ноя 2008, 10:43 
Не в сети

Зарегистрирован: 17 дек 2007, 11:45
Сообщения: 5
1024


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 20 июл 2009, 01:40 
Не в сети
Аватара пользователя

Зарегистрирован: 30 янв 2009, 01:24
Сообщения: 784
Откуда: Запорожье
прог. языки: Си, AvrASM, STL, САС, учу Си++
ФИО: Павел
Извините, а где размер HEAP задается?
- никак немогу malloc() использовать в программе :(
(Мега 32 для внутреннего ОЗУ, WinAVR)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 20 июл 2009, 01:55 
Не в сети

Зарегистрирован: 29 дек 2004, 23:15
Сообщения: 3744
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
А зачем использовать malloc? Для каких целей? Может применительно к твоей задаче можно обойтись чем-нибудь другим..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамические структуры в CodeVisionAVR
СообщениеДобавлено: 20 июл 2009, 02:15 
Не в сети
Аватара пользователя

Зарегистрирован: 30 янв 2009, 01:24
Сообщения: 784
Откуда: Запорожье
прог. языки: Си, AvrASM, STL, САС, учу Си++
ФИО: Павел
Вот вырезка из кода:
Код:
char *EditText;
EditText=malloc(30);

sprintf(EditText,"Бла-бла-бла");

Может еще както можно? Если да, то хотелось бы всетаки и malloc научится пользовать.
Какие еще варианты для создания стринговой переменной?
В скриптах для кампа использовал следующее:
Код:
char *temp;
temp=malloc(15);
sprintf(temp,"Station%i",num);

Думал и тут прокатит.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO