This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Why Keil generates differen outputs from the other compilers with the same code?

I am using the following code in different compiler:

#include <stdio.h>

int main(void)
{
  int i = 0;
  int b[10] = {100,101,102,103,104,105,106,107,108,109};
  int c[10] = {0,1,2,3,4,5,6,7,8,9};

  b[i + 0] = c[i++ % 100];
  b[i + 0] = c[i++ % 100];
  b[i + 0] = c[i++ % 100];
  b[i + 0] = c[i++ % 100];
  b[i + 0] = c[i++ % 100];
  b[i + 0] = c[i++ % 100];

  for(i = 0; i < 10; i++)
     printf("b[%d] = %d\n",i,b[i]);
  return 0;
}

But I am getting different output by using Keil,
the output as follows:

//Keils output... uVision3 V3.53, compiler Armcc.exe
b[0] = 100
b[1] = 0
b[2] = 1
b[3] = 2
b[4] = 3
b[5] = 4
b[6] = 5
b[7] = 107
b[8] = 108
b[9] = 109

//Microsoft Visual STD 6.0 output
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 4
b[5] = 5
b[6] = 106
b[7] = 107
b[8] = 108
b[9] = 109
Press any key to continue



//Microsoft Visual STD 2005 output
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 4
b[5] = 5
b[6] = 106
b[7] = 107
b[8] = 108
b[9] = 109
Press any key to continue

//Borland C++Builder6.0 output....
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 4
b[5] = 5
b[6] = 106
b[7] = 107
b[8] = 108
b[9] = 109

Could you tell me something about this problem?

Parents
  • Even when the behaviour is clearly defined, there is absolutely no requirement whatsoever for the compiler to generate any specific set of machine instructions.

    In fact, you should expect different compilers to generate different sets of machine instructions!

    Even different versions of the same compiler can generate different sets of machine instructions - which is why it is never trivial to upgrade the compiler part-way through a project.

    And, of course, changing options can cause the same version of the same compiler to generate different sets of machine instructions!

    This is why you really must not write timing loops in any high-level language - see: www.8052.com/.../98544
    and: www.8052.com/.../150987
    etc,...

Reply
  • Even when the behaviour is clearly defined, there is absolutely no requirement whatsoever for the compiler to generate any specific set of machine instructions.

    In fact, you should expect different compilers to generate different sets of machine instructions!

    Even different versions of the same compiler can generate different sets of machine instructions - which is why it is never trivial to upgrade the compiler part-way through a project.

    And, of course, changing options can cause the same version of the same compiler to generate different sets of machine instructions!

    This is why you really must not write timing loops in any high-level language - see: www.8052.com/.../98544
    and: www.8052.com/.../150987
    etc,...

Children
No data