Investigating Unexpected Outputs in C Code

  • Thread starter Thread starter akueddy
  • Start date Start date
  • Tags Tags
    C code Code
Click For Summary
SUMMARY

The forum discussion addresses unexpected outputs in a C program that calculates spark timing based on engine RPM. The original code incorrectly uses an integer array and pointer, leading to undefined behavior when accessing out-of-bounds elements. Key issues include using integer division and incorrect data types, which were resolved by switching to a float array and correcting the format specifier in the printf function. The final recommendation emphasizes using a modern C compiler to avoid compatibility issues.

PREREQUISITES
  • Understanding of C programming syntax and structure
  • Knowledge of pointers and array indexing in C
  • Familiarity with data types, specifically integers and floats
  • Basic understanding of compiler behavior and undefined behavior in C
NEXT STEPS
  • Learn about C array indexing and the implications of zero-based indexing
  • Explore the differences between integer and floating-point arithmetic in C
  • Study the concept of undefined behavior in C and how to avoid it
  • Research modern C compilers and their advantages over older versions
USEFUL FOR

C programmers, software developers working with embedded systems, and anyone troubleshooting C code related to hardware interactions.

akueddy
Messages
14
Reaction score
0
Hi,

I tried to assign inputs to a particular output and I've got some funny results. In this code
ive change the value of rpm to into the address of arrays that I've set. The address correspond to the delay time for spark to occur.


Heres my c code :

Code:
#include <stdio.h>


void main()
{

int n,x;

    int Array[8] = { 5, 4, 3.5, 2, 1.5, 1,  0.5, 0};

    int *pArray;

printf("what is the RPM of the engine? 0-8000\n");
scanf("%d", &n);

x = n/1000 ;

pArray = &Array[x];



printf("Spark will be produce at : %d microseconds before top dead centre\n",*pArray);
}


And here's the output :

Code:
C:\Borland\BCC55\Bin>bcc32 pointers5
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
pointers5.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\Borland\BCC55\Bin>pointers5
what is the RPM of the engine? 0-8000
500
Spark will be produce : 5 microseconds before top dead centre

C:\Borland\BCC55\Bin>pointers5
what is the RPM of the engine? 0-8000
1000
Spark will be produce : 4 microseconds before top dead centre

C:\Borland\BCC55\Bin>pointers5
what is the RPM of the engine? 0-8000
7999
Spark will be produce : 0 microseconds before top dead centre

C:\Borland\BCC55\Bin>pointers5
what is the RPM of the engine? 0-8000
8000
Spark will be produce : 8000 microseconds before top dead centre

C:\Borland\BCC55\Bin>

My questions :

1) Why is the output's value equals to data stored in array 2 when clearly the input(1000) was suppose to point in array 1?

2) Why do i get 8000 microseconds when it is suppose to be 0 microseconds?
 
Technology news on Phys.org
Here are some changes you need to make:
Code:
#include <stdio.h>


int main()  /* main always returns an int */
{

int n,x;

    float Array[8] = { 5, 4, 3.5, 2, 1.5, 1,  0.5, 0}; /* these are float numbers not int */

    float *pArray;  /* float pointer */

    printf("what is the RPM of the engine? 0-8000\n");
    scanf("%d", &n);
    x = n/1000 ;
    pArray = &Array[x];
    printf("Spark will be produced at : %f microseconds before top dead centre\n",
             *pArray); /* %d to %f */
    return 0;
}

When you divide two integers 7999/1000 you get 7 not 8.

arrays have indexes that start at 0, not 1. The second element of the array is array[1], the first element is array[0];

In the case pf 8000 - you went past the end of the array you looked at array[8], the ninth element - this is undefined behavior.

Undefined means anything (always bad) can happen. I think in this case the integer n was stored on the stack right after the end of the array. Also, consider getting a free modern C compiler. You're using a C++ compiler for C, which may also lead to unexpected results.
 
Last edited:

Similar threads

  • · Replies 3 ·
Replies
3
Views
4K
Replies
1
Views
2K
  • · Replies 25 ·
Replies
25
Views
3K
  • · Replies 9 ·
Replies
9
Views
2K
Replies
47
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 21 ·
Replies
21
Views
3K
  • · Replies 22 ·
Replies
22
Views
3K