как передать массивы между функциями - PullRequest
1 голос
/ 16 апреля 2011

Может кто-нибудь мне помочь? У меня возникла проблема с C-программой. Вот оно:

В моем основном я вызываю функцию (func A), где два аргумента - это вторая функция (fun B) и «пользовательские данные» (которые в принципе могут быть одним числом, символом или массивом). Эти «пользовательские данные» также являются аргументом функции B. У меня все работает, когда «пользовательские данные» представляют собой одно целое число, но теперь мне нужно использовать их как массив. Итак, нынешняя рабочая структура выглядит следующим образом:

static int FunB(...,void *userdata_)  
{  
   int *a=userdata_;  
   ...  
   (here I use *a that in this case will be 47)  
   ...  
}  

int main()  
{  
   int b=47;  
   funcA(...,FunB,&b)  
}  

Так что теперь я хочу b в основном как массив (например, {3,45}), чтобы передать более одной «данных» в функцию B.

Спасибо

1 Ответ

2 голосов
/ 16 апреля 2011

Есть как минимум два способа сделать это.

Первый

static int FunB(..., void *userdata_)  
{  
   int *a = userdata_;  
   /* Here `a[0]` is 3, and `a[1]` is 45 */
   ...  
}  

int main()  
{  
   int b[] = { 3, 45 };  
   funcA(..., FunB, b); /* Note: `b`, not `&b` */
}  

Второй

static int FunB(..., void *userdata_)  
{  
   int (*a)[2] = userdata_;  
   /* Here `(*a)[0]` is 3, and `(*a)[1]` is 45 */
   ...  
}  

int main()  
{  
   int b[] = { 3, 45 };  
   funcA(..., FunB, &b); /* Note: `&b`, not `b` */
}  

Выберите, какой вам нравится больше. Обратите внимание, что второй вариант специально предназначен для ситуаций, когда размер массива фиксирован и известен во время компиляции (в данном случае точно 2). В таких ситуациях второй вариант на самом деле предпочтительнее.

Если размер массива не фиксирован, тогда вам нужно использовать первый вариант. И, конечно, вы должны как-то передать этот размер FunB.

Обратите внимание, как массив передается в funcA (как b или как &b) и как к нему обращаются в FunB (как a[i] или как (*a)[i]) в обоих вариантах , Если вы не сделаете это правильно, код может скомпилироваться, но не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...