Как вызвать функцию C ++? - PullRequest
3 голосов
/ 04 июля 2011

У меня есть функция с прототипом как

void test( int array [] , int b); 

Я знаю, что мы можем заменить прототип как: void test(int*, int);

В main() мы объявляем следующие массивы:

int array1[10], array2[10];

Чтобы установить тело функции на 0,

test ( array1 , b)
{
for ( int i = 0 ; i < b ; i++)
  array1[i] = 0;

}

Могу ли я сделать следующее и почему?

int main()
{// assuming b is the size of the array
test(array1 , b);
test(array2 , b) ;
return 0;
}

Я знаю основы c ++. Я пытаюсь написать свои собственные включаемые файлы. Мне просто интересно, если это возможно, и это хороший выбор?

Ответы [ 4 ]

3 голосов
/ 04 июля 2011

Не прямой ответ на ваш вопрос, но тот факт, что вы говорите о C ++ и все же используете простые старые массивы C, привлек мое внимание:

Во-первых, не используйте массивы C. Вместо этого используйте std::vector<int>. Это, вероятно, избавляет от необходимости задавать этот вопрос в первую очередь (и позволяет избежать множества других проблем). Вам не нужно беспокоиться о правильном типе размера (int? size_t? Что-то еще?), Поскольку std::vector уже дает вам правильный тип: std::vector<int>::size_type.

Ваша подпись функции будет просто

void test( std::vector<int> &a );

Реализация для заполнения вектора нулями будет:

void test( std::vector<int> &a )
{
  std::fill( a.begin(), a.end(), 0 );
}
1 голос
/ 04 июля 2011

Возможно, вы спрашиваете о разнице между формальными параметрами и фактическими параметрами.

В вашем прототипе

void test(int *array, size_t size);

имена 'массив' и 'размер' являются формальными параметрами.Вы используете эти имена внутри тела вашей функции.

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

, поэтому

int main()
{
   const size_t b = 10;
   int array1[10], array2[10];
   test(array1 , b);
   test(array2 , b) ;
   return 0;
}

Здесь array1 и b - фактические параметры для первого вызова, а array2 и b - фактические параметры для второго вызова.

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

1 голос
/ 04 июля 2011

Да, это возможно; но объявление в теле функции должно совпадать с объявленным в качестве прототипа:

void test (int array1[], int b) // <---- see here (prefer `unsigned int` for size)
{
  for ( int i = 0 ; i < b ; i++)
    array1[i] = 0;
}

Лучше использовать библиотечную функцию memset () , если вы хотите установить что-то на 0.

(Как совет, вы можете построить библиотеку поверх того, что уже существует. В противном случае это будет похоже на изобретение колеса.)

0 голосов
/ 04 июля 2011

Похоже, вы переходите с C. Да, это возможно, но вам нужно правильно оформить объявления, иначе компилятор выдаст ошибку.

Предпочтительным прототипом C ++ будет

void test(int *array, size_t size);

В C ++ вы должны объявить тип возвращаемого значения и тип (ы) каждого аргумента как в прототипе, так и в реализации.

Примечание: вам не нужноиспользуйте size_t, но это предпочтительнее (даже на C).size_t включено в stddef.h (и расширением cstddef, которое является предпочтительным включением C ++).Он зависит от архитектуры и обычно имеет тип unsigned int в 32-битных системах и long unsigned long в 64-битных системах

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