who's theorum? lol thanks for pointing this out, though.
yes, sorry, those &&s change to ||s.. fingers' fault.
who's theorum? lol thanks for pointing this out, though.
yes, sorry, those &&s change to ||s.. fingers' fault.
Last edited by nadroj; 04-06-2007 at 12:17 AM.
i mean how would/ should i redo my code becuase i'm getting fed up with this already. i mean i think you see what i want to do, i just can't figure out how to do it exactly
i cant see what you want to do, but i havent really looked at the big while loop.. ill look in the morning.
damm thanks
ok i completely re did my code and i get a fing segmentation fault. Where is it, i think this code is much better than the previous one i wrote. I ran GDB this is what it said for thing code
any idea what this means?Code:26 queue<rider> backIn; (gdb) 30 string inFileName = "riders.dat"; (gdb) 34 string outFileName = "riders.out"; (gdb) 37 ifstream inFile; (gdb) 40 ofstream outFile; (gdb) 43 inFile.open(inFileName.c_str()); (gdb) 46 outFile.open(outFileName.c_str()); (gdb) 49 rider customer; (gdb) 51 rider transfer = arrivals.front(); (gdb) Program received signal SIGSEGV, Segmentation fault. 0xb7f2e1bf in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string () from /usr/lib/libstdc++.so.6
Code://creates customer of the struct rider; rider customer; rider transfer = arrivals.front(); rider onRide = line.front(); while(inFile.good()) { //it will loop and read from the inFile data while the customer data //is not equal to END 0 0 while(customer.lastName != "END")) { //here the file will place the correct data for each customer into //the correct variables inFile >> customer.lastName >> customer.tickets >> customer.time; //after the customer in that particular read is done putting //it in the correct variables the customer gets pushed //into arrivals queue arrivals.push(customer); } transfer.time = clock; while(transfer.time == clock) { line.push(transfer); arrivals.pop(); } while(!(arrivals.empty() && line.empty())) { onRide.tickets--; if(onRide.tickets == 0) { outFile << onRide.lastName << clock+1 << endl; } else { backIn.push(onRide); } clock++; if(transfer.time > clock) { clock = transfer.time; } while(transfer.time == clock) { line.push(transfer); arrivals.pop(); } if(!backIn.empty()) { line.push(backIn.front()); backIn.pop(); } } } //closes the infile inFile.close(); //closes the outfile outFile.close(); //signals ok to the os return 0; };
Last edited by DarkDot; 04-06-2007 at 01:10 AM.
From what I read and understand of the instructions for this that were posted in this thread http://cboard.cprogramming.com/showthread.php?t=88198 you would use the clock variable to determine when you will add the item to the end of the line. It seems to me that you are setting the clock equal to the item in the queue when you should be comparing the entrance time to the clock to see if it should be added to the queue.
"Knowledge is proud that she knows so much; Wisdom is humble that she knows no more."
-- Cowper
Operating Systems=Slackware Linux 9.1,Windows 98/Xp
Compilers=gcc 3.2.3, Visual C++ 6.0, DevC++(Mingw)
You may teach a person from now until doom's day, but that person will only know what he learns himself.
Now I know what doesn't work.
A problem is understood by solving it, not by pondering it.
For a bit of humor check out xkcd web comic http://xkcd.com/235/
It looks, like you are still using the front() rider from queues that are empty.
What would arrivals.front() return before you put anything in it?
The way you do "time-travel" in your code also seems suspicious. There are situations where backIn is not empty (it's a temporary container, why can't you push onRide directly into the line, if he has tickets left?), but the clock gets turned forward according to the next arriver.
So if the first person arrived at time 1 and second at time 10, the first person can take only one ride and then the clock gets suddenly turned forward and he has to stand in queue with the second arriver?
(By the way, congratulations on removing the comments. If your teacher insists on that, add them as the last thing, because they really hindered reading the code.)
The code required is not very complicated, so may-be you could rewrite it from scratch (with a little better plan), rather than modifying it to every suggestion. A simple way to determine if the main loop should continue, is to keep a counter of people visiting the amusement park. First set it equal to the number of people planning to visit (arrivals), each time someone runs out of tickets decrement it. When it reaches 0, all riders will be served.
Last edited by anon; 04-06-2007 at 04:24 AM.
i have new updated code and i am still getting a segmentation fault i ran thriugh gdb and tried to fix but to no avail. If you think/know whats wrong please let me know where in the code specifically it is.
Code:#include <queue> #include <iostream> #include <fstream> #include <string> #include "rider.h" using namespace std; int main() { //variable used to keep time int clock; //queue that the information from the infile gets stored into queue<rider> arrivals; //queue that the riders with the correct clock time get put into queue<rider> line; //queue that the rider that needs to be put back in line gets held queue<rider> backIn; //string that makes it easier to remember the name of the file to open //to read from string inFileName = "riders.dat"; //string that makes it easier to remember the name of the file to open //to write to string outFileName = "riders.out"; //file read from ifstream inFile; //file write to ofstream outFile; inFile.open(inFileName.c_str()); if (!inFile) { // error if not inFilename entered when prompted cout << "ERROR: Unable to open the inFile"; exit(1); } //open outFile outFile.open(outFileName.c_str()); if (!outFile) { // error if not outFilename entered when prompted cout << "ERROR: Unable to open the outFile"; exit(1); } //creates customer of the struct rider; rider customer; //here the file will place the correct data for each customer into //the correct variables inFile >> customer.lastName >> customer.time >> customer.tickets; //it will loop and read from the inFile data while the customer data //is not equal to END 0 0 while(!(customer.lastName == "END" && customer.tickets == 0 && customer.time == 0)) { //after the customer in that particular read is done putting it in the //correct variables the customer gets pushed ito arrivals queue arrivals.push(customer); //here the file will place the correct data for each customer into //the correct variables inFile >> customer.lastName >> customer.time >> customer.tickets; } inFile.close(); //once all the customers are read from the inFile and put into the arrivals //queue the program and clock will have to be run where this data will be //processed. For the processing part of the program, it will run while //the queues arrivals and line are not empty, therefore they will stop //running when they become empty. while(!(arrivals.empty() && line.empty() && backIn.empty())) { rider transfer = arrivals.front(); if(transfer.time > clock) { //sets clock equal to the first customers time clock = transfer.time; } //will put all the customers with the same arrival //time as the clock into the line queue while(transfer.time == clock) { //here the front of the arrivals queue is put into the line queue line.push(transfer); //here the old front from the arrivals queue is popped off arrivals.pop(); transfer = arrivals.front(); } //need to check to see if backIn is empty or not, if it is //then it won't add anything, if not it will add the customers data if(!backIn.empty()) { //if the rider from the previous time still has tickets left it //will be added after the next group of customers from that time line.push(backIn.front()); //get ride of the rider in the backIn queue backIn.pop(); } //after the customers are added to the line queue the ride //will begin to run, which entails taking away one ticket //from the person on the ride then checking to see if any //tickets are left and if so add to the end of the line queue //after the next group of customers enter, if no tickets are //left then write out the name and the clock time to the out file. //creates a variable onRide to represent the front of the line //queue which represents that customer going on the ride rider onRide = line.front(); //takes 1 ticket way from the customer that is going on the line onRide.tickets--; //increments clock clock++; //after the ride is completed it checks to see if the customer //that was just on the ride has more tickets to go back in line //or if it should be written to the outfile //if the customer on ride has 0 tickets the last name and the //clock time get printed out on the line to the outfile if(onRide.tickets == 0) { //write the customers lastName and clock time to the outfile outFile << onRide.lastName << clock << endl; line.pop(); onRide = line.front(); } //else if the cusomters ticket count is greater than 0 the customer //and his info will get stored into backIn to place the customer //back in line else { //places the customer on the ride's data into the backIn //variable so they may get placed back in line backIn.push(onRide); line.pop(); onRide = line.front(); } /* //this will look to see if the transfer arrival time is equal to 0, if not //it will set clock equal to that number then copy all the transfers that //have that clock number. //checks to see if the transfer time is equal to the clock time if(!line.empty()) { //will put all the customers with the same arrival //time as the clock into the line queue while(transfer.time == clock) { //here the front of the arrivals queue is put into the line queue line.push(transfer); //here the old front from the arrivals queue is popped off arrivals.pop(); transfer = arrivals.front(); } //need to check to see if backIn is empty or not, if it is //then it won't add anything, if not it will add the customers data if(!backIn.empty()) { //if the rider from the previous time still has tickets left it //will be added after the next group of customers from that time line.push(backIn.front()); //remove the rider in backIn backIn.pop(); } //increment clock clock++; //after the customers are added to the line queue the ride //will begin to run, which entails taking away one ticket //from the person on the ride then checking to see if any //tickets are left and if so add to the end of the line queue //after the next group of customers enter, if no tickets are //left then write out the name and the clock time to the out file. //creates a variable onRide to represent the front of the line //queue which represents that customer going on the ride onRide = line.front(); //takes 1 ticket way from the customer that is going on the line onRide.tickets--; //after the ride is completed it checks to see if the customer //that was just on the ride has more tickets to go back in line //or if it should be written to the outfile //if the customer on ride has 0 tickets the last name and the //clock time get printed out on the line to the outfile if(onRide.tickets == 0) { //write the customers lastName and clock time to the outfile outFile << onRide.lastName << clock << endl; line.pop(); onRide = line.front(); } //else if the cusomters ticket count is greater than 0 the customer //and his info will get stored into backIn to place the customer //back in line else { //places the customer on the ride's data into the backIn //queue so they may get placed back in line backIn.push(onRide); line.pop(); onRide = line.front(); } }*/ } //closes the outfile outFile.close(); //signals ok to the os return 0; };
give clock a value when you declare it near the top of the code. im sure this will affect your program, but i doubt its the segfault--still looking.Code:if(transfer.time > clock)
edit: you have a giant block-comment--are we supposed to ignore its content?
Last edited by nadroj; 04-06-2007 at 10:16 PM.
Here, I added some asserts for you. See where the queue whose front element you are trying to read is empty. (This doesn't mean there's nothing else wrong with the code.)
If you fix those problems, you still have the infinite loop that has already been pointed out. pop() just removes the first element from the queue, it doesn't magically change transfer.
All in all, the logic is messy. A complete rewrite (with a clearer logic) could get you there.
And when posting code again, please consider the comments below.
When posting code, please think about those that you are posting the code for.Code:#include <iostream> #include <fstream> #include <string> #include <queue> #include <cassert> using namespace std; struct rider { //variable for last name of rider string lastName; //variable for number of tickets the rider has int tickets; //variable for the arrival time of the rider int time; }; int main() { //variable used to keep time int clock; //queue that the information from the infile gets stored into queue<rider> arrivals; //queue that the riders with the correct clock time get put into queue<rider> line; //queue that the rider that needs to be put back in line gets held queue<rider> backIn; //string that makes it easier to remember the name of the file to open //to read from string inFileName = "riders.dat"; //string that makes it easier to remember the name of the file to open //to write to string outFileName = "riders.txt"; //file read from ifstream inFile; //file write to ofstream outFile; inFile.open(inFileName.c_str()); if (!inFile) { // error if not inFilename entered when prompted cout << "ERROR: Unable to open the inFile"; exit(1); } //open outFile outFile.open(outFileName.c_str()); if (!outFile) { // error if not outFilename entered when prompted cout << "ERROR: Unable to open the outFile"; exit(1); } //creates customer of the struct rider; rider customer; //here the file will place the correct data for each customer into //the correct variables inFile >> customer.lastName >> customer.time >> customer.tickets; //it will loop and read from the inFile data while the customer data //is not equal to END 0 0 while(!(customer.lastName == "END" && customer.tickets == 0 && customer.time == 0)) { //after the customer in that particular read is done putting it in the //correct variables the customer gets pushed ito arrivals queue arrivals.push(customer); //here the file will place the correct data for each customer into //the correct variables inFile >> customer.lastName >> customer.time >> customer.tickets; } inFile.close(); assert(clock == 0 && "clock probably not initialized."); while(!(arrivals.empty() && line.empty() && backIn.empty())) { assert(!arrivals.empty() && "arrivals must not be empty!"); rider transfer = arrivals.front(); if(transfer.time > clock) { //sets clock equal to the first customers time clock = transfer.time; } while(transfer.time == clock) { //here the front of the arrivals queue is put into the line queue line.push(transfer); assert(line.size() <= 4 && "How can you have more than 4 people in the line?"); //here the old front from the arrivals queue is popped off assert(!arrivals.empty() && "arrivals must not be empty!"); arrivals.pop(); assert(!arrivals.empty() && "arrivals must not be empty!"); transfer = arrivals.front(); } if(!backIn.empty()) { assert(!backIn.empty() && "backIn must not be empty!"); line.push(backIn.front()); //get ride of the rider in the backIn queue backIn.pop(); } assert(!line.empty() && "line must not be empty!"); rider onRide = line.front(); //takes 1 ticket way from the customer that is going on the line onRide.tickets--; //increments clock clock++; if(onRide.tickets == 0) { //write the customers lastName and clock time to the outfile outFile << onRide.lastName << clock << endl; line.pop(); assert(!line.empty() && "line must not be empty!"); onRide = line.front(); } else { backIn.push(onRide); line.pop(); assert(!line.empty() && "line must not be empty!"); onRide = line.front(); } outFile.close(); } //signals ok to the os return 0; }
Make sure code is properly indented.
If you have a massive amount of comments, make a copy of your source code and remove comments that don't add anything to the understanding.
In particular remove large blocks of commented out code. Some people are reading this is the browser, where it is impossible to see where the comments start and end.
Try to provide something compilable. Contents of "riders.h" could be pasted directly into the source, rather than have people search for a small declaration in a lengthy thread.