2

В настоящее время я использую массив указателей функций. Но мне нужно, чтобы продлить его как массив массив функции pointers.The псевдокоде как показано ниже:Массив массива указателей функций в C

#include<stdio.h> 


int AnalogValue1(int a) 
{ 
    printf("\nF: AV1 %d", a); 
    return 1; 
} 


int AnalogValue2(int a) 
{ 
    printf("\nF: AV2 %d", a); 
    return 1; 
} 

int BinaryValue1(int a) 
{ 
    printf("\nF: BV1 %d", a); 
    return 1; 
} 


int BinaryValue2(int a) 
{ 
    printf("\nF: BV2 %d", a); 
    return 1; 
} 
int (*Read_AV_Props[])(int a) 
= 
{ 
&AnalogValue1, 
&AnalogValue2, 
}; 

int (*Read_BV_Props[])(int a) = 
{ 
&BinaryValue1, 
&BinaryValue2 
}; 

void main() 
{ 
    Read_AV_Props[0](55); 
    //*(Read_Ob_Props[0])(20); 

} 

Здесь нужен один массив массив указателей на функции, так что он может взять адрес Read_BV_Props и Read_AV_Props. И из основного кода я могу вызвать этот массив массива указателей функций. Возможно ли это в C?

ответ

1

Это объявление вы хотите:

int (**myArray[])(int) = { 
    Read_AV_Props, 
    Read_BV_Props 
}; 

Это массив указателей на указатели на функции получение int и возвращение int. Это не истинный 2D-массив, потому что Read_AV_Props и Read_BV_Props распадаются на указатель на их первый элемент, то есть на указатель на функцию приема int и возвращают int.

Вы можете использовать его как это:

int a = (**(myArray[i]+j))(1); 

Или из-за массива к-указатель правила decayment (в выражениях), вы также можете использовать:

int a = (*myArray[i][j])(1); 

Если вы хотите true 2D-массив, вы должны инициализировать его все в одном месте:

int (*myArray[][])(int) = { 
    { &binaryValue1, &binaryValue2 }, 
    { ... } 
}; 

Использование аналогично.

Или вы можете сделать массив указателей на массив указатель на функцию приема int и возвращение int с:

int (*(*myArray[])[sizeof(Read_AV_Props)/sizeof(*Read_AV_Props)])(int) = { 
    &Read_AV_Props, 
    &Read_BV_Props 
}; 

Но это предполагает, что Read_AV_Props и Read_BV_Props имеют одинаковый размер.

Вы можете использовать это с:

int a = (*(*myArray[i])[j])(1); 

Учитывая ваш вопрос, я считаю, что первый вариант является то, что вы ищете.

+0

Спасибо, ваш первый набор кодов является точным совпадением, но, как вы сказали, он разлагается до первого указателя списка ... –

+0

@GinuJacob Добро пожаловать. Хороший вопрос btw, мне нравится этот материал указателя;) –

0

Если вам нужен 2D массив, то вы можете сделать это следующим образом:

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

int func1(int a) 
{ 
    return a*2; 
} 

int func2(int a) 
{ 
    return a*3; 
} 

typedef int (*FunctionPtrType)(int a); 

FunctionPtrType myArray[2][2] = 
{ 
    // func1, func2 
{ func1, func2, }, 
{ func2, func1, } 
}; 

int main() 
{ 
    int i; 
    printf("func1 = %p\n", func1); 
    printf("func2 = %p\n", func2); 

    for(i = 0; i < 2; i++) 
    { 
     printf("%p\n", myArray[0][i]); 
     printf("%p\n", myArray[1][i]); 
    } 

    return 0; 
} 
+0

Его вопрос заключается не в том, как использовать массивы, которые он объявил. Он хочет создать новый массив, элементами которого являются 'Read_AV_Props' и' Read_BV_Props'. – Barmar

+0

Моя проблема не совсем с массивом указателей функций. Я хотел бы иметь массив массивов указателей на функции. –

+0

Извините, я пропустил вопрос тогда. Я отказываюсь от ответа. – Devolus

Смежные вопросы