Unbekannter Bug in C Program - Bitte um Hilfe



  • mcr schrieb:

    Hallo,

    ein weitere Fehler ist die Bedingung der for-Schleife in Zeile 91

    for(m=1;m==end;m++)
    

    Schon für m==1 ist die Bedingung nicht erfüllt: 1==500?

    Ich nehme mal an, es sollte

    for (m=1; m<=500; ++m)
    

    heißen.

    Gruß mcr

    Vielen Dank fuer den Hinweis! Den Fehler hatte ich allerdings zwischendurch schon korrigiert nach Hinweis von CStoll
    ...trotzdem natuerlich vielen Dank!



  • duck schrieb:

    Wenn ich dich kennen wuerde wuerd ich dir sofort ein Bier ausgeben!

    Ist wohl gut so, denn ich trinke keinen Alkohol!



  • Th schrieb:

    duck schrieb:

    Wenn ich dich kennen wuerde wuerd ich dir sofort ein Bier ausgeben!

    Ist wohl gut so, denn ich trinke keinen Alkohol!

    hehe nagut dann eben einen O-Saft oder so..



  • Th schrieb:

    duck schrieb:

    Wenn ich dich kennen wuerde wuerd ich dir sofort ein Bier ausgeben!

    Ist wohl gut so, denn ich trinke keinen Alkohol!

    dann gib mir das bier!
    🙂



  • Hallo noch einmal,

    das Program scheint jetzt endlich zu funktionieren. Allerdings hab ich ein Problem mit dem array am Anfang spin[][], wenn ich 20x20 als Groess nehme funktioniert alles, aber ab 25x25 bekomme ich Berechnungsfehler und auf einmal negative Werte fuer Variablen die nicht negativ werden koennen, m z.B. Kann ich das irgendwie vermeiden indem ich dem Program mehr Speicher zuteile o.A.? Wenn ja, wie?

    Vielen Dank!

    Hier die aktuelle Version des Codes:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h> /* Don't forget to link the maths library when compiling the program -lm */
    #include <time.h>
    
    int main(int argc, char **argv)
    {
      // Declaring variables, end: total no of sweeps, N:lattice size NxN 
      // B and J are actually B/KT etc.
    
      int end=1000, N=20;
      int i, j, k, l, m=0, n;        /* m: total number of sweeps, n: flip attempts within one sweep */
      int mod=0, identical;
      int spin[20][20];
      int M=0, CM=0;
    
      char setup;
    
      double B=0, J=0.4;
      double a, b, z;
    
      FILE *fout;
    
      double dcoupen, dexten, dE, d;
      double r;
    
      // Get command line input
    
      switch (argc)
      {
      case 6:
        sscanf(argv[5], "%d", &mod);
      case 5:
        sscanf(argv[4], "%d", &end);
      case 4:
        sscanf(argv[3], "%lf", &B);
      case 3:
        sscanf(argv[2], "%lf", &J);
      }
    
      printf("Syntax is: ./main file J B end mod\n");
      printf("Default is: output.data 0.4 0 1000 0\n");
      printf("Do you wish to set up the lattice randomly or magnetized (r/m)?(r) \n");
      scanf("%s", &setup);
    
      // Setting up the lattice
    
      srand48((unsigned int) time(NULL)); /* Seed random number generator */ 
    
      if(setup=='m')
        {
          for(i=0;i<=(N-1);i++)
    	{
    	  for(j=0;j<=(N-1);j++)
    	    {
    	      spin[i][j]=1;
    	    }
    	  printf("|\n");
    	}
        }
      else                                  /* Default is randomized setup */
        for(i=0;i<=(N-1);i++)               /* Assgin a random value to each spin */
          {
    	for(j=0;j<=(N-1);j++)
    	  {
    	    do                          /* Do ... while as to execute the loop at least once */
    	    {
    	      a = drand48();
    	      b = drand48();
    	      identical = 0;
    
    	      if(a>b)
    		{
    		  spin[i][j] = 1.0;
    		}
    	      else if(b>a)
    		{
    		  spin[i][j] = -1.0;
    		}
    	      else
    		identical = 1;
    	    } while(identical==1);
    	  }
          }
    
      // Check whether file is accessible
    
      if(argc>=2) /* Use entered file name */
        {
          if ((fout = fopen(argv[1], "w")) == NULL)
    	{
    	  printf("Cannot open file '%s'\n", argv[1]);
    	  exit(1);
    	}
        }
      else /* Otherwise use default file name */
        {
          if ((fout = fopen("output.data", "w")) == NULL)
    	{
    	  printf("Cannot open file 'output.data'\n");
    	  exit(1);
    	}
        }
    
      fprintf(fout, "# Sweep   M\t\tCM\n");   /* # makes gnuplot ignore this line*/
    
      // Print out initial state 
    
      for(i=0;i<=(N-1);i++)
        {
          for(j=0;j<=(N-1);j++)
    	    {
    	      M += spin[i][j];
    	    }		
        }
    
      CM += M;
    
      fprintf(fout, "%3d\t%4d\t%4d\n", m, M, CM);
    
      // Flipping 
        for(m=1;m<=end;m++)
          {                       /* Initialises sweep loop */
          for(n=1;n<=(N*N);n++)   /* Flip attempts withing one sweep */
    	{                     /* Initialises flipping loop */
            // Get random numbers
            k = (int) ceil(N * drand48()); 
            l = (int) ceil(N * drand48());
            z = drand48();
    
            d = 2.0 * J * spin[k][l]; /* dcoupen = - 2 spin[k][l] * (-J) * sum of neighbouring spins */
            dcoupen = (k==0 && l==0) ? d * (spin[(N-1)][l] + spin[(k+1)][l] + spin[k][(N-1)] +spin[k][(l+1)]) :
    	  (k==0 && l!=0 && l!=(N-1)) ? d * (spin[(N-1)][l] + spin[(k+1)][l] + spin[k][(l-1)] +spin[k][(l+1)]) :
    	  (k==0 && l==(N-1)) ? d * (spin[(N-1)][l] + spin[(k+1)][l] + spin[k][(l-1)] +spin[k][0]) :
    	  (k!=0 && k!=(N-1) && l==0) ? d * (spin[(k-1)][l] + spin[(k+1)][l] + spin[k][(N-1)] +spin[k][(l+1)]) :
    	  (k==(N-1) && l==0) ? d * (spin[(k-1)][l] + spin[0][l] + spin[k][(N-1)] +spin[k][(l+1)]) :
    	  (k!=0 && k!=(N-1) && l==(N-1)) ? d * (spin[(k-1)][l] + spin[(k+1)][l] + spin[k][(l-1)] +spin[k][0]) :
    	  (k==(N-1) && l!=0 && l!=(N-1)) ? d * (spin[(k-1)][l] + spin[0][l] + spin[k][(l-1)] +spin[k][(l+1)]) :
    	  (k==(N-1) && l==(N-1)) ? d * (spin[(k-1)][l] + spin[0][l] + spin[k][(l-1)] +spin[k][0]) : 
    	  d * (spin[(k-1)][l] + spin[(k+1)][l] + spin[k][(l-1)] +spin[k][(l+1)]);  	
    
        	dexten = -2.0 * B * spin[k][l];
        	dE = dcoupen + dexten;
    
        	r = exp(dE);
    
    	// Only if r>z perform the flip
    	if(r>z)
    	  {
    	    spin[k][l] = - spin[k][l];
    	  }
    
    	}   /* Closes flipping loop */
    
          // Print configuration to screen after each sweep, as + and -
          for(i=0;i<=(N-1);i++)
    	{
    	  for(j=0;j<=(N-1);j++)
    	    {
    	      if(spin[i][j]==1.0)
    		printf("+");
    	      if(spin[i][j]==-1.0)
    		printf("-");
    	    }
    	  printf("|\n");
    	}
          printf("\n\n\n\n");
    
          // Calculate M and CM and save them to file, cumulation starts after 50 sweeps
    
          M = 0; /* Reset M to 0 between flips */
    
          for(i=0;i<=(N-1);i++)
    	{
    	  for(j=0;j<=(N-1);j++)
    	    {
    	      M += spin[i][j];
    	    }		
    	}
    
    	  CM += M;
    
          fprintf(fout, "%3d\t%4d\t%4d\n", m, M, CM);
    
          } /* Closes sweep loop */	
    
        fclose(fout);
        return 0;
    }
    


  • mcr schrieb:

    Hallo,

    mir hat dieser Block coupen += () ? .. : ..; nicht gefallen. Dabei ist
    mir aufgefallen, dass man es wie folgt kürzen kann:

    coupen += spin[k][l] * (spin[(k+N-1)%N][l] + spin[(k+1)%N][l] + spin[k][(l+N-1)%N] + spin[k][(l+1)%N]);
    

    Ebenso die Zeile dcoupen += ...;

    Gruß mcr

    Hallo,

    tut mir leid, ich hatte den post ganz uebersehen. Ich glaube das funktioniert leider nicht, obwohl es natuerlich sehr sehr nett waere. Fuer

    (k==0 && l!=0 && l!=(N-1)) ? d * (spin[(N-1)][l] + spin[(k+1)][l] + spin[k][(l-1)] +spin[k][(l+1)]) :
    

    wuerde man an der ERSTEN Stelle spin[k-1][l] bekommen anstelle von spin[N-1][l], oder nicht?

    Danke



  • duck schrieb:

    int N=20;
    ...
    int spin[20][20];
    if(setup=='m')
    {
      for(i=0;i<=(N-1);i++)
      {
        for(j=0;j<=(N-1);j++)
        {
          spin[i][j]=1;
        }
        printf("|\n");
      }
    }
    

    Hast du bei deiner Anpassung auch daran gedacht, N zu korrigieren? (btw, das ist ein guter Zeitpunkt, über benannte Konstanten nachzudenken)



  • CStoll schrieb:

    duck schrieb:

    int N=20;
    ...
    int spin[20][20];
    if(setup=='m')
    {
      for(i=0;i<=(N-1);i++)
      {
        for(j=0;j<=(N-1);j++)
        {
          spin[i][j]=1;
        }
        printf("|\n");
      }
    }
    

    Hast du bei deiner Anpassung auch daran gedacht, N zu korrigieren? (btw, das ist ein guter Zeitpunkt, über benannte Konstanten nachzudenken)

    Wo muss ich N korrigieren?
    Danke



  • Wenn du dein Array auf 25*25 vergößerst, mußt du auch den Wert für N auf 25 setzen, sonst bleibt ein Teil des Arrays undefiniert/ungenutzt. (btw, aussagekräftige Namen haben noch niemandem geschadet)



  • CStoll schrieb:

    Wenn du dein Array auf 25*25 vergößerst, mußt du auch den Wert für N auf 25 setzen, sonst bleibt ein Teil des Arrays undefiniert/ungenutzt. (btw, aussagekräftige Namen haben noch niemandem geschadet)

    Achso. Ja hab ich gemacht...
    N ist schon kurz deswegen hab ich N gewaehlt auch in Analogie zu NxN Matrix etc...
    Danke


Anmelden zum Antworten