Code: Alles auswählen
[code=laz]

code=c geht übrigens auch.
Code: Alles auswählen
[code=laz]
ErnstVolker hat geschrieben: Hier wollte er dann kein PInteger mehr bzw. hat in der Schleife bei aus:=i nach einem array verlangt.
Code: Alles auswählen
procedure sequen(ein: PInteger; aus: Pinteger); cdecl;
var i: integer;
begin;
for i:=0 to ein^-1 do
begin
aus^:=i;
inc(aus);
end;
end;
Das ist logisch. Scilab verlangt einen Zeiger auf ein Array von Integern. Array of PInteger ist aber ein Array von Zeigern auf Integer.ErnstVolker hat geschrieben:Wenn ich es so mache:
dann stürzt scilab ab.Code: Alles auswählen
library sequenz; procedure sequen(ein: PInteger; aus: array of Pinteger); cdecl; var i: integer; begin; for i:=0 to ein^-1 do aus[i]^:=i; end; exports sequen; begin end.
Code: Alles auswählen
procedure sequen(var ein: Integer; var aus: array of Integer); cdecl;
...
Code: Alles auswählen
type
IntArray = array of Integer;
PIntArray = ^IntArray;
procedure sequen(ein: PInteger; aus: PIntArray); cdecl;
...
Das würde ich als reinen Zufall bezeichnen. Wenn du die Schleife bis "ein" laufen lässt, setzt du insgesamt "ein+1" Elemente des Arrays. Warum sollte mehr Speicher reserviert worden sein, als benötigt? Das letzte Element schreibst du einfach direkt hinter den für das Array reservierten Speicher. Dabei passiert nichts, solange dieser Speicherbereich nicht gelesen oder ausgeführt wird und der von dir geschriebene Wert dabei etwas auslöst, was irgendwie bemerkbar wird. Wenn man Speicher selbst verwaltet und dabei Fehler macht, macht sich das genau aus diesem Grund oft erst später bemerkbar und lässt sich meist nur ganz schlecht nachvollziehen.ErnstVolker hat geschrieben:Und es scheint auch nichts aus zu machen, wenn man den Schleifenzähler bis "ein" anstelle "ein-1" laufen lässt.
Das Ergebnis ist identisch und Scilab stürzt nicht ab.