954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Execution priority question

Hello.,
I'm very green in c++, and at school we just had a first lesson on pointers to functions, and I'm going over teachers code using debugger and dont understrand why the line age = getInt(IsValidAge); executes before printf, i thought C++ compiler executes lines sequentially. Any help would be greatly appreciated.
Thank you.
ps. The breakpoint sets to printf line but nothing goes on the screen, only after going into the getInt function it prints the line...
Regards,

andre

#include <stdio.h>
#include<string>

int IsValidAge(int age, char *er){
	int val = (age>=18 && age <= 100);
	if(!val) {
		strcpy(er, "Invalid age for driving, enter values between 18 and 100: ");
	}
	else{ er[0] = 0; }
	return val;
}
int IsValidMark(int mark, char *er){
	int val = (mark>=0 && mark <= 100);
	if(!val) {
		strcpy(er, "Invalid Mark, (0<=mark<=100): ");
	}
	else{
		er[0] = 0;
	}
	return val;
}

int getInt( int (*IsValid)(int, char *)){
	int num;
	int ret;
	int valid = 1;
	char newline;
	char ErrMes[121];
	do{
		fflush(stdin);
		ret = scanf("%d%c", &num,&newline);
		if(IsValid != NULL){
			valid = (*IsValid)(num,ErrMes);
		}
	}while(!(valid && ret == 2 && newline == '\n') && printf(ErrMes));
	return num;
}

int main(void){
	int age;
	int mark;
	printf("Enter Your Age: ");
	age = getInt(IsValidAge);
	printf("Enter your driving test mark: ");
	mark = getInt(IsValidMark);
	printf("you are %d years old and got %d in test\n", age, mark);
	return 0;
}
atman
Junior Poster in Training
50 posts since Oct 2008
Reputation Points: 10
Solved Threads: 0
 

Your code doesn't involve any c++ concepts. It is completely a c code I should say.And I think you are getting confused the order of execution is :

printf("Enter Your Age: ");  // Executes 1st
age = getInt(IsValidAge);  // Executes 2nd
printf("Enter your driving test mark: "); //Executes 3rd
mark = getInt(IsValidMark);  //Executes 4th


And this code involves a more subtle concept called function pointers.Read this .

The code getInt is called first which in turn executes the function IsValidAge and IsValidMark in lines :
if(IsValid != NULL)
{
valid = (*IsValid)(num,ErrMes);
}
This is the call by function pointers.

csurfer
Posting Pro
568 posts since Jan 2009
Reputation Points: 485
Solved Threads: 88
 

Moved to C forum because it is a C program, not c++.

>>fflush(stdin);
Non-standard use of fflush(). There is no standard way to flush the input stream, and fflush() is only defined to flush output streams to the file on disk (e.g. your hard drive).

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

> why the line age = getInt(IsValidAge); executes before printf
Standard out is buffered. The printf happened, in the sense that the resulting string was stored in the standard out buffer maintained by the library. But what didn't happen was that buffer being sent to the outside world so you could see it.

If you want to guarantee you'll see it, then you need to do this

printf("Enter Your Age: "); 
fflush( stdout );

Note that this is correct use of fflush().

Your use of fflush(stdin) (which is NOT an output stream) is broken.

In either language, use fgets() for C or cin.getline() for C++, I would suggest you read a WHOLE line into memory, then parse that line from memory. In your most immediate case, this would mean using sscanf().

Oh, and as already mentioned, decide whether you want to be a COR C++ programmer. Crazy mixes of c/c++ is not an option.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You