Investigating Unexpected Outputs in C Code

  • Thread starter Thread starter akueddy
  • Start date Start date
  • Tags Tags
    C code Code
AI Thread 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:
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.

Similar threads

Back
Top