1

Я выполняю назначение, где мне нужно использовать pthreads или семафоры для синхронизации некоторых процессов, которые обращаются к некоторому общему ресурсу. Поскольку все наши примеры в классе используют глобальную переменную в качестве общего ресурса, который я планировал сделать с тем же, но я хотел бы основывать значение общего ресурса на аргументе командной строки. Я знаю, как использовать аргументы командной строки в моем основном методе, но как определить размер глобального массива (общий ресурс) на основе аргумента командной строки?Определить размер глобального массива из командной строки

Update:

ответ Wallyk, кажется, что это будет работать, но я все еще нечеткое на некоторых из более мелких деталей. Смотрите пример и комментарии ...

#include <stdio.h> 

void print_array(void); 

int *array; 
int count; 

int main(int argc, char **argv){ 
    int count = atoi(argv[1]); 
    array = malloc(count *sizeof(array[0])); 
    int i; 
    for(i = 0; i < count; i++){ /*is there anyway I can get the size of my array without using an additional variable like count?*/ 
     array[i] = i; 
    } 
    print_array(); 
    return 0; 
} 

void print_array(){ 
    int i; 
    for(i = 0; i < count; i++){ 
     printf("current count is %d\n", array[i]); 
    } 
} 
+0

Вы обновление - это еще один вопрос, поэтому вы должны пойти дальше и выбрать ответ Уоллика. Ближе всего вы можете не использовать другую переменную - хранить в массиве `int * array` и` int count`. Это действительно две переменные, но они связаны более очевидным образом, и вы можете повторно использовать эту структуру для других вещей. – nategoose 2010-11-30 20:34:04

+0

@nategoose это не совсем другой вопрос, я просто хочу быть в курсе ответа, который был дан ... и я всегда выбираю ответ в конце концов :) – ubiquibacon 2010-11-30 20:39:30

ответ

7

Вы не можете сделать статическую динамическое заявление, как:

int globalarray[n]; 

Где п является переменным параметром во время выполнения. Это не работает, потому что массив инициализируется до запуска программы.

Хорошей альтернативой является использование указатель на динамическую память:

int *globalarray; 

int main (int argc, char **argv) 
{ 
... 
    int elements = atoi (argv [j]); // parse out the program argument array size 
    globalarray = malloc (elements * sizeof (globalarray[0])); 
} 
2

глобальный указатель на malloc «D массиве является одним из возможных решений. Итак, вы malloc массив необходимого размера в зависимости от вашего аргумента командной строки и сделайте указатель на массив видимым для всех ваших pthreads.

2

При объявлении массива вы должны знать размер массива во время компиляции. Если это зависит от аргумента runtime, вы не знаете его во время компиляции. Но вместо этого вы можете использовать глобальный указатель как массив.

struct Resource { /*...*/ }; 
int res_size; 
struct Resource* res_array; 

int main(int argc, char* argv[]) { 
    res_size = itoa(argv[1]); 
    res_array = malloc(res_size * sizeof(*res_array)); 
    /* Initalize res_array contents */ 
    /* Start threads. They may all access res_size and res_array. */ 
}