Thread: Please help!

  1. #1
    Registered User
    Join Date
    Feb 2011
    Posts
    2

    Please help!

    Help...ive been working on this code for quite some time now and whenver i reach the end....it crashes...it is a vehicle parking system and it crashes when the program is checking the departure of a car...

    Code:
    
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define CAR 1
    #define CAR2 2  //RESERVED CARS ONLY
    
    /* to store vehicle number, and its   row-col position in an array */struct vehicle
    {
        int num ;
        int row ;
        int col ;
        int type ;
    } ;
    int parkinfo[4][10] ;  /* a 2-D array to store number of vehicle parked */int vehcount ;  /* to store total count of vehicles */int carcount ;    /* stores total count of cars */int car2count ;  /* stores total count of car2 */void display( ) ;
    void changecol ( struct vehicle * ) ;
    struct vehicle * add ( int, int, int, int ) ;
    void del ( struct vehicle *v ) ;
    void getfreerowcol ( int, int * ) ;
    void getrcbyinfo ( int, int, int * ) ;
    void show( ) ;
    /* decrements the col. number by one   this fun. is called when the data is   shifted one place to left */void changecol ( struct vehicle *v )
    {
        v -> col = v -> col - 1 ;
    }
    /* adds a data of vehicle */struct vehicle * add ( int t, int num, int row, int col )
    {
        struct vehicle *v ;
        v = ( struct vehicle * ) malloc ( sizeof ( struct vehicle ) ) ;
        v -> type = t ;
        v -> row = row ;
        v -> col = col ;
        if ( t == CAR )
               carcount++ ;
        else
            car2count++ ;
        vehcount++ ;
        parkinfo[row][col] = num ;
        return v ;
    }
    /* deletes the data of the specified   car from the array, if found */void del ( struct vehicle *v )
    {
        int c ;
        for ( c = v -> col ; c < 9 ; c++ )
                parkinfo[v -> row][c] = parkinfo[v -> row][c+1] ;
        parkinfo[v -> row][c] = 0 ;
        if ( v -> type == CAR )
            carcount-- ;
        else
            car2count-- ;
        vehcount-- ;
    }
    /* get the row-col position for the vehicle to be parked */void getfreerowcol ( int type, int *arr )
    {
        int r, c, fromrow = 0, torow = 2 ;
        if ( type == CAR2 )
        {
            fromrow += 2 ;
            torow += 2 ;
        }
        for ( r = fromrow ; r < torow ; r++ )
        {
            for ( c = 0 ; c < 10 ; c++ )
            {
                if ( parkinfo[r][c] == 0 )
                {
                    arr[0] = r ;
                    arr[1] = c ;
                    return ;
                }
            }
        }
        if ( r == 2 || r == 4 )
        {
            arr[0] = -1 ;
            arr[1] = -1 ;
        }
    }
    /* get the row-col position for the vehicle with specified number */void getrcbyinfo ( int type, int num, int *arr )
    {
        int r, c, fromrow = 0, torow = 2 ;
        if ( type == CAR2 )
        {
            fromrow += 2 ;
            torow += 2 ;
        }
        for ( r = fromrow ; r < torow ; r++ )
        {
            for ( c = 0 ; c < 10 ; c++ )
            {
                if ( parkinfo[r][c] == num )
                {
                    arr[0] = r ;
                    arr[1] = c ;
                    return ;
                }
            }
        }
        if ( r == 2 || r == 4 )
        {
            arr[0] = -1 ;
            arr[1] = -1 ;
        }
    }
    /* displays list of vehicles parked */void display( )
    {
        int r, c ;
        printf ( "Cars ->\n" ) ;
        for ( r = 0 ; r < 4 ; r++ )
        {
            if ( r == 2 )
                printf ( "Car2 ->\n" ) ;
            for ( c = 0 ; c < 10 ; c++ )
               printf ( "%d\t", parkinfo[r][c] ) ;
            printf ( "\n" ) ;
        }
    }
    void main( )
    {
        int choice, type, number, row = 0, col = 0 ;
        int i, tarr[2] ;
        int finish = 1 ;
        struct vehicle *v ;
        /* creates a 2-D array of car and car2 class */struct vehicle *car[2][10] ;
        struct vehicle *car2[2][10] ;
    
        /* displays menu and calls corresponding functions */while ( finish )
        {
    
            printf ( "\nCar Parking\n" ) ;
            printf ( "1. Arrival of a vehicle\n" ) ;
            printf ( "2. Total no. of vehicles parked\n" ) ;
            printf ( "3. Total no. of cars parked\n" ) ;
            printf ( "4. Total no. of car2 parked\n" ) ;
            printf ( "5. Display order in which vehicles are parked\n" ) ;
            printf ( "6. Departure of vehicle\n" ) ;
            printf ( "7. Exit\n" ) ;
            scanf ( "%d", &choice ) ;
            switch ( choice )
            {
                case  1 :
    
                    printf ( "\nAdd: \n" ) ;
                    type = 0 ;
                    /* check for vehicle type */while ( type != CAR && type != CAR2 )
                    {
                        printf ( "Enter vehicle type (1 for Car / 2 for Car2 ): \n" ) ;
                        scanf ( "%d", &type ) ;
                        if ( type != CAR && type != CAR2 )
                            printf ( "\nInvalid vehicle type.\n" ) ;
                    }
                    printf ( "Enter vehicle licence number: " ) ;
                    scanf ( "%d", &number ) ;
                    /* add cars' data */if ( type == CAR || type == CAR2 )
                    {
                        getfreerowcol ( type, tarr ) ;
                        if ( tarr[0] != -1 && tarr[1] != -1 )
                        {
                            row = tarr[0] ;
                            col = tarr[1] ;
                            if ( type == CAR )
                                car[row][col] =  add ( type, number, row, col ) ;
                            else
                                car2[row - 2][col] = add ( type, number, row, col ) ; ;
                        }
                        else
                        {
                            if ( type == CAR )
                                printf ( "\nNo parking slot free to park a car\n" ) ;
                            else
                                printf ( "\nNo parking slot free to park a car2\n" ) ;
                        }
                    }
                    else
                    {
                        printf ( "Invalid type\n" ) ;
                        break ;
                    }
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  2 :
    
                    printf ( "Total vehicles parked: %d\n", vehcount ) ;
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  3 :
                    printf ( "Total cars parked: %d\n", carcount ) ;
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  4 :
                    printf ( "Total car2 parked: %d\n", car2count ) ;
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  5 :
    
                    printf ( "Display\n" ) ;
                    display( ) ;
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  6 :
    
                    printf ( "Departure\n" ) ;
                    type = 0 ;
                    /* check for vehicle type */while ( type != CAR && type != CAR2 )
                    {
                        printf ( "Enter vehicle type (1 for Car / 2 for Car2 ): \n" ) ;
                        scanf ( "%d", &type ) ;
                        if ( type != CAR && type != CAR2 )
                            printf ( "\nInvalid vehicle type.\n" ) ;
                    }
                    printf ( "Enter vehicle licence number: "  ) ;
                    scanf ( "%d", &number ) ;
                    if ( type == CAR || type == CAR2 )
                    {
                        getrcbyinfo ( type, number, tarr ) ;
                        if ( tarr[0] != -1 && tarr[1] != -1 )
                        {
                            col = tarr [1] ;
                            /* if the vehicle is car */if ( type == CAR )
                            {
                                row = tarr [0] ;
                                del ( car [row][col] ) ;
                                for ( i = col ; i < 9 ; i++ )
                                {
                                    car[row][i] = car[row][i + 1] ;
                                    changecol ( car[row][i] ) ;
                                }
                                free ( car[row][i] ) ;
                                car[row][i] = NULL ;
                            }
                            /* if a vehicle is car2 */else
                            {
                                row = tarr[0] - 2 ;
                                if ( ! ( row < 0 ) )
                                {
                                    del ( car2[row][col] ) ;
                                    for ( i = col ; i < 9 ; i++ )
                                    {
                                        car2[row][i] = car2[row][i + 1] ;
                                        changecol ( car2[row][col] ) ;
                                    }
                                    car2[row][i] = NULL ;
                                }
                            }
                        }
                        else
                        {
                            if ( type == CAR )
                                printf ( "\nInvalid car number, or a car with such number has not been parked here.\n" ) ;
                            else
                                printf ( "\nInvalid car2 number, or a car2 with such number has not been parked here.\n" ) ;
                        }
                    }
                    printf ( "\nPress any key to continue..." ) ;
                    getch( ) ;
                    break ;
                case  7 :
    
                    for ( row = 0 ; row < 2 ; row++ )
                    {
                        for ( col = 0 ; col < 10 ; col++ )
                        {
                            if ( car[row][col] -> num != 0 )
                                free ( car[row][col] ) ;
                            if ( car2[row][col] -> num != 0 )
                                free ( car2[row+2][col] ) ;
                        }
                    }
                    finish = 0 ;
                    break ;
            }
        }
    }

  2. #2
    Registered User
    Join Date
    Sep 2006
    Posts
    8,868
    Paste in some unique printf() lines of code in CASE 6, and see where it goes bust.

    Code:
    printf("line 43 has been reached\n");
    printf("at line 48 now\n");
    like that. This is a basic troubleshooting technique, and you'll need to use it often.

    Note that it's hard to read your program, because it runs out so far to the right hand side, breaking the forum's "tables" for width.

    Especially in your code, (which uses a much wider font to make the program easier to read and format), keep the line length relatively short and use 2-5 char's only, for indentation.

    Sounds fussy, but it's a big help for studying code on the forum.

    Another fussy tip: After a comment, put your code on the NEXT ROW, rather than on the right hand side of the same row of text.

  3. #3
    Registered User inequity's Avatar
    Join Date
    Nov 2010
    Location
    Seattle, Washington
    Posts
    59
    Do you really write your code like this? Or was it just some error that happened in the copying and pasting?

    Code:
    /* decrements the col. number by one   this fun. is called when the data is   shifted one place to left */void changecol ( struct vehicle *v )
    {
        v -> col = v -> col - 1 ;
    }
    If this is actually how you write your code, you need to fix it.
    It's almost impossible to read.
    When you are starting the definition of a function, for example, void changecol(), that should be the first thing on the line.

    We'd be much more able to help you if your code read like this:
    Code:
    /* decrements the col. number by one in this function. 
    function is called when the data is  shifted one place to left */
    void changecol ( struct vehicle *v )
    {
        v->col = v->col - 1 ;
    }
    I'd also recommend against putting spaces between a struct, the '->' operator, and structure members. Maybe I'm being harsh but it will help you in the long run.

  4. #4
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,909
    The number of times I've seen this very same parking garage program show up here is astounding. Cdre, you would be doing everyone a favor if you stopped copying crappy code. Ya know, you might just learn something.

Popular pages Recent additions subscribe to a feed