# Help with Threaded Prime Number Finder Assignment

This is a discussion on Help with Threaded Prime Number Finder Assignment within the C Programming forums, part of the General Programming Boards category; Hey guys. I'm a beginner in C and I have a college assignment here that I could use some help ...

1. ## Help with Threaded Prime Number Finder Assignment

Hey guys. I'm a beginner in C and I have a college assignment here that I could use some help solving. Let me explain the basic assignment.

The program should find all the primes between 2-1000, inclusive. There will be threads to filter out multiples of 2, 3, 5, 7 and 11 before the final thread checks the rest (checks if the number is divisible by any odd numbers from 13 to the sqrt of the number).

Here is my code, there are obviously errors in it and I can't compile it. I could use some pointers, no pun intended. Thanks.

Code:
```// Threaded Primes

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <semaphore.h>
#include <fcntl.h>

#define Q_SIZE 10

struct queue {
int queue[Q_SIZE];
int front; int back;
sem_t *mutex;
sem_t *slots;
sem_t *items;
};

struct queue queue1;
struct queue queue2;
struct queue queue3;
struct queue queue4;
struct queue queue5;
struct queue queue6;

struct filter {
void *input;
void *output;
int p;
}

void numberFilter(void *filterStruct) {  // check #s
int nextNumber;
int number = filterStruct->number;
void *inputQ = filterStruct->inputQ;
void *outputQ = filterStruct->outputQ;

while(1) {
nextNumber = dequeue(inputQ);
if(nextNumber == -1) {
enqueue(number, outputQ);
}
if(nextNumber == number) enqueue(number, outputQ);
if(nextNumber%number != 0) enqueue(nextNumber, outputQ);
}

}

void generator() {      // generate #'s 2 thru 1000
int counter = 2;
while(counter<1001) {
enqueue(counter, queue1);
counter++;
}
enqueue(-1, queue1); // send poison pill
}

void finalCheck(void *inputQ) {     // final checker, 13 thru sqrt of #
int nextNumber;
while(1) {
nextNumber = dequeue(inputQ);
if(nextNumber == -1) {
}
int prime = 1;
for(int i = 13; i<=sqrt(nextNumber); i+=2) {
if(nextNumber%i == 0) prime = 0;
}
if(prime == 1) printf("%d ", nextNumber);
}
}

void initQueue(void *q) {
q.queue[0] = 0;
q.front = 0; q.back = 0;
q.mutex = sem_open("QueueMutex", O_CREAT, 0700, 1); // init mutex sem
if (!q.mutex) {
perror("semaphore create error");
exit(4);
}
q.slots = sem_open("QueueSlots", O_CREAT, 0700, 10); // init slots sem
if (!q.slots) {
perror("semaphore create error");
exit(4);
}
q.items = sem_open("QueueItems", O_CREAT, 0700, 0); // init items sem
if (!q.items) {
perror("semaphore create error");
exit(4);
}
}

void enqueue(int newElement, void *q) {
sem_wait(q.slots); // P(slots) operation.
sem_wait(q.mutex); // P(mutex) operation.
q.queue[back] = newElement;
back = (back+1) % Q_SIZE;
sem_post(q.mutex); // V(mutex) operation.
sem_post(q.items); // V(items) operation.
}

int dequeue(void *q) {
sem_wait(q.items); // P(items) operation.
sem_wait(q.mutex); // P(mutex) operation.
int value = q.queue[q.front];
front = (front+1) % Q_SIZE;
sem_post(q.mutex); // V(mutex) operation.
sem_post(q.slots); // V(slots) operation.
return value;
}

int main() {
initQueue(*queue1);
initQueue(*queue2);
initQueue(*queue3);
initQueue(*queue4);
initQueue(*queue5);
initQueue(*queue6);

struct filter filter2 = {&queue1, &queue2, 2};
struct filter filter3 = {&queue2, &queue3, 3};
struct filter filter5 = {&queue3, &queue4, 5};
struct filter filter7 = {&queue4, &queue5, 7};
struct filter filter11 = {&queue5, &queue6, 11};

generator();
// creates thread for sorting through 2's.
// creates thread for sorting through 3's.
// creates thread for sorting through 5's.
// creates thread for sorting through 7's.
// creates thread for sorting through 11's.
// creates thread for final check.

}```

2. > Here is my code, there are obviously errors in it and I can't compile it. I could use some pointers, no pun intended. Thanks.
So what error messages do you get?

