Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Homework Help: Problem accessing the struct object.

  1. Mar 28, 2010 #1
    I'm having some problem accessing the struct object in multiple functions. Here's the code:

    Code (Text):

    #include<stdio.h>
    #include <malloc.h>

    struct os
    {
        char process ;
        int arrival_time;
        int *burst;
        int *CPU_Bursts;
        int *IO_Bursts;
        int l;
        int num_of_ps;
        int total;
    };

    struct Process
    {
        int Response_time;
        int Waiting_time;
        int Turnaround_time;
    };

    void Get_File ();
    void Calculate ();

    void Get_File ()
    {
        char a;
        int b=0;
        int j;
        FILE *far;
        FILE *f;
        FILE *far2;
        struct os pp;
        pp.num_of_ps=0;
        pp.total=0;
    ////////////////////////////
        int m;
        char s[500];
        f=fopen ("umer.txt","r");
        if (!f)
            printf ("Could not open the file.\n");
        while (fgets (s,1000,f)!=NULL)
        {
            if (s[m] == 'P')
            {
                pp.num_of_ps++;
            }
            //printf ("%s", s);
        }
        printf ("processes are: %d\n", pp.num_of_ps);
        printf ("\n");
        fclose(f);
        struct os *fast;
        fast=malloc(pp.num_of_ps*sizeof(struct os));

    ///////////////////////////
        far=fopen("umer.txt","r");
        int i;
        for(i=0;i<pp.num_of_ps;i++)
        {
            fast[i].l=0;
            fscanf(far,"%c",&fast[i].process);
            fscanf(far,"%c",&a);
            fscanf(far,"%d",&fast[i].arrival_time);
            //printf ("Arrival time of process %d is %d\n", i+1, fast[i].arrival_time);            
            fscanf(far,"%c",&a);
            while (a!='\n')
            {
                fscanf(far,"%c",&a);
            }

            fscanf(far,"%c",&a);
            while (a!='\n')
            {
                if (a>='0')
                {
                    b++;
                }
                else if (a=' ')
                {
                    b=0;
                }
                if (a!=' '&& b==1)
                {
                    pp.total++;
                    fast[i].l++;
                }
                fscanf(far,"%c",&a);
            }
            //printf("Bursts for the process %d are %d\n",i+1,fast[i].l);
            fast[i].burst=malloc(fast[i].l*sizeof(int));
        }
        fclose(far);
        int q,zo;
        char on;
        far2=fopen("umer.txt","r");
        for (q=0; q<pp.num_of_ps; q++)
        {
            fscanf(far2,"%c",&on);
            while (on!='\n')
            {
                fscanf(far2,"%c",&on);
            }
            fscanf(far2,"%c",&on);
            for (zo=0; zo<fast[q].l; zo++)
            {
                fscanf (far2,"%d",&fast[q].burst[zo]);
                //printf ("%d ", fast[q].burst[zo]);
            }
            printf ("\n");
        }
        //printf ("%d ", pp.total);
    }

    ///////////////I can't access the struct object in this function////////////////

    /*void Calculate ()
    {
        Get_File();
        struct os obj1;
        struct os *ptr1;
        struct Process obj2;
        struct Process *ptr2;
        int *CPU;
        int *IO;
        int size;
        int i,zo;
        printf ("%d ", obj1.total);      // The value should be 44 but it gives 0. That's the problem
        size=((obj1.total)/2)+1;
        CPU=malloc(size*sizeof(int));
        IO=malloc(size*sizeof(int));
        ptr1=malloc(obj1.num_of_ps*sizeof(struct os));
    }*/

    int main()
    {
        //Get_File ();
        Calculate ();
        return 0;
    }


     
    What's the problem?
     
  2. jcsd
  3. Mar 28, 2010 #2

    Filip Larsen

    User Avatar
    Gold Member

    Specifically, you refer obj1 which is an uninitialized auto variable. However, from a brief look through the code it appears to be somewhat in a mess, so you will probably have more problems.

    More generally, I recommend that you take a step back and learn how to work with pointers, function parameters and programming in general in C as this language gives you ample room to mess up in surprising ways if you don't understand it.
     
  4. Mar 28, 2010 #3

    Mark44

    Staff: Mentor

    I second what Filip said about getting more knowledgeable with pointers, function parameters, and general programming.

    Here are some comments about the Calculate function.
    Code (Text):
    void Calculate ()
    {
        Get_File();
        struct os obj1;
        struct os *ptr1;
        struct Process obj2;
        struct Process *ptr2;
        int *CPU;
        int *IO;
        int size;
        int i,zo;
        printf ("%d ", obj1.total);      // The value should be 44 but it gives 0. That's the problem
        size=((obj1.total)/2)+1;
        CPU=malloc(size*sizeof(int));
        IO=malloc(size*sizeof(int));
        ptr1=malloc(obj1.num_of_ps*sizeof(struct os));
    }

     
    1. obj1 is a local variable that is never initialized, so all of its fields are garbage values; i.e., whatever values happen to be sitting in memory at those locations. ptr1 is not initialized until the last line of code in this function, where you are using it to point to memory allocated by malloc. In the call to malloc, you are using obj1.num_of_ps to determine the number of bytes of memory to allocate, but num_of_ps is not set with a predictable value.
      Likewise, obj2 and ptr2 are never initialized.
    2. i and zo are never initialized, and they aren't used. If a variable isn't used, it shouldn't be there, since it just clutters up your function.
    3. The call to printf displays the value in obj1.total. obj1 has not been initialized, so obj1.total is going to be whatever garbage value happens to be in memory at that time. Why do you think the value there should be 44? You didn't do anything to cause this value to be placed there.
    4. obj1.total is also a garbage value, so size gets set using whatever value happens to be in obj1.total. You should never assign a garbage value to a variable.
    5. CPU and IO are set with addresses pointing to blocks of memory, but you don't do anything with these pointers.
     
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook