|
|
View previous topic :: View next topic |
Author |
Message |
hmmpic
Joined: 09 Mar 2010 Posts: 314 Location: Denmark
|
Pointer error... |
Posted: Thu Oct 14, 2021 12:47 am |
|
|
This is only an example not production code.
Problem is in 5.105 not in 5.066. I use PCW IDE compiler.
Problem is sending a pointer for an array to a function. In 5.066 i use int8 and it work, in 5.105 it only work when using int16.
See my test code, it is a little long but simple.
-Is it a bug in 5.105?
a google search found this:
https://www.includehelp.com/c-programs/pass-an-array-of-strings-to-a-function.aspx
Code: |
/*
This is only a test program. I use PCW IDE as compiler.
Code are tested in MPLAB 8.92 as simulation, and in real hardware.
It is also tested in Code::Blocks too and work.
Problem is sending a array to a function.
In 5066 it work when using int8
In 5105 it must use int16 to work. -Think this is an error.
*/
#include <18F26K22.h>
#use delay(clock=8M,int)
#use RS232(Baud=115200,STOP=1,PARITY=N,BITS=8,UART1,ERRORS)
#include "string.h"
//in 5105 assign must be int16.
//in 5066 int8/char work ok.
void PointerTest(char **str){
int8 i;
//Print the token string
for (i=1; i<6; i++){
printf("PT *str:[%u] %s\r\n",i,str[i]);
}
}
void main(){
//string array
char *buffer[7]={"10","11","12","13","14","15","16"};
printf("Start\r\n");
PointerTest(buffer);
printf("End\r\n");
}
|
Last edited by hmmpic on Thu Oct 14, 2021 5:13 am; edited 4 times in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19503
|
|
Posted: Thu Oct 14, 2021 1:38 am |
|
|
There are several syntactical 'wrongs'. In C the name of an array is the
pointer to it. so &buffer is really wrong. Just use buffer.
Adding the &, doesn't generate a pointer to this. You would have to have
a variable, that contains this address, which you can then pass the address
of, to be a pointer to a pointer.
In C, & array_name, is exactly the same as array_name/
What is being passed, is a pointer to a character, not a pointer to a
pointer (which ** implies).
So you are posting code that shouldn't really work. It was a fluke it did
before, and it is still really a fluke it does now with int16.... |
|
|
hmmpic
Joined: 09 Mar 2010 Posts: 314 Location: Denmark
|
|
Posted: Thu Oct 14, 2021 2:25 am |
|
|
I made a lot of test on this, there are a problem in 5105. I adjust my example to only the minimum.
Problem is there in 5105. Why is it not working as an char/int8 pointer but need a int16 when assigning the pointer. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19503
|
|
Posted: Thu Oct 14, 2021 6:57 am |
|
|
OK.
The new version makes good sense (though remember the first entry
is 0, not 1 in the array).
I'd raise this with CCS. What is happening, is that the maths for the
array index, is being incremented by the target size, not the pointer
size. Very wrong. It does the same if you use the syntax: char * str[]
instead of the double pointer.
However it does work correctly if you use a typedef:
Code: |
/*
This is only a test program. I use PCW IDE as compiler.
Code are tested in MPLAB 8.92 as simulation, and in real hardware.
It is also tested in Code::Blocks too and work.
Problem is sending a array to a function.
In 5066 it work when using int8
In 5105 it must use int16 to work. -Think this is an error.
*/
#include <18F26K22.h>
#use delay(clock=8M,int)
#use RS232(Baud=115200,STOP=1,PARITY=N,BITS=8,UART1,ERRORS)
#include "string.h"
//generate a character pointer typedef.
typedef char* cptr;
//in 5105 assign must be int16.
//in 5066 int8/char work ok.
//now declare this as receiving an array of character pointers
void PointerTest(cptr str[])
{
int8 i;
//Print the token string
//Arrays start at 0, not 1. Changed.
for (i=0; i<7; i++)
{
printf("PT *str:[%u] %s\r\n",i,str[i]);
}
}
void main()
{
//string pointer array using typedef.
cptr buffer[]={"10","11","12","13","14","15","16"};
printf("Start\r\n");
PointerTest(buffer);
printf("End\r\n");
}
|
This makes it work.
It looks as if the typedef here makes the code 'know' that the object
passed is a pointer, and increment by the typedef size. |
|
|
hmmpic
Joined: 09 Mar 2010 Posts: 314 Location: Denmark
|
|
Posted: Thu Oct 14, 2021 7:18 am |
|
|
Thanks.
I have reported this to CCS with my latest example.
Hope they only fix the problem, and not add 2 new problem to the next release:-) |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19503
|
|
Posted: Fri Oct 15, 2021 12:34 am |
|
|
A little update on this. Decided to investigate a bit more.
Using the posted declaration on 5.066, if you read the sizeof(str[i]) in the
loop, it gives 2. Yet the array increment is by 1.
With the typedef, it gives 2, and increments by 2 in all versions.
All of the compilers actually give a warning 'pointer types do not match' with
the code as posted. Again this disappears using the typedef. It has already
gone wrong, when you get to 5.080. 5.078, is the last version I have found
where it works.
Declaring the function with PointerTest(char *str[]) gets rid of the pointer
types warning, but does not affect the operation.
5.080 has the following note in it's 'changes' entry:
5.080 A bug involving passing arrays to an inline function for some chips is fixed.
It looks as if this fix is actually what causes the problem....
However it does the same if PointerTest is declared as #separate. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|