Передать вложенные указатели общей глубины функции в C - PullRequest
0 голосов
/ 28 апреля 2018

Как я могу объявить функцию в C, которая принимает вложенный указатель переменной глубины?

Например, функция должна принимать int* или int** или int*** и т. Д.

Я полагаю, что моя сигнатура функции будет использовать void, но я не могу понять, как привести обратно к указателю указателя ... типа.

Вот не общий пример того, чего я хочу достичь

void myfunc(void* obj, int dim) {
    if (dim == 1) {
        int* myobj1 = (int*) obj;
        // do stuff with myobj1

     } else if (dim == 2) {
         int** myobj2 = (int**) obj;
         // do stuff with myobj2
     }

     // ad infinitum

Это вообще возможно, зная, что C статически типизирован?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

В C. нет «вложенных указателей». Есть указатели, чьи ссылочные типы данных относятся к другим типам указателей, но представление о «вложенности» может привести вас к неверному когнитивному пути.

Но с учетом сказанного, в чем проблема с подходом, который вы представляете? Вы пробовали это? Любой указатель может быть преобразован в void * и обратно в исходный тип без изменения его значения. Это, пожалуй, единственное место, где ваша идея вложенности вводит вас в заблуждение: это относится и к int *, int **, int ***. Все это типы указателей. Все можно преобразовать в void * и обратно просто отлично.

Однако после преобразования в тип void * полученное значение не несет никакой информации об исходном типе. Вам нужно передать это отдельно, если вы хотите иметь возможность конвертировать обратно, например, с помощью параметра dim.

0 голосов
/ 30 апреля 2018

Как насчет рекурсии:

void myfunc(void* obj, int dim) {
int* myobj1 = (int*) obj;
if (dim > 1)
{
    myfunc(*myobj1, dim-1);
}
else {
    // do stuff with myobj1
 }

С другой стороны, я думаю, что вы создали здесь свою проблему, и, возможно, вам нужно спросить, зачем вам это нужно делать в первую очередь. Какова реальная проблема, которую вы думаете, это решит?

0 голосов
/ 28 апреля 2018

Ну, нет - этого вы не можете достичь ни с чем, кроме того, что вы показали (вы сказали для любого уровня косвенности - вложенный указатель переменной глубины ). Теперь более важный вопрос: зачем вам это? Я бы сказал, что вы пытаетесь немного организовать свои мысли. 3-звездочным программистам говорят избегать этой вещи. (С использованием ***).

Одним из решений является использование void* (которое вы также показали в некотором роде) и добавление параметра, который позволит вам узнать внутри функции, какой у вас уровень косвенности. Это лучшее, что вы можете сделать.

...