2017-05-20 5 views
0

Xcode IDEを使用してCのscanfについて少し質問したかったのですが、私が最初に変数を選択するための値を設定していない場合は、いつでも自分のプログラムを開いて任意の選択肢(1/2のいずれか)を入力すると、毎回else caseに移動します。だから私は任意の選択肢を選択した後、私は奇妙な番号を得た後に値をチェックします。私のコードを見てください。前もって感謝します。これはあなたの問題であるscanfが変数に値を渡していません

/* Bubble Sort using MPI */ 

#include <stdio.h> 
#include <stdlib.h> 
#include <mpi.h> 
#include <time.h> 

#define N 1000 

double startT,stopT; 

double startTime; 

void showElapsed(int id, char *m) 
{ 
    printf("%d: %s %f secs\n",id,m,(clock()-startTime)/CLOCKS_PER_SEC); 
} 

void showVector(int *v, int n, int id) 
{ 
    int i; 
    printf("%d: ",id); 
    for(i=0;i<n;i++) 
     printf("%d ",v[i]); 
    putchar('\n'); 
} 

int * merge(int *v1, int n1, int *v2, int n2) 
{ 
    int i,j,k; 
    int * result; 

    result = (int *)malloc((n1+n2)*sizeof(int)); 

    /* 
    i : pointer of v1 
    j : pointer of v2 
    k : pointer of k 
    */ 
    i=0; j=0; k=0; 
    while(i<n1 && j<n2) 
     if(v1[i]<v2[j]) 
     { 
      result[k] = v1[i]; 
      i++; k++; 
     } 
     else 
     { 
      result[k] = v2[j]; 
      j++; k++; 
     } 
    if(i==n1) 
     while(j<n2) 
     { 
      result[k] = v2[j]; 
      j++; k++; 
     } 
    else 
     while(i<n1) 
     { 
      result[k] = v1[i]; 
      i++; k++; 
     } 
    return result; 
} 

void swap(int *v, int i, int j) 
{ 
    int t; 
    t = v[i]; 
    v[i] = v[j]; 
    v[j] = t; 
} 

void sort(int *v, int n) 
{ 
    int i,j; 
    for(i=n-2;i>=0;i--) 
     for(j=0;j<=i;j++) 
      if(v[j]>v[j+1]) 
       swap(v,j,j+1); 
} 

int main(int argc, char **argv) 
{ 
    int * data; 
    int * chunk; 
    int * other; 
    int m,n=N; 
    int id,p; 
    int s; 
    int i; 
    int step; 
    int choice = 0; 

    //start asking user to select option between sequential or parallel version of BubbleSort 
    printf(":: Welcome to BubbleSort Project for CSS333 ::\n"); 
    printf("Please select option that you prefer\n"); 
    printf("Type \"1\" for sequential mode or \"2\" for parallel mode\n"); 
    printf(""); 
    fflush(stdout); 
    scanf("Enter here: %d", &choice); 
    printf("Test value of choice(should be either 1 or 2): %d\n", choice); 
    //end asking 


    if(choice == 1){ 
     // do seq 
     printf("You have selected option 1 which is running BubbleSort in Sequential mode\n"); 
     printf("Please wait..."); 
    } 

    else if(choice == 2){ 
     // do parallel 
     printf("You have selected option 2 which is running BubbleSort in parallel mode\n"); 
     printf("Please wait..."); 

     MPI_Status status; 
     MPI_Init(&argc,&argv); 
     MPI_Comm_rank(MPI_COMM_WORLD,&id); 
     MPI_Comm_size(MPI_COMM_WORLD,&p); 


     if(id==0) 
     { 
      int r; 
      srandom(clock()); 
      s = n/p; 
      r = n%p; 
      data = (int *)malloc((n+p-r)*sizeof(int)); 
      for(i=0;i<n;i++) 
       data[i] = random(); 
      if(r!=0) 
      { 
       for(i=n;i<n+p-r;i++) 
        data[i]=0; 
       s=s+1; 
      } 

      startT = clock(); 

      MPI_Bcast(&s,1,MPI_INT,0,MPI_COMM_WORLD); 
      chunk = (int *)malloc(s*sizeof(int)); 
      MPI_Scatter(data,s,MPI_INT,chunk,s,MPI_INT,0,MPI_COMM_WORLD); 

      sort(chunk,s); 
     } 
     else 
     { 
      MPI_Bcast(&s,1,MPI_INT,0,MPI_COMM_WORLD); 
      chunk = (int *)malloc(s*sizeof(int)); 
      MPI_Scatter(&data,s,MPI_INT,chunk,s,MPI_INT,0,MPI_COMM_WORLD); 

      sort(chunk,s); 
     } 

     step = 1; 
     while(step<p) 
     { 
      if(id%(2*step)==0) 
      { 
       if(id+step<p) 
       { 
        MPI_Recv(&m,1,MPI_INT,id+step,0,MPI_COMM_WORLD,&status); 
        other = (int *)malloc(m*sizeof(int)); 
        MPI_Recv(other,m,MPI_INT,id+step,0,MPI_COMM_WORLD,&status); 
        chunk = merge(chunk,s,other,m); 
        s = s+m; 
       } 
      } 
      else 
      { 
       int near = id-step; 
       MPI_Send(&s,1,MPI_INT,near,0,MPI_COMM_WORLD); 
       MPI_Send(chunk,s,MPI_INT,near,0,MPI_COMM_WORLD); 
       break; 
      } 
      step = step*2; 
     } 
     if(id==0) 
     { 
      FILE * fout; 

      stopT = clock(); 
      printf("%d; %d processors; %f secs\n",N,p,(stopT-startT)/CLOCKS_PER_SEC); 

      fout = fopen("result","w"); 
      for(i=0;i<s;i++) 
       if (chunk[i] != 0) 
        fprintf(fout,"%d\n",chunk[i]); 
      fclose(fout); 
     } 
     MPI_Finalize(); 
    } 

    else{ 
     printf("Invalid value\n"); 
     printf("Program exiting...\n"); 
     exit(0); 
    } 

} 
+1

はコンパイルされません。 – ThingyWotsit

+1

'scanf("ここに入力:%d "、&choice);は"ここに入力: "を入力することを意味し、scanfは" Enter here: "というテキストを含めて一致すると思います。 –

+0

あまりにも多くのコードを読む...下記をお読みください:https://stackoverflow.com/help/mcve –

答えて

0

は、ここに私の実際のコードです

scanf("Enter here: %d", &choice); 
あなたは、これは「ここに入力してください。」を表示することが期待される可能性があります

、入力として数を受け入れ、それを保存します変数choice。しかし、それはそうではありません。

これは、フォーマット文字列( "ここに入力:%d")を1文字ずつ順番に実行することです。 '%'でない各文字については、stdinから文字を読み取り、それらを一緒に比較します。一致しない場合は、文字をstdinのバッファにプッシュしてスキャンを停止します。

したがって、ユーザーがEnter here:で始まるものにすぐに番号を入力しない限り、その番号を読み取ることができません。 。あなたはおそらくやりたいこと

にされた: 'int型のMを、N = N;' Nが定義されています:

printf("Enter here: "); 
scanf("%d", &choice); 

(その後、scanf()のドキュメントを読んで

関連する問題