I have extracted the following code from a larger project.
The problem is, that i'm not able to pass the array via an adresspointer in the procedure SPI_Write_Buf() with three parameters.
In the procedure with only one parameter it seems to work.
I think the problem is, that the correct adress from "globalpointer" isn't copied to "apointer".
Code: Select all
program Zeigerproblem01;
var WriteArr: array[4] of byte;
var globaltextbuffer: array[8] of char;
var globalcounter: byte;
var globalpointer: ^byte;
procedure test(matrix: ^byte);
begin
for globalcounter := 0 to 3 do
begin
matrix^ := matrix^+1;
Inc(matrix);
end;
end;
procedure SPI_Write_Buf(reg: byte; apointer: ^byte; bytelength:byte);
var byte_ctr: byte;
var op_status: byte;
begin
UART1_Write_text('adr_proc ');
ByteToStr(apointer^,globaltextbuffer); //Returns Wrong Value
UART1_Write_text(globaltextbuffer);
{for globalcount := 0 to 3 do //WORKS
begin
ByteToStr(WriteArr[globalcount],globaltextbuffer);
UART1_Write_text(globaltextbuffer);
end;
for globalcount := 0 to 3 do //Manipulating Array-> Works
begin
globalpointer^ := globalpointer^+1;
Inc(globalpointer);
end;
for globalcount := 0 to 3 do //WORKS
begin
ByteToStr(WriteArr[globalcount],globaltextbuffer);
UART1_Write_text(globaltextbuffer);
Dec(globalpointer); //Dirty piece of code to give pointer initial value
end;
for globalcount := 0 to 3 do //Works
begin
ByteToStr(globalpointer^,globaltextbuffer);
UART1_Write_text(globaltextbuffer);
Inc(globalpointer);
end; }
UART1_Write_Text('value_proc ');
//anbuffer := globalpointer; //doesn't help
for globalcounter := 0 to 3 do //FAILES -RETURNS WRONG VALUES-
begin
ByteToStr((apointer^),globaltextbuffer);
UART1_Write_text(globaltextbuffer);
inc(apointer);
end;
end;
begin
{ Main program }
UART1_Init(19200);
delay_ms(100);
UART1_Write_text('Init');
WriteArr[0] := 1;
WriteArr[1] := 2;
WriteArr[2] := 3;
WriteArr[3] := 4;
for globalcounter:=0 to 3 do
begin
ByteToStr(WriteArr[globalcounter],globaltextbuffer);
UART1_Write_Text(globaltextbuffer);
end;
UART1_Write_Text('test ');
test(@WriteArr[0]); //WORKS
for globalcounter:=0 to 3 do
begin
ByteToStr(WriteArr[globalcounter],globaltextbuffer);
UART1_Write_Text(globaltextbuffer);
end;
UART1_Write_Text('adr '); //Works,
byteToStr(@WriteArr[0],globaltextbuffer);
UART1_Write_text(globaltextbuffer);
UART1_Write_Text('value '); //Works, returns 2
byteToStr(WriteArr[0],globaltextbuffer);
UART1_Write_text(globaltextbuffer);
UART1_Write_Text('vvp '); //Works, returns 2 vvp = value via pointer
globalpointer := @WriteArr;
wordToStr(globalpointer^,globaltextbuffer);
UART1_Write_text(globaltextbuffer);
SPI_Write_Buf(0x00,globalpointer,4); //FAILES, seems that copying of Adresspointer fails
end.
Init 1 2 3 4 2 3 4 5 adr 20 value 2 vvp 2 adr_proc 32 value_proc 32 32 32 32
Help would be much appreciated.
TNX