LINUX.ORG.RU

[C] Массив указателей на функции.

 


0

0

Такое вообще возможно? А нужно это вот зачем. Мною допиливается драйвер, в котором нужно для определённого количества устройств создать структуры и указателям на функции в этих структурах присвоить адреса собственноручно написанных функций. Пока обслуживаемых устройств мало - всё довольно тупо - пишем несколько однотипных функций с разными параметрами и потом инитим наши структуры для устройств. Но вот теперь, когда их много... есть вариант - написать генератор для исходника, чтобы ручками это не ковырять, ну или разобраться - как объявлять массивы указателей на функции и можно ли так вообще делать :)

★★

Конечно можно. Если смущает синтаксис, используй typedef.

Absurd ★★★
()

А как же иначе доступ к драйверам делать как не через массивы указателей? Естественно можно!

io ★★
()
Ответ на: комментарий от io

Почему-то вот это не работает: #include <stdlib.h> #include <stdio.h>

int func1(int a) { return a; }; int func2(int a) { return a+1; };

int main(int argc, char *argv[]) { int (*mas)(int)[2]; mas[0] = func1; mas[1] = func2;

printf("%d %d\n",mas[0](1),mas[1](1)); return 0; };

может ткнёте носом - где я не прав?

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

Блин..
Почему-то вот это не работает:
#include <stdlib.h>
#include <stdio.h>

int func1(int a)
{
        return a;
};
int func2(int a)
{
        return a+1; 
};

int main(int argc, char *argv[])
{
        int (*mas)(int)[2];
     
        mas[0] = func1;
        mas[1] = func2;

        printf("%d %d\n",mas[0](1),mas[1](1));
        return 0;
};

может ткнёте носом - где я не прав?

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

int (*mas[2])(int);

но если с синтаксисом проблемы, то лучше использовать typedef:

typedef int (*func_t)(int);

func_t mas[2];

anonymous
()
Ответ на: комментарий от lv

Походу всё-таки нельзя сделать то, чего я хочу - gcc явно говорит:
main.c: In function ‘main’:
main.c:20: error: declaration of ‘mas’ as array of functions

На вот такое вот объявление:
int ((*mas)[2])(int);

lv ★★
() автор топика

Всё, разобрался, всем спасибо, кто поучаствовал :) Вот финальный вариант:

#include <stdlib.h>
#include <stdio.h>

int func1(int a)
{
        return a;
};
int func2(int a)
{
        return a+1; 
};

int main(int argc, char *argv[])
{
        int (*mas[2])(int);
     
        mas[0] = func1;
        mas[1] = func2;

        printf("%d %d\n",mas[0](1),mas[1](1));
        return 0;
};

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

Да, скобки явно были лишнее. И вообще, лучше сразу было таки воспользоваться typedef, как люди посоветовали. Тогда бы и граблей со скобками не было.

eugine_kosenko ★★★
()
Ответ на: комментарий от anonymous

> ты из паскаля пришёл в Си?

Не - я его не знаю даже :)

> Зачем тут точка с запятой?

Для ясности - не вижу причины почему бы ей там не быть :)

> Ну кто так пишет...

Я :)

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

Всё-таки лучше писать как принято, меньше вопросов будет возникать и чужой код читать проще.

Legioner ★★★★★
()
Ответ на: комментарий от lv

> Для ясности - не вижу причины почему бы ей там не быть :)

Две точки с запятой было бы еще яснее :-)

eugine_kosenko ★★★
()
Ответ на: комментарий от lv

> Для ясности

ОК, а вот тут тоже ставишь?

if(something)
{
  ...
};

Или даже так:

if(something)
{
  ...
}; <-- хо-хо )) так вообще нельзя, ну да ладно)
else
{
  ...
};

Наверное тут не ставишь (я надеюсь).  Тогда возникает вопрос: и где однообразие по сравнению с расстановкой точки с запятой после блока функции?

Хотя можно конечно возразить: do {} while();  Но это исключение (подтверждает правило).

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

> Хотя можно конечно возразить: do {} while(); Но это исключение (подтверждает правило).

Тут точка с запятой не после фигурной скобки. Так что, не исключение.

eugine_kosenko ★★★
()
Ответ на: комментарий от anonymous

> ты из паскаля пришёл в Си?  Зачем тут точка с запятой?  Ну кто так пишет...

if (!strcmp (message, "Ну кто так пишет"))
{
	puts ("А тебе не пох?");
   ;;; 
} ;;;;;
   ;;; 

   ;;;
  ;;;;;
  ;;;;
  ;;;
 ;; 
;

ShprotX
()
Ответ на: комментарий от anonymous

> Наверное тут не ставишь (я надеюсь). Тогда возникает вопрос: и где однообразие по сравнению с расстановкой точки с запятой после блока функции?

После скобок в if else и т.д. точек с запятой не ставлю. А нафига тут однообразие? - функция - это всё-таки немного другая сущность... с }; после функции лично для меня визуально упрощает поиск, да и никому до этого не мешало :)

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

>> После скобок в if else и т.д. точек с запятой не ставлю. А нафига тут однообразие? - функция - это всё-таки немного другая сущность... с }; после функции лично для меня визуально упрощает поиск, да и никому до этого не мешало :)

А теперь запусти компилятор с опцией -pedantic =).

Deleted
()
Ответ на: комментарий от lv

Короче, "Пионэры, идите в жопу" (с) Раневская :)

P.S. Ну не буду я их ставить - не буду - отвяжитесь уже :)

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

> Короче, "Пионэры, идите в жопу" (с) Раневская :)

Как раз таки "пионэром" в данной ситуации показал себя именно *ты*.

> P.S. Ну не буду я их ставить - не буду - отвяжитесь уже :)

А вот это правильное решение!

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