Hello all,
I have been assigned in my class to come up with a program that is written in c and generates prime numbers from 2 to n. I have coded the problem but i have a problem. Any numbers greater than 6479 will not return the results that I would like. I have tried to debug this code many times will not such luck. I am new to multiprocessor coding. Any debugging help will be greatly appriciated. I am sure that I have some stupid coding error that I have not seen because I have been in front of the terminal for so long. Here is my code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
int CalculatePrimes(int startValue, int endValue);
int main(int argc, char *argv[])
{
//printf("Entering Program\n");
int i;
int n;
int processes;
int pid;
int prime;
int status;
int totalValue = 0;
int value = 100;
switch(argc)
{
case 1: n = 0;
//printf("Entered Case 1\n");
break;
case 2: n = atoi(argv[1]);
//printf("Entered Case 2\n");
break;
default: printf("Too many arguments\n");
exit(-1);
}
//printf("The value of n is %d\n", n);
value = n/4;
//printf("The value of value is %d\n", value);
processes = 4;
i = 0;
do
{
pid=fork();
//printf("This is the pid: %d\n", pid);
if(pid == 0) /*child process*/
{
//printf("We have a child!\n");
//printf("Value is %d\n", value);
prime = CalculatePrimes(i*value, (i*value) + value);
printf("prime %d\n", prime);
i = processes;
//printf("i in the child is %d\n", i);
//printf("Our child has ended. Returned prime thru exit\n");
printf("Prime is %d prime\n", prime);
exit(prime);
}
i = i+1;
//printf("This is the value of i counter %d\n", i);
}while(i < processes);
i = 0;
int tmp;
while(i < processes)
{
wait(&status);
tmp = WEXITSTATUS(status);
printf("This is the tmp variable %d\n", tmp);
//printf("status %d\n", status);
totalValue = totalValue + tmp;
//printf("total %d\n", totalValue);
i = i+1;
//printf("Value of i when in I < Processes %d\n",i);
}
printf("Total Primes %d\n", totalValue);
//printf("Exiting Program\n");
}
int CalculatePrimes(int startValue, int endValue)
{
//printf("Entering Calculating Primes\n");
int prime = 0;
bool isPrime;
//printf("start value %d\n", startValue);
//printf("end value %d\n" , endValue);
if(startValue < 2)
{
//printf("Entering the startValue Check\n");
startValue = 2;
//printf("Exiting the startValue check\n");
}
for(startValue; startValue< endValue; startValue++)
{
isPrime = true;
for(int j=2; j<startValue; j++)
{
if (startValue%j ==0)
{
isPrime = false;
//printf("start value after prime is fales = %d\n", startValue);
}
//printf("This is j %d\n", j);
}
if(isPrime)
{
//printf("%d is a prime number.\n", startValue);
prime = prime +1;
//printf("This is prime: %d\n", prime);
}
//printf("Start value at end of loop %d\n",startValue);
}
//printf("There are %d primes\n", prime);
//printf("Exiting Calculating Primes\n");
return prime;
}
* this code is supposed to be inefficent in finding primes because it is used merely as a bench mark.