Структуры на С для MK ?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

Пример

struct deque {

private:

typedef void (*Func)(void);
Func func_;

public:

#define SIZE_BUF 8

//кольцевой (циклический) буфер

unsigned char cycleBuf[SIZE_BUF];
unsigned char tail = 0; //"указатель" хвоста буфера
unsigned char head = 0; //"указатель" головы буфера
unsigned char count = 0; //счетчик

func_ push_back;
func_ clear;
func_ erase;
func_ front;
func_ begin;
};


void pushback(void){
return;
}

void main (void)
{
deque a;
a.push_back=pushback;

(*a.push_back)(); // Вызов

}

Помогите исправить ошибки
Реклама
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

FUZZY_ писал(а):a.push_back=pushback;

(*a.push_back)(); // Вызов
Неправильно вызов сделан - * не нужна. А вообще зачем городить указатели на функции - используй обычные функции.
FUZZY_ писал(а):unsigned char count = 0; //счетчик
Хранить число элементов не обязательно - оно легко вычисляется из указателей на начало и конец. count - это (head-tail)%SIZE_BUF
FUZZY_ писал(а):Помогите исправить ошибки
Список ошибок, которые выдал компилятор, мы должны угадывать?

И зачем вообще создавать ещё одну тему?
Реклама
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Сообщение lix »

еще private c public убрать надо.
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

a.push_back=pushback;

(*a.push_back)(); // Вызов

Неправильно вызов сделан - * не нужна. А вообще зачем городить указатели на функции - используй обычные функции.



(*a.push_back)() эквивалентно a.push_back() .

Указатели нужны для вызова функций в адресном пространстве 2 Mb
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

#define SIZE_BUF 8
typedef void (*Func)(void);
void push_back();
void clear();
void erase();
void front();
void begin();

struct deque {
Func func;
unsigned char cycleBuf[SIZE_BUF];
unsigned char tail = 0;
unsigned char head = 0;
unsigned char count = 0;
};


void push_back(void){
// to do anything
}

void main (void)
{
struct a;

a.func=push_back;
a.func();
}
Последний раз редактировалось xrays Вс сен 05, 2010 20:37:25, всего редактировалось 1 раз.
Реклама
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

Murav писал(а): А вообще зачем городить указатели на функции - используй обычные функции.
уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

xrays, в книге про указатели отводится несколько страниц, Вам их процитировать ?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

Danko, ну процитируйте...такую "полезную книжку", где всего пара строк про указатели написано)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

имхо, вместо того, чтобы корячиться с "переводом" С++ на обычный Си, можно было бы всзять компилятор С++ для требуемого МК, и не парить моск. GCC по-моему для всех известных типов МК существует...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

xrays писал(а):уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Тем что обычные функции имеют заранее известный адрес, а куда указывает указатель заранее не известно. Как результат, этот код занимает кучу места.
FUZZY_ писал(а):Указатели нужны для вызова функций в адресном пространстве 2 Mb
Если программа одна(то есть в пределах одного файла, генерируемого линковщиком), то никаких проблем с вызовом функций быть не может.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

Murav писал(а):
xrays писал(а):уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Как результат, этот код занимает кучу места.
бред пишите, товарисч
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

Я тут краешком задел тему о перемещаемых функциях - когда нужная функция для повышения быстродействия грузится в ОЗУ - выполняется затем выгружается - но это уже отдельный вопрос МК и операционные системы, там работа только с указателями.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

xrays, я бы переписал чуток - с лейблом на структуре вряд ли винавр откомпилит, как - то так

Код: Выделить всё

typedef void (*Func)(void);
void push_back();
void clear();
void erase();
void front();
void begin();
//--
typedef struct  {
Func func;
unsigned char cycleBuf[SIZE_BUF];
unsigned char tail;
unsigned char head ;
unsigned char count ;
}deque;
 deque a;
 a.tail=a.head=a.count=0;
a.func=&push_back;
a.func();
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

urry, имя функции - это константный указатель
этим a.func=&push_back; вы присваиваете адрес ячейки памяти, где храниться конкретный указатель на функцию(т.е. имя функции), первый адрес области кода функции, а нужно значение, т.е. адрес начала функции
в вашем примере это скорее всего скомпилируется - логически это не верно
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

:))

Код: Выделить всё


a.func=push_back;
a.func();
 11e:	e6 df       	rcall	.-52     	; 0xec <push_back>


a.func=&push_back;
a.func();
 11e:	e6 df       	rcall	.-52     	; 0xec <push_back>
Контактная информация:
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

xrays писал(а):urry, имя функции - это константный указатель
этим a.func=&push_back; вы присваиваете адрес ячейки памяти, где храниться конкретный указатель на функцию(т.е. имя функции), первый адрес области кода функции, а нужно значение, т.е. адрес начала функции
Можно использовать оба варианта, они будут работать одинаково. Имя функции - это только имя функции и указателем оно само по себе не является. Как раз более правильная запись получения указателя на функцию - использование &. Кстати вызывать функцию через указатель, в отличие от имени, можно с разыменовыванием (*funcptr)() , но естественно никто так не пишет.
xrays писал(а):бред пишите, товарисч
Почитай справочник по C и принципы работы оптимизатора - поймёшь почему это не бред.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс ноя 01, 2009 13:12:35

Сообщение xrays »

Murav, посмотри на определение Func и подебаж код, посмотри что есть имя функции
и почитай кернингана и ритчи - тебе полезно будет
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

xrays писал(а):Murav, посмотри на определение Func и подебаж код, посмотри что есть имя функции
и почитай кернингана и ритчи - тебе полезно будет
В тему по указателям

как правильно обявить масив masfun


#include <math.h>
float cos(float);
float sin(float);
float tan(float);

float( * ( * masfun - ????

void main (void)
{ float x=0.5, y; int i;

masfun[0]=cos;
masfun[1]=sin;
masfun[2]=tan;

for(i=0; i<3; i++)
{
y=masfun[ i ] ( x ); printf("\n x =%g y= %g " , x, y );
} }
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Сообщение Murav »

В данном случае что-нибудь типа

Код: Выделить всё

float (*funcarray[3]) (float a);
А вообще точно не помню. Проще объявить сначала тип указателя на нужную функцию, а потом уже делать с ним массив:

Код: Выделить всё

float (*FuncType) (float a) ;
FuncType funcarray[3];
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

//через массив указателей на масив указателей на функцию
** простите за тафтологию

double (*(*pu[3]) )(double ) ;

pu[0]=funcarray_0; // - 3 функции
pu[1]=funcarray_1; // 2 функции
pu[2]=funcarray_2; // 2 функции

как сделать вызов функций из funcarray_1

pu[1]????

;--------------------------------------------------------------
typedef char (pointer_to_mas)[5] ;
char *k;

char * mfun(void)
{
pointer_to_mas array;
return array; - значения массива разрушаются при выходе из функции ???
}

k=mfun;
Последний раз редактировалось FUZZY_ Пн сен 06, 2010 22:34:59, всего редактировалось 3 раза.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»