roboforum.ru

Технический форум по робототехнике.

Динамические структуры в CodeVisionAVR

Учиться можно на своих ошибках, но учиться на чужих — быстрее и дешевле ;)

Динамические структуры в CodeVisionAVR

Сообщение greenrat » 25 ноя 2008, 13:33

По заданию имеется некая структура из определенных параметров, необходим динамический массив этой структуры изменяемый в процессе работы программы. Как это сделать в вижене? в компьютерном сишнике все ясно 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);
}



выше приведенный код работает - но меня терзают смутные сомнения - правилен ли он?
greenrat
 
Сообщения: 5
Зарегистрирован: 17 дек 2007, 11:45

Re: Динамические структуры в CodeVisionAVR

Сообщение -= Александр =- » 25 ноя 2008, 13:59

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

Re: Динамические структуры в CodeVisionAVR

Сообщение greenrat » 25 ноя 2008, 14:04

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

Re: Динамические структуры в CodeVisionAVR

Сообщение -= Александр =- » 25 ноя 2008, 14:18

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

Re: Динамические структуры в CodeVisionAVR

Сообщение greenrat » 25 ноя 2008, 14:40

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

Re: Динамические структуры в CodeVisionAVR

Сообщение greenrat » 26 ноя 2008, 12:33

Поробовал так как ты советовал но возник непонятный глюк
Код: Выделить всёРазвернуть
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 присваивается последний элемент
greenrat
 
Сообщения: 5
Зарегистрирован: 17 дек 2007, 11:45

Re: Динамические структуры в CodeVisionAVR

Сообщение Виталий » 26 ноя 2008, 13:04

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

Re: Динамические структуры в CodeVisionAVR

Сообщение Digit » 26 ноя 2008, 13:05

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

Re: Динамические структуры в CodeVisionAVR

Сообщение -= Александр =- » 26 ноя 2008, 15:07

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

Re: Динамические структуры в CodeVisionAVR

Сообщение greenrat » 27 ноя 2008, 10:43

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

Re: Динамические структуры в CodeVisionAVR

Сообщение executer » 20 июл 2009, 01:40

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

Re: Динамические структуры в CodeVisionAVR

Сообщение Сергей » 20 июл 2009, 01:55

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

Re: Динамические структуры в CodeVisionAVR

Сообщение executer » 20 июл 2009, 02:15

Вот вырезка из кода:
Код: Выделить всёРазвернуть
char *EditText;
EditText=malloc(30);

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

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

Думал и тут прокатит.
Аватара пользователя
executer
 
Сообщения: 784
Зарегистрирован: 30 янв 2009, 01:24
Откуда: Запорожье
прог. языки: Си, AvrASM, STL, САС, учу Си++
ФИО: Павел


Вернуться в Осторожно — грабли ;)

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

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