Fehler in PrimGenerator



  • Also ich hab mich an nem Generator für Primzahlen versucht, der alle primzahlen von 0 bis 2^32-1 finden soll.
    Allerdings stürzt das Prog "irgendwann" einfach ab.
    Die lezte Meldungen vor "irgendwann" sind:

    50001877   (25000937)
      50001879   (25000938)
      50001881   (25000939)
      50001883   (25000940)
      50001885   (25000941)
      50001887   (25000942)
      50001889   (25000943)
      50001891   (25000944)
      50001893   (25000945)
      50001895   (25000946)
      50001897   (25000947)
      50001899   (25000948)
      50001901   (25000949)
      50001903   (25000950)
      50001905   (25000951)
      50001907   (25000952)
      50001909   (25000953)
      50001911   (25000954)
      50001913   (25000955)
      50001915   (25000956)
      50001917   (25000957)
      50001919   (25000958)
      50001921   (25000959)
    

    Die Software gibt zuerst die "angeblich" gefundene Primzahl aus, danach gibt sie aus um die wievielte Primzahl es sich handelt. Parallel dazu werden die Zahlen auch in eine Binärdatei geschrieben (jew. 4byte pro Zahl).
    Wie ihr sicher erkennt sind dies nicht alles Primzahlen (sondern immer um 2 inkrementiert).
    Damit ihr wißt was in meinem Code auf euch zu kommt, hier die Optimierungen:
    -inkrement von 2 (jede 2. Zahl ist durch 2 teilbar, logo)
    -teste nur durch bereits gefundene Primzahlen
    -teste nur bis maximal zur Wurzel

    hat jemand von euch ne Idee oder nen Lösungsansatz?
    mfg
    -bg-

    /*
     prims.c
    */
    #include <stdio.h>
    #include <alloc.h>   
    #include <math.h>    //sqrt()
    #include <windows.h> //GetTickCount()
    
    #define UINT unsigned long int
    #define MAX_UINT 0xFFFFFFFF //assuming UINT is 32bit
    
    #define MAX_PRIMS 100000000
    #define PrimFileName "prims32.bin"
    
    int main ()
    {
     UINT* prims;
     UINT primCount=1, i,test, testsqrt;
     UINT maxPrims = MAX_PRIMS;
     UINT startTime;
    
     FILE *primFile;
    /*File Stuff*/
     if (!(primFile = fopen (PrimFileName,"w")))
      {
       printf ("Could not open File: %s",PrimFileName);
       return 1;
      }
    /************/ 
    
     prims = farmalloc (MAX_PRIMS);
     if (!prims)
     {
      printf ("error while allocating memory :(\n");
      return 2;
     }
     prims[0] = 2;
    
     fwrite (prims, 4, primCount, primFile);
    
     printf ("size of UINT: %d; %u\n",sizeof (UINT), 0xFFFFFFFF);
     getch();
    
     printf ("Generating prims ...\n\n");
    // printf ("%10.u   (%8.u)\n",prims[primCount-1], primCount);
     startTime = GetTickCount();
    
      for (test=2+1; (test < 0xFFFFFFFF)&&(primCount<maxPrims); test+=2)
      {
       if (primCount+1>=maxPrims)
       {
        maxPrims += 400;
        prims = (UINT *)farrealloc (prims, maxPrims);
        if (!prims)
        {
         printf ("error for allocating %u bytes\n",maxPrims);
         return 2;
        }
       }
       i=0;
       testsqrt = sqrt (test)-1; 
       for (i=0;i<=primCount;++i)
       {
        if ((i==primCount) || (testsqrt>prims[i]) )
         {
          prims[primCount++]=test;
          printf ("%10.u   (%8.u)\n",test, primCount);
          //putc ('.',stdout);
          fwrite (&test, 4, 1, primFile);
    
          break;
         }
        if (!(test % prims[i]))
          break;
       }
    
      }
    printf ("\nlast prim %u , and %u prims found\n",prims[primCount-1],primCount  );
    printf ("needed %u millisecounds",GetTickCount()-startTime);
    {
    
    /************/
    fclose (primFile);
    /************/ 
    }  
     return 0;
    }
    


  • Hallo!

    Ich bin kein Debugger, also debug dein Programm bitte selber.
    Wenn du den Fehler eingrenzen kannst, dann reden wir weiter, ok?



  • Original erstellt von -bg-:
    **hat jemand von euch ne Idee oder nen Lösungsansatz?

    prims = farmalloc (MAX_PRIMS);
     ...
     prims = (UINT *)farrealloc (prims, maxPrims);
    

    **

    Vielleicht solltest Du beim Speicherholen die Größe von UINT berücksichtigen 😉



  • Thx,

    zu der Sache mit dem dbg, muß ich dir zustimmen, ich hallte diese zahlreichen 'mein Prog läuft nicht bitte macht es heil'-Threads auch für ein wenig nervig, allerdings muß ich auch leider zugeben, dass ich auf dieser Maschine leider zur Zeit keinen entsprechenden dbg habe. Aber sieht so auß als hätte ich in diesem Fall Glück gehabt, denn ich glaube jetzt läßt sich der Fehler beseitigen.

    thx & mfg
    -bg-



  • Den anderen Fehler habe ich (oder ich glaube zumindest ich habe 🙂 gefunden:

    if ((i==primCount) || (testsqrt>prims[i]) )
    

    st natürlich falsch, es muß

    if ((i==primCount) || (testsqrt<prims[i]) )
    

    heißen, denn bei großen Zahlen ist deren Wurzel natürlich größer als 2.

    Wenn jemand sonst noch Tipps hat, ich nehme sie gerne.

    mfg
    -bg-


Anmelden zum Antworten