2017-05-20 2 views
0

Ich wollte ein wenig über scanf in C mit Xcode IDE fragen. Wenn ich anfänglich keinen Wert für die Variablenauswahl einstelle, öffne ich jedes Mal, wenn ich mein Programm öffne und eine beliebige Auswahl (entweder 1/2) eintrage, jedes Mal zu else case. Also überprüfe ich den Wert, nachdem ich irgendeine Auswahl getroffen habe, dann habe ich eine seltsame Zahl. Könnten Sie sich bitte meinen Code ansehen? Vielen Dank im Voraus.scanf übergibt keinen Wert an Variable

Hier ist mein eigentlicher Code:

/* 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

Hat nicht kompilieren.. 'Int m, n = N;' N ist nicht definiert, bitte kopiere deinen aktuellen Code – ThingyWotsit

+1

Ich denke das 'scanf (" Gib hier ein:% d ", & choice);' bedeutet "Enter here: ", und dass scanf mit dem Text "Enter here:" –

+0

zu viel Code zu lesen ... bitte lesen Sie das folgende: https://stackoverflow.com/help/mcve –

Antwort

0

Das ist Ihr Problem:

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

Sie könnten dies „hier eingeben:“ zu erwarten zeigt dann eine Zahl als Eingabe akzeptieren und speichern sie in die Variable choice. Aber das ist es nicht.

Dies ist, dass es durch die Formatierungszeichenfolge ("Geben Sie hier:% d"), ein Zeichen nach dem anderen. Für jedes Zeichen, das nicht '%' ist, liest es ein Zeichen aus stdin und vergleicht sie miteinander. Wenn sie nicht übereinstimmen, wird das Zeichen zurück in den Puffer stdin geschoben und das Scannen beendet.

Also, wenn der Benutzer etwas eingibt, beginnend mit Enter here: gefolgt von einer Nummer, schlägt es beim Lesen dieser Zahl fehl.

Was Sie wahrscheinlich tun wollte: für scanf()

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

(und dann lesen Sie die Dokumentation

Verwandte Themen