Code:
```\$ gcc bar.c
bar.c:33: error: two or more data types in declaration specifiers
bar.c: In function ‘numberFilter’:
bar.c:35: warning: dereferencing ‘void *’ pointer
bar.c:35: error: request for member ‘number’ in something not a structure or union
bar.c:36: warning: dereferencing ‘void *’ pointer
bar.c:36: error: request for member ‘inputQ’ in something not a structure or union
bar.c:37: warning: dereferencing ‘void *’ pointer
bar.c:37: error: request for member ‘outputQ’ in something not a structure or union
bar.c: In function ‘finalCheck’:
bar.c:68: error: ‘for’ loop initial declarations are only allowed in C99 mode
bar.c:68: note: use option -std=c99 or -std=gnu99 to compile your code
bar.c: In function ‘initQueue’:
bar.c:76: error: request for member ‘queue’ in something not a structure or union
bar.c:77: error: request for member ‘front’ in something not a structure or union
bar.c:77: error: request for member ‘back’ in something not a structure or union
bar.c:78: error: request for member ‘mutex’ in something not a structure or union
bar.c:79: error: request for member ‘mutex’ in something not a structure or union
bar.c:83: error: request for member ‘slots’ in something not a structure or union
bar.c:84: error: request for member ‘slots’ in something not a structure or union
bar.c:88: error: request for member ‘items’ in something not a structure or union
bar.c:89: error: request for member ‘items’ in something not a structure or union
bar.c: At top level:
bar.c:96: warning: conflicting types for ‘enqueue’
bar.c:42: note: previous implicit declaration of ‘enqueue’ was here
bar.c: In function ‘enqueue’:
bar.c:97: error: request for member ‘slots’ in something not a structure or union
bar.c:98: error: request for member ‘mutex’ in something not a structure or union
bar.c:99: error: request for member ‘queue’ in something not a structure or union
bar.c:99: error: ‘back’ undeclared (first use in this function)
bar.c:99: error: (Each undeclared identifier is reported only once
bar.c:99: error: for each function it appears in.)
bar.c:101: error: request for member ‘mutex’ in something not a structure or union
bar.c:102: error: request for member ‘items’ in something not a structure or union
bar.c: In function ‘dequeue’:
bar.c:106: error: request for member ‘items’ in something not a structure or union
bar.c:107: error: request for member ‘mutex’ in something not a structure or union
bar.c:108: error: request for member ‘queue’ in something not a structure or union
bar.c:108: error: request for member ‘front’ in something not a structure or union
bar.c:109: error: ‘front’ undeclared (first use in this function)
bar.c:110: error: request for member ‘mutex’ in something not a structure or union
bar.c:111: error: request for member ‘slots’ in something not a structure or union
bar.c: In function ‘main’:
bar.c:116: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:117: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:118: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:119: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:120: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:121: error: invalid type argument of ‘unary *’ (have ‘struct queue’)
bar.c:131: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘struct filter (*)(void *)’
bar.c:134: error: redefinition of ‘k’
bar.c:131: note: previous definition of ‘k’ was here
bar.c:134: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘struct filter (*)(void *)’
bar.c:137: error: redefinition of ‘k’
bar.c:134: note: previous definition of ‘k’ was here
bar.c:137: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘struct filter (*)(void *)’
bar.c:140: error: redefinition of ‘k’
bar.c:137: note: previous definition of ‘k’ was here
bar.c:140: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘struct filter (*)(void *)’
bar.c:143: error: redefinition of ‘k’
bar.c:140: note: previous definition of ‘k’ was here
bar.c:143: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘struct filter (*)(void *)’
bar.c:146: error: redefinition of ‘k’
bar.c:143: note: previous definition of ‘k’ was here
bar.c:146: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(void *)’```
A couple of free hints, but you need to do better yourself.
1. line 31 is missing a ;
2. line 35, you need to cast your void* pointer back into whatever pointer type it is supposed to be
3. all your initQueue(*queue1); should use & rather than *

More to the point, did you write 150 lines and then press "compile" for the first (and only) time, only for you to discover that there are a sack-full of issues, and your easy way out is to dump the whole mess on a forum for someone else to fix?

Here's how you're supposed to code - you write 5 to 10 lines of what seems to be syntactically valid code and you press compile. If it compiles, fine - carry on.

If it doesn't compile, then you FIX it so it does compile.
Fixing errors in the code you just added is easy to do, and above all easy to find (you just added them).
Also, you're only going to get a couple of errors (not a couple of pages of errors), so you won't be demotivated.