Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I'm trying to simulate clients going into a bank and being served by tellers over a period of time. I am using a thread to determine if a client came into the bank via an arrival rate and am using multiple threads to represent tellers with an s service rate. I am using a struct to hold the period of time, arrival rate, service rate, number of tellers, and the customer waiting queue. I am attempting to share that struct between all threads but get "dereferencing pointer" errors and "request for member x in something not a structure" error.

//Used to store information input by user and the customer queue
struct shiftInfo {
    int tellers;
    int serviceTime;
    int simTime;
    int sampleInterval;
    int threadID;
    float arrivalRate;
    int Q[]; //Customer Queue
};

The information is passed from into the struct from the command line via

    struct shiftInfo *Q = malloc(sizeof(struct shiftInfo) + (maxCust*sizeof(int)));
    struct shiftInfo info;
    info.simTime = atoi(argv[1]);
    info.arrivalRate = atof(argv[2]);
    info.tellers = atoi(argv[3]);
    info.serviceTime = atoi(argv[4]);
    info.sampleInterval = atoi(argv[5]);
    //Initiates Q to 0
    for (int i = 0; i < maxCust; i++)
        info.Q[i] = 0;

The teller, timer, and customer threads are created and terminated by a main thread

  //Manager thread is main thread
  pthread_t manager;
  iret = pthread_create(&manager, NULL, mainThread, (void *)&info);
  if (iret){
    printf("ERROR: return code %d\n", iret);
    exit(-1);
    }

To keep this short I'm going to only ask about the timer thread and hopefully apply the answer to the other threads. The timer thread is created in the main thread by:

  int status;
  struct shiftInfo *I = info; 
  pthread_t time;
      status = pthread_create(&time, NULL, timer, (void *)info);
      if (status){
        printf("ERROR CODE: %d\n", status);
        exit(-1);
    }

And the timer thread function is:

void *timer(void *info){
    int timeRemaining = info -> simTime;
    while(timeRemaining){
        sleep(1);
        timeRemaining--;
        }
}

For "int timeRemaining = info -> simTime;" I get the warning "dereferencing void pointer" and the error request for member âsimTimeâ in something not a structure or union. Any advice would be appreciate.

Also, I create the customer thread identically to the way I create the timer thread but receive a warning (warning: passing argument 3 of âpthread_createâ makes pointer from integer without a cast [enabled by default]) that I do not receive when creating any other thread, what causes that?

pthread_t customer;
    status = pthread_create(&customer, NULL, customer, (void *)info);
        if (status){
            printf("ERROR CODE: %d\n", status);
            exit(-1);
        }
share|improve this question

closed as off-topic by mattnz, Kilian Foth, Blrfl, MichaelT, gnat Nov 28 '14 at 9:22

  • This question does not appear to be about software development within the scope defined in the help center.
If this question can be reworded to fit the rules in the help center, please edit the question.

    
please don't cross-post: stackoverflow.com/questions/27162629/… –  gnat Nov 28 '14 at 9:22

2 Answers 2

struct shiftInfo *Q = malloc(sizeof(struct shiftInfo) + (maxCust*sizeof(int)));

This allocates a struct shiftInfo object with space reserved for maxCust integers. Looks ok ...

struct shiftInfo info;
info.simTime = atoi(argv[1]);
info.arrivalRate = atof(argv[2]);
info.tellers = atoi(argv[3]);
info.serviceTime = atoi(argv[4]);
info.sampleInterval = atoi(argv[5]);

... but then this ^ creates another struct shiftInfo object, with no extra space reserved for customers, and with local scope.

//Initiates Q to 0
for (int i = 0; i < maxCust; i++)
    info.Q[i] = 0;

And finally, this ^ sets up the customer array that doesn't exist in the local object. The dynamically-allocated object called Q, which does have space for this customer array, never seems to be used.

share|improve this answer
    
question was cross-posted to a more appropriate site (Stack Overflow); consider "moving" your answer over there –  gnat Nov 28 '14 at 9:48
    
The answers on SO are at least as good already, but thanks for nudging me. –  Useless Nov 28 '14 at 16:09
    
Sorry, I wasn't sure if this was a better place to post it and hadn't known about this sub-overflow prior to the original post –  CSjunkie Nov 30 '14 at 1:00
    
Thank you for your suggestion @Useless –  CSjunkie Nov 30 '14 at 1:00

A void pointer says nothing about what it is pointing to - it's a "pointer to anything". So info -> simTime is not meaningful to the compiler. You need to cast the pointer back to the correct type before dereferencing it. If you know that it will always be a shiftInfo, then try something like ((shiftInfo *) info) -> simTime.

Your second warning is probably pointing out a bug in your program. The 3rd parameter is supposed to be a pointer-to-function, but you are passing it customer, which is a pthread_t.

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.