Question

I have the following code for calculating n-queen puzzle using pthreads. But when I try to compile that code I get the following error message:

wikithread.c:7:5: error: variably modified ‘hist’ at file scope

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

int NTHREADS, SIZE; 
int hist[SIZE];
int count = 0;

int solve(int col, int tid)
{
    int start = tid * SIZE/NTHREADS;
    int end = (tid+1) * (SIZE/NTHREADS) - 1;
    int i, j;
    if (col == SIZE) 
    {
        count++;
    }

    #define attack(i, j) (hist[j] == i || abs(hist[j] - i) == col - j)
    for (i = start; i <= end; i++) {
        for (j = 0; j < col && !attack(i, j); j++);
        if (j < col) continue;

        hist[col] = i;
        solve(col + 1, tid);
    }

    return count;
}

void *worker(void *arg)
{
    int tid = (int)arg;
    solve(0, tid);
}

int main(int argc, char* argv[])
{
    pthread_t* threads;
    int rc, i;

    // checking whether user has provided the needed arguments
    if(argc != 3)
    {
        printf("Usage: %s <number_of_queens> <number_of_threads>\n", argv[0]);
        exit(1);
    }


    // passing the provided arguments to the SIZE and NTHREADS 
    // variable, initializing matrices, and allocating space 
    // for the threads
    SIZE = atoi(argv[1]);
    NTHREADS = atoi(argv[2]);
    threads = (pthread_t*)malloc(NTHREADS * sizeof(pthread_t));

    // declaring the needed variables for calculating the running time
    struct timespec begin, end;
    double time_spent;

    // starting the run time
    clock_gettime(CLOCK_MONOTONIC, &begin);

    for(i = 0; i < NTHREADS; i++) {
        rc = pthread_create(&threads[i], NULL, worker, (void *)i);
        assert(rc == 0); // checking whether thread creating was successfull
    }

    for(i = 0; i < NTHREADS; i++) {
        rc = pthread_join(threads[i], NULL);
        assert(rc == 0); // checking whether thread join was successfull
    }

    // ending the run time
    clock_gettime(CLOCK_MONOTONIC, &end);

    // calculating time spent during the calculation and printing it
    time_spent = end.tv_sec - begin.tv_sec;
    time_spent += (end.tv_nsec - begin.tv_nsec) / 1000000000.0;
    printf("Elapsed time: %.2lf seconds.\n", time_spent);

    printf("\nNumber of solutions: %d\n", count);

    return 0;
}

If I change the upper part, and dynamically allocate memory for the array, I get the following error:

int NTHREADS, SIZE; 
int *hist;
hist = (int*)malloc(SIZE * sizeof(int));

Then I get the following errors:

wikithread.c:8:1: warning: data definition has no type or storage class [enabled by default] wikithread.c:8:1: error: conflicting types for ‘hist’ wikithread.c:7:6: note: previous declaration of ‘hist’ was here wikithread.c:8:1: error: initializer element is not constant wikithread.c: In function ‘solve’: wikithread.c:23:27: error: subscripted value is neither array nor pointer nor vector wikithread.c:23:27: error: subscripted value is neither array nor pointer nor vector wikithread.c:26:7: error: subscripted value is neither array nor pointer nor vector

Anyone, can help me solve the problem?

Was it helpful?

Solution

You use SIZE to initialize an array without having defined it--

int NTHREADS, SIZE; 
int hist[SIZE];

Undoubtedly this is causing problems.

As for your second error, you have this at file scope:

hist = (int*)malloc(SIZE * sizeof(int));

but statements are not allowed outside a function body, just declarations.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top