1

共有リソースにアクセスするいくつかのプロセスを同期させるためにpthreadまたはセマフォを使用する必要があります。クラスのすべての例では、グローバル変数を共有リソースとして使用していたので、同じことを行う予定でしたが、共有リソースの値をコマンドライン引数に基づいて設定したいと考えました。 私はメインメソッド内でコマンドライン引数を使用する方法を知っていますが、コマンドライン引数に基づいてグローバル配列(共有リソース)のサイズを定義する方法はありますか?コマンドラインからグローバル配列のサイズを定義する

更新:それは動作しますように

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

あなたはアップデートが本当に別の質問ですので、まずWallykの答えを選択してください。他の変数を使わないことに最も近いのは、 'int * array'と' int count'を構造体に格納することです。これは実際には2つの変数ですが、より明白な方法で結び付けられています。他のものについてもその構造体を再利用することができます。 – nategoose

+0

@nategooseそれは本当に別の質問ではありません、私はちょうど与えられた答えを明確にしたい...そして私はいつも答えを最終的に選択します:) – ubiquibacon

答えて

7

...例やコメントを参照してください:Nは、実行時に変数セットがある

int globalarray[n]; 

。プログラムが実行される前に配列が初期化されているため、これは機能しません。

良い選択肢は、ダイナミックメモリへのポインタを使用することである:malloc「Dアレイに

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])); 
} 
+0

私はまだポインタの弱いです。私はあなたがここで何をしているのかを知っていますが、このグローバル配列をどのように配置するのか、必要に応じて配列のサイズを見つける方法(sizeof(array)/ sizeof(int)動作していないようです)。更新された質問を参照してください。 – ubiquibacon

+0

@typoking:要素の数を 'size_t'型の別の変数に格納し、それを知る必要があるときに調べます。 –

+0

@typoknig:配列とポインタには多くの共通点があるので、 'globalarray [0] =' は動作します。または 'int j; for(j = 0; j wallyk

2

グローバルポインタは、一つの可能​​な解決策です。 コマンドライン引数に応じて、必要なサイズの配列をmallocし、すべてのpthreadに配列のポインタを見えるようにします。

2

配列を宣言するときは、コンパイル時に配列のサイズを知る必要があります。ランタイム引数に依存する場合は、コンパイル時にそれを知ることはできません。しかし、代わりにグローバルポインタを配列として使うことができます。

関連する問題