2016-03-26 12 views
2

配列インデックスを別の関数に渡す方法を理解しようとしています。ここで配列インデックスをcの別の関数に渡す方法

私が持っている:機能get_checksum

for(i=0; i<file_cnt; i++){ 

      iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&filenames[i]); 
      printf("%s\n", filenames[i]); 
     } 

、私は最終的にファイル名のインデックスが必要ですが、iは、その関数では使用できません。 get_checksum関数で

void* get_checksum(void* a){ 

      char *filename = (char *) a; 
..... 
} 

Iはfilenames[i]に関してチャーポインタとしてaで渡されます。

しかし、後で関数の中で計算する必要があります:get_checksum合計の配列のインデックスを取得する必要があります。したがって、実際にfilenamesというインデックスを関数get_checksumに渡す必要があります。

配列インデックスを別の関数に渡す方法はありますか?

+2

構造体を作成し、関連するすべてのパラメータを構造体に代入し、pthread_createに渡します - http://www.amparo.net/ce155/thread-ex.html – OldProgrammer

答えて

2

通常は2つのパラメータを渡すだけですが、pthread_createというヒープ割り当て構造体へのポインタを渡すので、ここではできません。静的作成またはdinamicallyタイプparams_tの変数を割り当て、それを初期化し、get_checksumにそのアドレスを渡すその後

typedef struct params_s 
{ 
    char * filename; 
    int index; 
    // additional params 
} params_t; 

struct params { 
    char *filename; 
    int i; 
}; 

/* ... */ 

for(i=0; i<file_cnt; i++){ 
     struct params *p = malloc(sizeof(struct params)); 
     p->filename = filenames[i]; 
     p->i = i; 
     iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)p); 
     if (iret1) { 
      free(p); 
      printf("OOPS %s\n", filenames[i]); 
     } else { 
      printf("%s\n", filenames[i]); 
     } 
    } 

/* ... */ 

void* get_checksum(void* p){ 
    char *filename = ((struct params *)p)->filename; 
    int i = ((struct params *)p)->i; 
    free(p); 
    /* ... */ 
} 
+0

互換性のないポインタ型からの割り当ては、 filename =&filenames [i] ' – SamSmith

+0

可能なファイル名はconst char filenames []ですか?もしそうなら、params.filenameはconst char *である必要があります。 – Joshua

+0

'char ** filenames'なので、その構文はまだ適用されますか? – SamSmith

2

あなたが必要なすべてのパラメータを渡す構造体を定義することができます。

params_t params[NUM_OF_THREADS]; 
... 
for(i=0; i<file_cnt; i++){ 
    params[i].filename = &filenames[i]; 
    params[i].index = i; 
    iret1 = pthread_create(&(file[i]), NULL, get_checksum, (void*)&params[i]); 
    printf("%s\n", filenames[i]); 
} 
+0

ヒープやスタックの割り当てが機能するかどうかを判断する必要があると思います。スレッドが関数のスコープを超えている場合、悪いことが起こりますが、この場合はそうではありません。 NUMBER_OF_THREADSは定数ではないため、グローバル割り当ては機能しません。 – Joshua

+0

@Joshua。あなたが正しいです。しかし、私が書いたのはほんの一例です。私の答えでは、OPはそれを静的に使用するか、動的に割り当てなければならないと書いていました。それはデザインに応じてOPの選択です。 –

関連する問題