Страница 1 из 2
Структуры на С для MK ?
Добавлено: Чт сен 02, 2010 19:52:31
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)(); // Вызов
}
Помогите исправить ошибки
Re: Структуры на С для MK ?
Добавлено: Чт сен 02, 2010 20:56:35
Murav
FUZZY_ писал(а):a.push_back=pushback;
(*a.push_back)(); // Вызов
Неправильно вызов сделан - * не нужна. А вообще зачем городить указатели на функции - используй обычные функции.
FUZZY_ писал(а):unsigned char count = 0; //счетчик
Хранить число элементов не обязательно - оно легко вычисляется из указателей на начало и конец. count - это (head-tail)%SIZE_BUF
FUZZY_ писал(а):Помогите исправить ошибки
Список ошибок, которые выдал компилятор, мы должны угадывать?
И зачем вообще создавать ещё одну тему?
Re: Структуры на С для MK ?
Добавлено: Чт сен 02, 2010 21:00:39
lix
еще private c public убрать надо.
Re: Структуры на С для MK ?
Добавлено: Чт сен 02, 2010 21:38:05
FUZZY_
a.push_back=pushback;
(*a.push_back)(); // Вызов
Неправильно вызов сделан - * не нужна. А вообще зачем городить указатели на функции - используй обычные функции.
(*a.push_back)() эквивалентно a.push_back() .
Указатели нужны для вызова функций в адресном пространстве 2 Mb
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 12:13:25
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();
}
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 12:18:37
xrays
Murav писал(а): А вообще зачем городить указатели на функции - используй обычные функции.
уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 12:37:22
Danko
xrays, в книге про указатели отводится несколько страниц, Вам их процитировать ?
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 12:40:09
xrays
Danko, ну процитируйте...такую "полезную книжку", где всего пара строк про указатели написано)
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 13:27:29
ARV
имхо, вместо того, чтобы корячиться с "переводом" С++ на обычный Си, можно было бы всзять компилятор С++ для требуемого МК, и не парить моск. GCC по-моему для всех известных типов МК существует...
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 15:34:37
Murav
xrays писал(а):уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Тем что обычные функции имеют заранее известный адрес, а куда указывает указатель заранее не известно. Как результат, этот код занимает кучу места.
FUZZY_ писал(а):Указатели нужны для вызова функций в адресном пространстве 2 Mb
Если программа одна(то есть в пределах одного файла, генерируемого линковщиком), то никаких проблем с вызовом функций быть не может.
Re: Структуры на С для MK ?
Добавлено: Пт сен 03, 2010 15:38:59
xrays
Murav писал(а):xrays писал(а):уважаемый, а чем отличаются "обычные функции" от указателей на функции?)))
Как результат, этот код занимает кучу места.
бред пишите, товарисч
Re: Структуры на С для MK ?
Добавлено: Сб сен 04, 2010 10:38:36
FUZZY_
Я тут краешком задел тему о перемещаемых функциях - когда нужная функция для повышения быстродействия грузится в ОЗУ - выполняется затем выгружается - но это уже отдельный вопрос МК и операционные системы, там работа только с указателями.
Re: Структуры на С для MK ?
Добавлено: Вс сен 05, 2010 14:51:43
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();
Re: Структуры на С для MK ?
Добавлено: Вс сен 05, 2010 20:33:39
xrays
urry, имя функции - это константный указатель
этим a.func=&push_back; вы присваиваете адрес ячейки памяти, где храниться конкретный указатель на функцию(т.е. имя функции), первый адрес области кода функции, а нужно значение, т.е. адрес начала функции
в вашем примере это скорее всего скомпилируется - логически это не верно
Re: Структуры на С для MK ?
Добавлено: Вс сен 05, 2010 22:18:18
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>
Re: Структуры на С для MK ?
Добавлено: Вс сен 05, 2010 22:57:19
Murav
xrays писал(а):urry, имя функции - это константный указатель
этим a.func=&push_back; вы присваиваете адрес ячейки памяти, где храниться конкретный указатель на функцию(т.е. имя функции), первый адрес области кода функции, а нужно значение, т.е. адрес начала функции
Можно использовать оба варианта, они будут работать одинаково. Имя функции - это только имя функции и указателем оно само по себе не является. Как раз более правильная запись получения указателя на функцию - использование &. Кстати вызывать функцию через указатель, в отличие от имени, можно с разыменовыванием (*funcptr)() , но естественно никто так не пишет.
xrays писал(а):бред пишите, товарисч
Почитай справочник по C и принципы работы оптимизатора - поймёшь почему это не бред.
Re: Структуры на С для MK ?
Добавлено: Пн сен 06, 2010 07:13:11
xrays
Murav, посмотри на определение Func и подебаж код, посмотри что есть имя функции
и почитай кернингана и ритчи - тебе полезно будет
Re: Структуры на С для MK ?
Добавлено: Пн сен 06, 2010 20:00:15
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 );
} }
Re: Структуры на С для MK ?
Добавлено: Пн сен 06, 2010 20:50:54
Murav
В данном случае что-нибудь типа
А вообще точно не помню. Проще объявить сначала тип указателя на нужную функцию, а потом уже делать с ним массив:
Код: Выделить всё
float (*FuncType) (float a) ;
FuncType funcarray[3];
Re: Структуры на С для MK ?
Добавлено: Пн сен 06, 2010 21:31:57
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;