From: Robby on
Hello,

Today I ported a small function which values used to display fine in the old
compiler's watch window but now displays weirdly in the watch windows of
MPLAB/C32 and VC++ compilers.

In the last week, I have externed many int variables/arrays and char
variables the way it was instructed to me and up to now they all work fine. I
don't know if this has to do with the fact that externs for *char arrays* are
as valid as for the externs we do for ints and chars.

Basically, I am trying to innitialize a char array with 88 values. They are
simple byte values which have no relation to the ascii charaters. Please view
the small sippet of code:

Please see questions after this code:
=========================main.c
#include <stdio.h>
#include "setup.h"
#include "spi.h" // extern included so to be in scope of this file!

int main()
{
innit_buff();
set_spi_flash_buffer(spiFLASH_BUFFER);
return 0;
}

=======================setup.h
#ifndef SETUP_H
#define SETUP_H

void innit_buff();

#endif // SETUP_H //

=====================setup.c
#include "setup.h"
#include "spi.h"

void innit_buff()
{
int i=0;
// RESET FLASH BUFFER
for(i=0; i<88; i++)
spiFLASH_BUFFER[88] = 97; // <<< buffer assignment!

i = 0; /// BREAKPOINT #1

}

=======================spi.h
#ifndef SPI_H
#define SPI_H

extern unsigned char spiFLASH_BUFFER[88]; // buffer externed in a header
file
void set_spi_flash_buffer(spiFLASH_BUFFER);
#endif // SPI_H //

=======================spi.c
#include "spi.h"

unsigned char spiFLASH_BUFFER[88]; // extern declared in exactly one .c file!

void set_spi_flash_buffer(unsigned char spiFLASH_BUFFER[])
{
int r=0;
for(r=0;r<44;r++)
spiFLASH_BUFFER[r]= 0;

for(r=44;r<88;r++)
spiFLASH_BUFFER[r]= 255;

r=0; // <<< BREAKPOINT #2
}
=================================

QUESTION #1:

When the program hits BREAKPOINT #1, the "buffer assignment" line of code
(in setup.c) assigns to the buffer the value of 97. However, in the watch
window, the values of the "spiFLASH_BUFFER[88]" char array are always "0"
???? and it is displayed in the watch window this way:

spiFLASH_BUFFER 0x00e953c0
[0] ....0
[1] ....0
[2] ....0
[3] ....0
[4] ....0
....
....
[84] ....0
[85] ....0
[86] ....0
[87] ....0

I don't know why they are always 0 as opposed to bieng 97????

QUESTION #2:

When the program hits BREAKPOINT #2, the values of the
"spiFLASH_BUFFER[88]" char array are not even displayed anymore in the watch
window ??? All I see in the watch window now is a small blue cube and 0 as
its value, like this:

spiFLASH_BUFFER 0x00e953c0
[] ....0

I am wondering why I am not seeing every char value in this array this way:

spiFLASH_BUFFER 0x00e953c0
[0] ....0
[1] ....0
[2] ....0
[3] ....0
[4] ....0
....
....
[84] ....255
[85] ....255
[86] ....255
[87] ....255

Even though I am assigning regular numeric values to a char type array, we
should still be able to see them in the watch window... no?

confused!

Can anyone explain to me as to why we are seeing this type of information in
the watch window?

Thankyou all for your help.

--
Best regards
Roberto
From: Giovanni Dicanio on
"Robby" <Robby(a)discussions.microsoft.com> ha scritto nel messaggio
news:DA43D6FB-193D-472F-90C8-3A424DA34A63(a)microsoft.com...

> void innit_buff()
> {
> int i=0;
> // RESET FLASH BUFFER
> for(i=0; i<88; i++)
> spiFLASH_BUFFER[88] = 97; // <<< buffer assignment!

Should it be the following?

spiFLASH_BUFFER[i] = 97;

(instead of spiFLASH_BUFFER[88] = 97, which is also invalid buffer overrun
if spiFLASH_BUFFER has 88 items; in fact, the last item index is N-1 = 88-1
= 87).

Giovanni


From: Igor Tandetnik on
Robby <Robby(a)discussions.microsoft.com> wrote:
t i=0;
> // RESET FLASH BUFFER
> for(i=0; i<88; i++)
> spiFLASH_BUFFER[88] = 97; // <<< buffer assignment!

You are assigning the same value to the same element spiFLASH_BUFFER[88] mutliple times. Further, 88 is not a valid index into spiFLASH_BUFFER - you have a buffer overrun here. I'm pretty sure you meant spiFLASH_BUFFER[i]

> unsigned char spiFLASH_BUFFER[88]; // extern declared in exactly one
> .c file!
>
> void set_spi_flash_buffer(unsigned char spiFLASH_BUFFER[])

By giving function parameter the same name as a global variable, you are confusing yourself.

> QUESTION #1:
>
> When the program hits BREAKPOINT #1, the "buffer assignment" line of
> code (in setup.c) assigns to the buffer the value of 97.

No it doesn't. It writes the value 97 88 times beyond the end of the buffer. The buffer itself remains unchanged.

> QUESTION #2:
>
> When the program hits BREAKPOINT #2, the values of the
> "spiFLASH_BUFFER[88]" char array are not even displayed anymore in
> the watch window ??? All I see in the watch window now is a small
> blue cube and 0 as its value, like this:
>
> spiFLASH_BUFFER 0x00e953c0
> [] ....0

Within set_spi_flash_buffer, spiFLASH_BUFFER refers to the function's parameter, not to the global variable. And since the parameter is declared without array size, the debugger doesn't know how many elements you expect it to display.
--
With best wishes,
Igor Tandetnik

With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is hard to be sure where they are going to land, and it could be dangerous sitting under them as they fly overhead. -- RFC 1925