Investigating Unexpected Outputs in C Code

  • Thread starter Thread starter akueddy
  • Start date Start date
  • Tags Tags
    C code Code
Click For Summary
The discussion revolves around issues encountered in a C program that assigns spark timing based on engine RPM input. The original code incorrectly uses an integer array and pointer, leading to unexpected output values. Key points include the need to change the array to a float type, as the timing values are decimal, and to ensure the pointer correctly references the array elements. The integer division of RPM by 1000 results in incorrect indexing, particularly when inputs exceed the array bounds, leading to undefined behavior. It is emphasized that array indexing starts at zero, and accessing out-of-bounds elements can cause unpredictable results. Additionally, using a modern C compiler instead of a C++ compiler is recommended to avoid further complications.
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 adress 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:
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

  • · Replies 3 ·
Replies
3
Views
4K
Replies
1
Views
2K
  • · Replies 25 ·
Replies
25
Views
2K
  • · 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 1 ·
Replies
1
Views
2K