Hallo,
hier schon das nächste Problem:
Gibt es eine Möglichkeit, per IF-Schleife abzufragen, ob einer Integer-Variable bereits ein Wert zugewiesen wurde?
Etwa so (wenn’s ein string wäre)
IF v ‚‘ THEN …
Grüße
Manuel
Hallo,
hier schon das nächste Problem:
Gibt es eine Möglichkeit, per IF-Schleife abzufragen, ob einer Integer-Variable bereits ein Wert zugewiesen wurde?
Etwa so (wenn’s ein string wäre)
IF v ‚‘ THEN …
Grüße
Manuel
Nö, das ist auch ganz schlampiger Programmierstil, der in modernen Sprachen wie C# auch gar nicht mehr zugelassen ist.
Das Problem: Der Compiler reserviert für Deine Variable irgendwelchen Speicher der gerade frei ist. Das Betriebssystem teilt Deinem Programm zur Laufzeit *irgendeinen* Speicherblock einfach zu, macht damit aber nichts. Es ist somit unmöglich zu bestimmen, was für Daten da zuvor zuvällig gespeichert waren (es müssen ja vorher noch nicht mal Integer-Daten gewesen sein). In Delphi werden (wohl aus performance-Gründen) lokale Variablen daher nicht initialisiert, das musst du selber machen, kostet ja auch höchstens ein CPU-Cycle
Globale Variablen und Member von Klassen werden mit 0 initialisiert.
Fazit: Bei lokalen musst Du also selbst schnell v := 0; setzen, zumindest wenn Du mit dieser Variable irgendwelche Berechnungen machen willst, die einen Initialwert brauchen. Wenn die Variable eh von einer Funktion gesetzt wird, braucht’s das nicht…
Roger
Problematischerweise geht 0 in diesem Fall nicht, weil die 0 ein häufiger Wert ist. Ich hab stattdessen mal 32767 oder so genommen (was auch immer die letzte Zahl im Integer-Bereich ist), weil die nicht auftreten sollte…
Grüße und Danke
Manuel
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Problematischerweise geht 0 in diesem Fall nicht, weil die 0
ein häufiger Wert ist. Ich hab stattdessen mal 32767 oder so
genommen (was auch immer die letzte Zahl im Integer-Bereich
ist), weil die nicht auftreten sollte…
Das ist natürlich ebenfalls zulässig. Der effektive höchstmögliche Wert einer Integer-Variable hängt von Compiiler und Platform ab (16/32 bit)
Die Konstante MaxInt sollte diesen Wert für alle (mir bekannten) Pascal-Compiler/inkl. Delphi zurückliefern.
Hallo,
mich würde mal interessieren, unter welchen Umständen man das brauchen soll.
Gruß, Niels
Das war eine 2dimensionales Array, das die Entfernungen zwischen Städten speichern sollte. Da ja aber die entfernung zwischen 5 und 1, und der zwischen 1 und 5 dasselbe ist, wollte ich ihn überprüfen lassen, ob im „Gegenteil“ bereits ein Wert steht, den er übernehmen könnte. Jetzt lasse ich ihn eben überprüfen ob was anderes als 32767 drinsteht…
Grüße
Manuel
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo,
Wenn du die Unit „Math“ hast (ist, glaube ich, bei der Prof. Version dabei), kannst du die erweiterten Register-Flags für Fließkomma-Zahlen nutzen und Werte auf „NaN“, „+Inf“, „-Inf“ und ich glaube auch auf „NA“ setzen (vlnr: „not a number“, „positive infinity“, „negative infinity“, „not available“). Dann könntest du zB. nicht-vorhandene Werte im Array auf „NA“ setzen.
LG
Jochen
Hallo,
Das war eine 2dimensionales Array, das die Entfernungen
zwischen Städten speichern sollte. Da ja aber die entfernung
zwischen 5 und 1, und der zwischen 1 und 5 dasselbe ist,
wollte ich ihn überprüfen lassen, ob im „Gegenteil“ bereits
ein Wert steht, den er übernehmen könnte. Jetzt lasse ich ihn
eben überprüfen ob was anderes als 32767 drinsteht…
wie wäre es mit der Verwendung von -1 o.ä. Ich gehe mal davon aus, dass es zwischen Städten keine negativen Entfernungen gibt.
Es sei denn du verwendest nicht SmallInt sondern Word. Dann nimmst du aber besser 65535.
Oder hast du den Array als „Integer“ deklariert. Das entspricht auf 32-Bit Maschinen einem 32-Bit-Integer (= LongInt) und dessen Maximalwert ist 2147483647. Das wäre bei Größeren Arrays natürlich Platzverschwendung.
Abgesehen davon würde ich ohnehin nicht für Hin- und Rückrichtung Speicherplatz vorsehen. Du speicherst einfach im Array an der Position
MyArray[max(Index1, Index2), min(Index1, Index2)]
unter diesen Bedingungen brauchst du dann nicht einmal ein quadratisches Array sondern kannst ein dreieckiges Array verwenden. damit sparst du fast die Hälfte der Arraygröße ein.
Gruß, Niels