вернуть массив из функции, когда динамический аргумент передается функции в c - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь вернуть массив из функции, он работает нормально, пока я использую жестко закодированное значение для размера массива.Однако, когда я изменяю его на динамический (вычисляемый из nproc = sysconf(_SC_NPROCESSORS_ONLN);), я получаю следующее сообщение об ошибке:

 -->gcc test.c
test.c: In function ‘getRandom’:
test.c:14:16: error: storage size of ‘r’ isn’t constant
    static int  r[nproc];
                ^
test.c:18:21: warning: implicit declaration of function ‘time’; did you mean ‘nice’? [-Wimplicit-function-declaration]
    srand( (unsigned)time( NULL ) );
                     ^~~~
                     nice

, когда я изменяю static int r[10]; на static int r[nproc];, его сбой.Мне нужно сохранить динамический размер, так как он будет рассчитан во время выполнения.Может кто-нибудь помочь мне решить эту проблему?

Код:

#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/* function to generate and return random numbers */
int * getRandom(int nproc ) {

   printf("nproc is %d\n",nproc);
   //static int  r[10];
   static int  r[nproc];
   int i;

   /* set the seed */
   srand( (unsigned)time( NULL ) );

   for ( i = 0; i < 10; ++i) {
      r[i] = rand();
      printf( "r[%d] = %d\n", i, r[i]);
   }

   return r;
}

/* main function to call above defined function */
int main () {

   /* a pointer to an int */
   int *p;
   int i;
   int nproc;
   nproc = sysconf(_SC_NPROCESSORS_ONLN);
   p = getRandom(nproc);

   for ( i = 0; i < 10; i++ ) {
      printf( "*(p + %d) : %d\n", i, *(p + i));
   }

   return 0;
}

Нужно знать, как этого добиться в C ПРОГРАММИРОВАНИЕ

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Вы не можете определить static array с нефиксированным размером, потому что это похоже на определение глобального массива с динамическим размером.Это недопустимо в C, потому что глобальная переменная является частью двоичного файла и должна иметь известный размер при компиляции.

Если вы действительно хотите сохранить его static, вам нужно определить максимально возможный массивsize, а затем передайте значение nproc в качестве верхнего предела при каждом вызове функции getRandom().

Пример:

/* function to generate and return random numbers */
int * getRandom(int nproc ) {

   printf("nproc is %d\n",nproc);
   static int  r[MAX_POSSIBLE_LENGTH];
   int i;

   /* set the seed */
   srand( (unsigned)time( NULL ) );

   for ( i = 0; i < nproc; ++i) {
      r[i] = rand();
      printf( "r[%d] = %d\n", i, r[i]);
   }

   return r;
}

Существует также возможность выделения / перераспределениякаждый раз требуемый размер массива (malloc / realloc) в вызывающей стороне getRandom() и передача указателя на него и размер getRandom():

void getRandom(int *pArr, unsigned int size);

В этом случаевам не нужно будет хранить массивы static.

1 голос
/ 13 апреля 2019

Я думаю, что вы хотите:

int *r = (int *) malloc(sizeof(int) * nproc);// allocating for nproc integers

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