[C] Probleme miit setitimer

Von: , Frage gestellt am Fr, 11. Dez 2009

Hallo,

ich soll ein Programm schreiben, dass Primzahlen berechnet, solange ein Timer noch läuft. Das ganze soll 10Mal passieren, und dann der Mittelwert berechnet werden.
Die Aufgabe ist eigentlich nicht schwer, aber immer wenn der 1. Timer abgelaufen ist, beendet sich das Programm mit der Ausgabe "Alarm clock"
Ich habe ein wenig gegoogelt und herausgefunden, dass es irgendwie an der falschen Behandlung von SIGALRM liegen muss. Wisst ihr was ich hier am besten tun kann?

#include "header.h"
short isPrime(long);
void sigfkt();
int flag=1;
int main(){
int start,n=0,i=0,gesamt=0,startwert,status;
double durchschnitt;
struct itimerval itime;
signal(14,SIG_DFL);
signal(14,sigfkt);
printf("Ab welcher Zahl sollen die Primzahlen berechnet werden?");
scanf("%d",&start);
itime.it_value.tv_sec=1;
itime.it_interval.tv_sec=0;
itime.it_value.tv_usec=0;
itime.it_interval.tv_usec=0;
startwert=start;
for(i=0;i<10;i++){
status=setitimer(ITIMER_REAL,&itime,NULL);
if (status<0){
perror("Timer");
}
while(flag==1){
isPrime(startwert);
startwert++;
n++;
printf("n= %d \n",n);
}
gesamt=gesamt+n;
startwert=start;
flag=1;
printf("%d. Schleifendurchlauf beendet",i);
}
durchschnitt=gesamt/10;
printf("Die durchschnittliche Anzahl der Durchläufe mit Startwert %d in 1 Sekunde beträgt %f",start,durchschnitt);
}
short isPrime(long p){
long s, d;
s = (long) sqrt(p) + 1;
if ( p <  2 ) return 0;
if ( p == 2 ) return 1;
if ( p % 2 == 0 ) return 0;
for ( d = 3; d <= s; d+=2 )
if ( p % d == 0 ) return 0;
return 1;
}
void sigfkt(){
flag=0;
printf("Signal ^^");
}

5 Antworten zu dieser Frage

  1. Antwort von nach 13 Stunden 0 hilfreich
    Re: [C] Probleme miit setitimer

    Howdy, Ausgabe "Alarm clock"
    Ich habe ein wenig gegoogelt und herausgefunden, dass es
    irgendwie an der falschen Behandlung von SIGALRM liegen muss.
    die Signal Disposition fuer SIGALRM wird beim ersten Aufruf des Signalhandlers auf den Defaultwert zurueckgesetzt. Der Defaulthandler fuer SIGALRM druckt "Alarm clock" und terminiert das Programm.

    Richtige Handhabung deshalb ohne "signal", dafuer mit "sigaction"

    Einmalig:

    struct sigaction oAction;
    memset(&oAction,0,sizeof(oAction));
    oAction.sa_handler = sigfkt;
    sigaction(SIGALRM,&oAction,NULL);
    


    Beachte, dass die Signal Handler normalerweise eine andere Signatur haben, als die, die du codiert hast.

    Gruss
    norsemanna

    • Antwort von nach 14 Stunden 0 hilfreich
      Re^2: [C] Probleme miit setitimer

      Danke sehr norsemanna,

      das hat das Problem gelöst!

      Ein paar meiner Kommilitonen hatten das gleiche Problem und scheinbar zuerst setitimer aufgerufen und danach erst die itimerval Strukur initialisiert...

      Wir hatten die sigaction Funktion nur erwähnt, also scheint es auch ohne irgendwie zu gehen.

      Viiielen Dank!

  2. Antwort von nach 13 Stunden 0 hilfreich
    Re: [C] Probleme miit setitimer

    Hallo, ich soll ein Programm schreiben, dass Primzahlen berechnet [...]
    Die Aufgabe ist eigentlich nicht schwer
    Herzlichen Glückwunsch. Ein Programm, das Primzahlen direkt berechnen kann, suchen sehr viele Menschen schon sehr lange. Wenn das für Dich nicht schwer ist, darfst Du Dich schon mal über die sicher bald folgende Fields-Medal freuen.

    http://de.wikipedia.org/wiki/Fields_Medal

    Gruß

    Fritze

    • Antwort von nach 14 Stunden 0 hilfreich
      Re^2: [C] Probleme miit setitimer

      Guten Tag,



      Entschuldigung, das war etwas unglücklich formuliert, aber man muss auch nicht gleich so grantig reagieren.

      Ich glaube es ist klar ersichtlich, dass es in dem Programm darum geht, zu identifizieren ob es eine Zahl eine Primzahl ist oder nicht.

      Ich bitte um konstruktive Kritik nicht Wortklauberei!

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: [C] Probleme miit setitimer

        Hallo, Ich glaube es ist klar ersichtlich, dass es in dem Programm
        darum geht, zu identifizieren ob es eine Zahl eine Primzahl
        ist oder nicht.
        Ich bin gar nicht grantig, möchte aber darauf hinweisen, dass auch das Erkennen von Primzahlen nur unbefriedigend gelöst und alles andere, als ein triviales Problem ist.

        Was Dein Programm machen soll, ist Primzahlen zu generieren. Dafür gibt es ein paar Verfahren, die aber bei großen Zahlen an ihre Grenzen stoßen.

        Gruß

        Fritze

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!