LINUX.ORG.RU

Объявление функции находящейся в static struct


0

1

Здравствуйте.
Для более приятного кода решил распределить переменные и функции по static структурам:

/*...*/
static struct{
	/*...*/
	struct{
		pthread_t tvideo;
		pthread_t tsound;
		void *(fvideo)(void *);
	 	void *(fsound)(void *);
	} multithreading;
	/*...*/
} sys;
/*...*/
int main(int argc, char *argv[]){
	/*...*/
	pthread_create(&sys.multithreading.tvideo, NULL, *sys.multithreading.fvideo, NULL);
	/*...*/
}
/*...*/
Доступ неограниченный, Структуры и функции в единичном экземпляре.
Необходимо объявить функцию sys.multithreading.fvideo.
В данный момент пока объявил функцию вне структуры:
/*...............*/
void *(fvideo)(void *arg){
	/*...*/
}
/*...............*/
pthread_create(&sys.multithreading.tvideo, NULL, *fvideo, NULL);
/*...............*/
Данная функция использует структуру «sys» поэтому объявляться в самой структуре не хочет, не находит «sys».
/*...*/
static struct{
	/*...*/
	struct{
		pthread_t tvideo;
		pthread_t tsound;
		void *(fvideo)(void *arg){
			/*...*/
		};
/*...............*/
/*CPP: error: ‘sys’ was not declared in this scope */
Объявление после структуры написать не удаётся.
/*...............*/
} sys;
void *(sys.multithreading.fvideo)(void *arg){
	/*...*/
}
/*...............*/
/*CPP:  error: expected ‘)’ before ‘.’ token*/
/*CPP:  error: expected initializer before ‘.’ token*/
И дополнительно, какую мне почитать литературу, что-бы разбираться в смеси из указателей, функций и структур,
но не руководство или учебник, а ближе к справочнику и технической документации.

Указатель на функцию объявляется как:

  
void (*fvideo)(void *)
а не
void *(fvideo)(void *);

xterro ★★★★★
()
/*...*/
static struct{
	/*...*/
	struct{
		pthread_t tvideo;
		pthread_t tsound;
		void (*fvideo)(void *arg);
/*...*/
static void fvideo(void *arg){
	/*...*/
};
static void initialize_that_nonsense(){
	/*...*/
	sys.multithreading.fvideo = fvideo;
};

А вообще, не майся дурью.

какую мне почитать литературу, что-бы разбираться в смеси из указателей, функций и структур, но не руководство или учебник, а ближе к справочнику и технической документации.

n1124.pdf — ISO/IEC 9899:TC2 «Programming Languages — C»

geekless ★★
()

Cпасибо, но мне не хотелось-бы разводить лишних указателей и кода,
то есть объявить sys.multithreading.fvideo как void*()(void*) а не как void*(*)(void*)
(именно как функцию, а не указатель на функцию, возвращающую указатель)

С копированием указателей отлично работает:

/*...*/
static struct{
	/*...*/
	struct{
		pthread_t tvideo;
		pthread_t tsound;
		void *(*fvideo)(void *);
	 	void *(*fsound)(void *);
	} multithreading;
	/*...*/
} sys;
void *(fvideo)(void *arg){
	/*...*/
}
/*...*/
int main(int argc, char *argv[]){
	sys.multithreading.fvideo=&fvideo;
	/*...*/
	pthread_create(&sys.multithreading.tvideo, NULL, sys.multithreading.fvideo, NULL);
	/*...*/
}
/*...*/

zheland
() автор топика
Ответ на: комментарий от zheland

Не хочется кода - инициализируй статически

void video_func(void *param);
void audio_func(void *param);

typedef struct tag_yoba_struct {
        struct tag_multithreading {
	        pthread_t tvideo;
	        pthread_t taudio;
                void (*fvideo)(void *);
                void (*faudio)(void *);
        } multithreading;
} yoba_struct;

static yoba_struct yoba = {
        { 0, 0, video_func, audio_func }
};
ono
()
Ответ на: комментарий от xterro

В Си, структуры не могут содержать функции, только указатели на них...

То есть получается даже единичная static struct не может содержать функцию.
Объявлю её в основной части программы.
Переживу, а то всё по структурам пихать тоже наверно нехорошо.

Большое спасибо!

zheland
() автор топика
Ответ на: комментарий от zheland

создай отдельный файл и храни там функции, можно ещё каждую функцию в свой файл пихать и получать кучу объектных файлов, которые пихать в lib.a

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.