Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 15:34

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SetLength?
BeitragVerfasst: So Sep 12, 2010 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Hai

mal wieder ne Anfängerfrage von mir

Gibts in Lazarus Length, SetLength, High, Low? Wenn ja, in welcher Unit? Wenn nein, welche Funktionen kann ich stattdessen benutzen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 13:25 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
{$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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 14:59 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 16:51 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 16:54 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 17:04 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 17:05 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 17:39 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 17:57 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: So Sep 12, 2010 19:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
wenn man selbst eine Function in der Unit definiert
Ist aber in einer anderen Unit.

Zitat:
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.
Ähm... kann sein, dass ich einfach nur dumm bin, aber ich versteh grad gar nicht, was das heißt. Bitte nochmal erklären.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: Mo Sep 13, 2010 19:51 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SetLength?
BeitragVerfasst: Di Sep 14, 2010 06:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Na bei Strings fangen die indices doch bei 1 an. Ist also sowieso length = high.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 18 Queries | GZIP : On ]