a)
Zum unterschiedlichen Verhalten von Command-Line-Compiler (tpc.exe) und in der IDE integrierten Compiler (tpx.exe):
Unterschiedliches Kompilierverhalten kann natürlich davon kommen, dass die Compilerschalter unterschiedlich sind. Der in der IDE integrierte Compiler verwendet die im Config-Menü der IDE eingestellten Compilerschalter. TPC.EXE hingegen die per Parameter übergebenen Compilerschalter.
Zum Gleichlauf kann man - wie schon mal geschrieben - durch zweimal <Strg-O> in der IDE die gerade aktuellen Compilerschalter in den Quelltext einfügen. Dann müßte auch TPC.EXE mit denselben Schaltern kompilieren.
Genaues kann ich allerdings nicht sagen, da ich mit TPC.EXE bei TP 7.0 noch nie gearbeitet habe. (Bei TP 5.0 und 6.0 war das anders: Dort war wegen der IDE oftmals der freie Speicher knapp, so dass man größere Programme immer extern kompilieren musste).
b)
Zu der komischen Parameterübergabe:
Ich kann mich gerade daran erinnern, dass ich einmal Probleme hatte, wenn ich Byte-Variablen als Procedure-Parameter übergeben hatte, diese Parameter aber als Integer definiert waren.
Grundsätzlich ist es meines Wissens so, dass der Compiler bei einer Bytezuweisung an eine Integervariable deren High-Anteil löscht. (Ich denke, dass das so ist. Mangels Retro-PC kann ich momentan nichts überprüfen!).
Wenn ich also
Code: Alles auswählen
VAR MyInteger :Integer;
MyByte :Byte;
BEGIN
MyInteger := 32000;
MyByte := 25;
MyInteger := MyByte;
END.
habe, sollte in MyInteger der Wert 25 stehen. (Wie gesagt, soweit ich mich erinnere. Ich kann das derzeit nicht nachprüfen). Ggf. muß auch der Compilerschalter für OPEN oder Extended Paramaters angeschaltet sein, da Pascal nach Wirth m.W. keine Zuweisungen verschiedener Typen erlaubt.
Ich dachte anfangs, das sei bei PROCEDURE - Parametern genauso.
Habe ich z.B. eine
Code: Alles auswählen
PROCEDURE Kopiere( Quelle, Ziel:Pointer; WieOft:Integer ); assembler;
asm
push ds
les di, Ziel
lds si, Quelle
mov cx, WieOft
cld
rep movsb
pop ds
end;
und übergebe ich hier einen ByteVariable, z.B:
Code: Alles auswählen
VAR MyByte: Byte;
p1,p2 :Pointer;
BEGIN
Kopiere( p1, p2, MyByte);
END.
wird die Kopierschleife REP MOVSB aus der PROCEDURE Kopiere aber undefinierbar oft aufgerufen.
Grund dürfte sein: Pascal übergibt hier nur das Low-Byte (=MyByte) und trägt dieses in den Stack ein, muß aber ein ganzes Word für den Stack reservieren,um WieOft unterzubringen. Der High-Anteil von WieOft ist aber zufällig, wodurch sich für das CX bzw. die Variable WieOft ein zufälliger Wert ergibt.
Mittels TypeCasting (@Dosenware: mein Dauerliebling! Viel besser als absolute!) geht es aber ohne Probleme:
also Kopiere(p1, p2, Integer(MyByte) );
Wie gesagt: ohne Prüfung, frei nach Erinnerung.