Martin G C Davies wrote:
main: sizeof curpseudoreg=2 main: alignof curpseudoreg=2 main: curpseudoreg initially set to 5 initregcons: sizeof curpseudoreg=4 initregcons: alignof curpseudoreg=4 initregcons: curpseudoreg=327680 initregcons: curpseudoreg now set to 99 main: curpseudoreg=0
So the quuestion is, why is the sizeof and alignog different in the two modules?
They are not the same variable. You see that the values also of curpseudoreg are different. external means defined in an other "module". curpseudoreg cannot be external both in regabs and in main. I do not know why there is not some error like "duplicate identifier" then in regabs, and why the curpseudoreg internal to regabs has the wrong size.
You can make it work as you expect with the following:
---------------------------------------------------------- main.pas =========
var curpseudoreg: packed -32768..32767; external; procedure initregcons ; external;
begin writeln( 'main: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ) ; writeln( 'main: alignof curpseudoreg=' , alignof( curpseudoreg ) ) ; curpseudoreg := 5 ; writeln( 'main: curpseudoreg initially set to ' , curpseudoreg ) ; initregcons ; writeln( 'main: curpseudoreg=' , curpseudoreg ) ; end.
regabs.pas ===========
module regabs;
var curpseudoreg: packed -32768..32767; Asmname 'Curpseudoreg'; procedure initregcons; Asmname 'Initregcons';
procedure initregcons; begin writeln( 'initregcons: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ); writeln( 'initregcons: alignof curpseudoreg=' , alignof(curpseudoreg ) ) ; writeln( 'initregcons: curpseudoreg=' , curpseudoreg ) ; curpseudoreg := 99 ; writeln( 'initregcons: curpseudoreg now set to ' , curpseudoreg ) ; end ;
end.
----------------------------------------------------------------- Only in the main they are declared external, since they are defined in regabs, but you need something to make them known outside of regabs, whence asmname with current gpc capitalisation, avoiding an other asmname in the main.
Now all this is "C in pascal" programming. Such kwirks are needed to interface C and Pascal. But better use regular pascal syntax, i.e. with EP modules since you seem to like the name:
------------------------------------------------------------------------- main.pas =========
program main(output) ;
import regabs;
begin writeln( 'main: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ) ; writeln( 'main: alignof curpseudoreg=' , alignof( curpseudoreg ) ) ; curpseudoreg := 5 ; writeln( 'main: curpseudoreg initially set to ' , curpseudoreg ) ; initregcons ; writeln( 'main: curpseudoreg=' , curpseudoreg ) ; end.
regabs.pas ===========
module regabs interface;
export regabs = all;
var curpseudoreg: packed -32768..32767; procedure initregcons ;
end.
module regabs implementation;
procedure initregcons ; begin writeln( 'initregcons: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ); writeln( 'initregcons: alignof curpseudoreg=' , alignof(curpseudoreg ) ) ; writeln( 'initregcons: curpseudoreg=' , curpseudoreg ) ; curpseudoreg := 99 ; writeln( 'initregcons: curpseudoreg now set to ' , curpseudoreg ) ; end ;
end.
--------------------------------------------------------------
Compiled with gpc -Wall main.pas --automake it works as expected also:
main: sizeof curpseudoreg=2 main: alignof curpseudoreg=2 main: curpseudoreg initially set to 5 initregcons: sizeof curpseudoreg=2 initregcons: alignof curpseudoreg=2 initregcons: curpseudoreg=5 initregcons: curpseudoreg now set to 99 main: curpseudoreg=99
And you have not to worry about true asmnames, with may change some day, and invalidate all your efforts ...
Maurice