2016-03-31 27 views
0

私は今MPIの演習をしています。私の仕事では、私はNの階乗を計算したいので、コマンドラインで2番目の引数でNを渡し、すべてのコードは、char *からintに変換しようとした行を除いてうまくいっています(これは1つのプロセス)、私にこのような状況ではいくつかのアドバイスをお願いし、ここに私のコードは次のとおりです。MPIプログラムの引数を変換するときにエラーが発生する

int main(int argc, char* argv[]){ 

    if(argc != 2){ 
     fprintf(stderr, "\nYou must follow this format to run the program: [Program's name] [N]"); 
     exit(0); 
     MPI_Finalize(); 
    } 

    long int n = 1; 

    n = strtol(argv[1], NULL, 10); // <-- problem happens here 

    // Initialize MPI 
    MPI_Init(&argc, &argv); 

    // Receive the whole size and id of each rank 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if(rank == 0){ 
     // Process for master 
     master(n); 
    } 
    else{ 
     // Process for slaves 
     slave(); 
    } 


    // Finish MPI 
    MPI_Finalize(); 

    return 1; 

}

どんな答えが高く評価され、私の記事を読んありがとうございました。

答えて

0

MPI_Initを呼び出す前に、argvargcで何もしないでください。実際には、できるだけ早くMPI_Initに電話する必要があります。 MPI_Initよりも前にMPI_Finalizeと電話するのは間違いありません。標準を引用する

特定の実装は すべての実行中のプロセスにARGCとargvの値を伝搬させるためにMPI_INITのC バージョンの(INOUT)ARGC、ARGV引数を使用します。

mainの先頭にあるMPI_Initコールを移動するだけです。

+0

申し訳ありませんが、私のコードを変更した後、私はまだ "STATUS_ACCESS_VIOLATION"という問題に直面しており、問題は次の行で起こります: n = strtol(argv [1]、NULL、10); –

+0

デバッガや* printf-debugging *を使って 'argv [1]'のconentを判断しましたか? – Zulan

+0

ありがとうございました、私はスレーブに送信するときに私のデータを保持する私の配列のサイズを増やした後に私の問題を解決しました(ここで問題は私の古い配列は私のBig Int変数から十分なデータを保持できないということです))。静的配列を動的に変更することでコードを改善する必要があると思います。ポインタをmpiの関数を送信する際にいくつかの問題に直面して、すべての配列を静的に変更する必要がありました。とにかく、ありがとうございました。 –

関連する問題