Vergleich "FPC" mit "C"

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Vergleich "FPC" mit "C"

Beitrag von monta »

Auch wenn es nichts zum Problem tut:

Code: Alles auswählen

[code=laz]
[/code] bitte zur Hervorhebung benutzen, sieht einfach schöner aus ;)

code=c geht übrigens auch.
Johannes

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Vergleich "FPC" mit "C"

Beitrag von theo »

ErnstVolker hat geschrieben: Hier wollte er dann kein PInteger mehr bzw. hat in der Schleife bei aus:=i nach einem array verlangt.


Delphi unterstützt diese Syntax nicht.
Da müsste man durch "incen".
So ähnlich müsste es auch im Delphi mode klappen (nicht getestet)

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;

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Vergleich "FPC" mit "C"

Beitrag von RSE »

ErnstVolker hat geschrieben:Wenn ich es so mache:

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.
dann stürzt scilab ab.
Das ist logisch. Scilab verlangt einen Zeiger auf ein Array von Integern. Array of PInteger ist aber ein Array von Zeigern auf Integer.

Dass "ein: PInteger" genauso funktioniert wie "var ein: Integer", liegt ja nur daran, dass mit var nur eine Referenz auf "ein" übergeben wird, also ein Zeiger auf "ein", also ein Pointer auf Integer, also PInteger ;-)

Code: Alles auswählen

procedure sequen(var ein: Integer; var aus: array of Integer); cdecl;
...
ist demnach gleichbedeutend mit:

Code: Alles auswählen

type
IntArray = array of Integer;
PIntArray = ^IntArray;
procedure sequen(ein: PInteger; aus: PIntArray); cdecl;
...
nur dass man mit der ersten Variante eben leichter arbeiten kann, weil man nicht dereferenzieren muss.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

ErnstVolker
Beiträge: 360
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Vergleich "FPC" mit "C"

Beitrag von ErnstVolker »

Was mich halt wundert ist, daß es mit der Compilereinstellung Free Pascal Dialket nicht funktionierte.

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.
Vermutlich ist genügend Speicher für die Arrays Reserviert

Sicherlich kennt Ihr Scilab bzw scicoslab_4.3. Hat schon mal jemand versucht ein Interface mit Lazarus dafür zu schreiben?
Ich wollte es versuchen über die dll's fernzusteuern. So daß man aber nix davon merkt, daß im Hintergrund mit Scilab gerechnet wird.
Die Beispiele unter \Examples sind in C++. Deshalb auch die Frage nach dem HeadConverter. Da hat mir theo ja mit dem Verweis auf h2pas geholfen.

Danke für Eure Hilfe.
Ich hab' einiges gelernt dieser Tage. :)

Volker

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Vergleich "FPC" mit "C"

Beitrag von RSE »

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.
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.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten