Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Lazarus hat erstmal garkeine Funktionen, du meinst sicher FPC . Ja, die gibt es. Die sind fest eingebaut und sollten immer verfügbar sein. Wenn sie's nicht sind, versuch mal ein {$mode objfpc} an den Anfang der Unit zu packen (obwohl das bei Verwendung von Lazarus schon da sein sollte).
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
{$mode objfpc} steht da, und ich bin grad draufgekomen, dass er SetLength, High, und Low erkennt, nicht aber Length. Da findet er mir nur eine length funktion, die ich selber definiert hab, die einen Vector nimmt. naja, und dann sagt er halt:
Code:
player.pas(96,36) Error: Incompatible type for arg no. 1: Got "Dynamic Array Of TBullet", expected "TVec4" sharkmath.pas(333,10) Hint: Found declaration: length(TVec4):Single; Register; player.pas(118,34) Error: Incompatible type for arg no. 1: Got "Dynamic Array Of LongInt", expected "TVec4" sharkmath.pas(333,10) Hint: Found declaration: length(TVec4):Single; Register; player.pas(142) Fatal: There were 2 errors compiling module, stopping
bei beiden Fehlern hab ich die Länge eines dynamischen Arrays abgefragt. Habs jetzt mal durch High ersetzt (und dann 1 draufaddiert). Funzt, und zwar genau so, wie ichs mir vorstell (oder jedenfalls sieht so aus)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Verstehe … Das sieht nach einem Compilerbug aus, wobei ich es generell vermeiden würde, Funktionen so zu nennen, wie Compilerinterne. Wenn du nichts dagegen hast, würde ich mir das mal genauer anschauen und in den FPC Bugtracker hauen, ansonsten bitte ich dich, dies selber zu tun.
greetings
//Edit: Alternativ geht es mit System.Length auf jeden Fall. Length ist bei Dynamischen Arrays besser. Wenn du ein Array of Bla (also kein separater Arraytyp) als Parameter übergibst (auch bekannt als "open array") ist High besser, aber das nur am Rande.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Wieso soll das ein Bug sein, ist in Delphi doch ganz genauso: wenn man selbst eine Function in der Unit definiert, dann verdeckt sie eigebundene Units bzw. man muss die Unit dann halt davor schreiben.
Code:
function Length: Integer; begin result := 1; end;
procedure TForm1.Button1Click(Sender: TObject); begin Caption := IntToStr(length('abc')); // Fehler: zu viele Parameter Caption := IntToStr(system.length('abc')); // funzt end;
Ist übrigens besonders lästig wenn man aus irgendeinem Grund mal Graphics und Windows in der uses-Klausel vertauscht: dann funktioniert TBitmap nicht mehr, weil dann windows.TBitmap verwendet wird statt dem Delphi-TBitmap.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, aber bei FPC ist es so, dass man implizites Overload hat. Du musst, wenn du mehrere Funktionen mit gleichem Namen deklarierst, kein Overload dahinter schreiben. Deshalb wäre das (von mir) erwartete Ergebnis, dass er sich aus allen Funktionen mit diesem Namen die mit der am besten passenden Deklaration sucht.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Achso, alles klar. Klingt für mich allerdings nur mäßig vernünftig, da Funktionen und Prozeduren ja leicht mehrdeutig werden können... und dann hat man unter umständen zig Units in denen die Funktionen stehen können, und keinen Überblick welche gerade zur Anwendung kommt... ich denke die Borländer und Embarcaderos hatten schon ihre Gründe das nicht so zu machen...
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, da gilt dann das Recht des zuletzt eingebundenen. Das ist dann genauso wie jetzt, nur, dass du keine Fehlermeldung bekommst, wenns eine passende Alternative gibt.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Die High / Length-Diskussion...warum macht es nen Unterschied, ob ich Length(xy) - 1 oder High(xy) benutze und warum ist das eine für dynamische und das andere für offene Arrays besser?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, der Unterschied ist wirklich marginal. Bei Dynamischen Arrays wird die echte Länge direkt im Speicher abgelegt, also der Rückgabewert von Length() oder High()+1. Um High zu berechnen muss dann intern -1 gerechnet werden, was du dann durch +1 wieder rückgängig machst. Genau das gleiche nur umgekehrt hast du für "open arrays". Dort wird die Länge minus 1 übergeben, also der Rückgabewert von High().
Code:
type TTest = array of Integer; // dynamisches Array; es wird Length() im Speicher abgelegt.
procedure Meow(Bla: array of Integer); // open array; es wird Length()-1 im Speicher abgelegt procedure Meep(Bla: TTest); // dynamisches Array
Im Zweifelsfall davon ausgehen, dass der Compiler das optimiert oder einfach ignorieren. Eine Addition und Subtraktion ist echt nicht viel und wird kaum ein Flaschenhals sein. Sind aber ganz interessante Details über die Interna der Sprache, wie ich finde. //Edit: Genauer gesagt, einen echten Unterschied gibts nur bei open arrays. Denn Length()-1 und High() haben für Dynamische ja den gleichen Aufwand. Nur bei open arrays ist es so, dass Length()-1 und High() einen unterschied macht. Für Length() muss dort eine Addition gemacht werden.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Lord Horazont hat geschrieben:
Naja, der Unterschied ist wirklich marginal. Bei Dynamischen Arrays wird die echte Länge direkt im Speicher abgelegt, […]
Ich muss mich korrigieren! Das trifft wohl nur auf Strings zu. Bei dynamischen Arrays wird, ebenfalls wie bei "open arrays" der maximale Index, also der Rückgabewert von High im Speicher abgelegt. Nur bei Strings ist es so, dass die echte Länge (Length()) im Speicher steht.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.