es******@gmail.com writes:
Has anybody ever seen a thing like this?
### code:
double link_bw_cost(int a, int b){
double ro;
ro = ( (double) link_usage[a][b].bandw / (double) link[a][b].bandw);
printf("DEBUG - a = %d e b = %d\n", a, b);
printf("DEBUG - link_usage[%d][%d].bandw = %ld link[%d][%d].bandw
= %ld \n", a, b, link_usage[a][b].bandw, a, b, link[a][b].bandw);
### when running:
DEBUG - a = 0 e b = 2
DEBUG - link_usage[0][2].bandw = 0 link[1078689792][0].bandw = 2
It's helpful to tell us what you think is wrong with the output,
though it's obvious enough in this case (the value of ``a'' is shown
as 0 and as 1078689792 in the same printf call).
Here's the final printf statement reformatted with comments added; the
comments indicate which format specifier is used for each argument.
printf("DEBUG - link_usage[%d][%d].bandw = %ld "
"link[%d][%d].bandw = %ld \n",
a, /* %d */
b, /* %d */
link_usage[a][b].bandw, /* %ld */
a, /* %d */
b, /* %d */
link[a][b].bandw); /* %ld */
We know that a and b are of type int, but we don't know the type of
bandw. (I'm assuming that link_usage[a][b] and link[a][b] are of the
same type, and therefore that both bandw are of the same type, but I
can't even be sure of that.)
The printf statement assumes that bandw is of type long int. The most
likely explanation for the misbehavior is that bandw is actually of
some other type. Using an incorrect printf format causes undefined
behavior.
--
Keith Thompson (The_Other_Keith)
ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"