-
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 ;
}
}
}
-
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.
-
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.
-
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.