AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

array[1..10] auf Wert prüfen?

Ein Thema von MicMic · begonnen am 9. Aug 2018 · letzter Beitrag vom 9. Dez 2018
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.533 Beiträge
 
Delphi 12 Athens
 
#1

AW: array[1..10] auf Wert prüfen?

  Alt 12. Aug 2018, 01:01
Auf was Result wohl steht, wenn das Array leer ist?

Und per Definition sind Array-Variablen außerhalb der Schleife ungültig/undefiniert, unabhänbgig davon ob das manchmal/oftmals nicht so ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#2

AW: array[1..10] auf Wert prüfen?

  Alt 12. Aug 2018, 15:38
Auf was Result wohl steht, wenn das Array leer ist?
Dann ist der Rückgabewert undefiniert. Was Allerdings ja nicht sein kann, da das Array ja bei ihm angeblich immer 10 hat. Aber selbst wenn nicht, was soll denn in so einem Fall korrekterweise widergegeben werden?
True , weil es kein False gibt oder False , weil es kein True gibt? Wenn du das entschieden hast, kannst du ja dann noch eine Initializierung unten vornehmen. Oder, wohl noch besser, vorher auf Length(AArray <> 0) prüfen und ansonsten eine Fehlermeldung ausgeben.

Und per Definition sind Array-Variablen außerhalb der Schleife ungültig/undefiniert, unabhänbgig davon ob das manchmal/oftmals nicht so ist.
Nö, außerhalb der Schleife sind es normale lokale Variablen. Bei for kann es allerdings passieren, dass sie nicht initialisiert wurden. Das passiert immer genau dann, wenn sie nicht ein einziges mal durchlaufen wurde. Ansonsten hält sie immer den Wert des letzten Durchlaufs (check after loop).
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.533 Beiträge
 
Delphi 12 Athens
 
#3

AW: array[1..10] auf Wert prüfen?

  Alt 12. Aug 2018, 15:56
Der Witz ist, dass der Compiler die Zählvariable optimieren kann und aus eimen for i := 1 to 11 do intern schonmal zu einem for i := 10 downto 0 do wird.
Innerhalb der Schleife würde das beim Zugriff auf diese Variable wieder umgegreht, falls diese Variable überhaupt ausgelesen wird, aber nach der Schleife bleibt i eventuell bei 0 oder sogar -1 stehen, was man versteht, da das INC/DEC vor der Abbruchbedingung liegen könnte und der Vergleich mit 0 kürzeren optimaleren Prozessor-Code erzeugt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Aug 2018 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#4

AW: array[1..10] auf Wert prüfen?

  Alt 12. Aug 2018, 20:55
Der Witz ist, dass der Compiler die Zählvariable optimieren kann und aus eimen for i := 1 to 11 do intern schonmal zu einem for i := 10 downto 0 do wird.
Innerhalb der Schleife würde das beim Zugriff auf diese Variable wieder umgegreht, falls diese Variable überhaupt ausgelesen wird, aber nach der Schleife bleibt i eventuell bei 0 oder sogar -1 stehen, was man versteht, da das INC/DEC vor der Abbruchbedingung liegen könnte und der Vergleich mit 0 kürzeren optimaleren Prozessor-Code erzeugt.
Was zwar sein kann (ist mir zwar noch nicht unter gekommen, aber das Gerücht habe ich auch schonmal gehört), allerdings ist es für for in -Schleifen ja eh völlig egal, in welcher Reihfolge diese ausgeführt werden. Du kannst ja mal meinen Code durchgehen unter der Prämisse, dass eine for in -Schleife immer Rückwärts ausgeführt werden würde, und wirst feststellen, dass es am Ergebnis und der Funktionalität der Routine absolut gar nichts ändert.
Dennis
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
496 Beiträge
 
Delphi 12 Athens
 
#5

AW: array[1..10] auf Wert prüfen?

  Alt 12. Aug 2018, 21:04
Aber wenn es dich so krass stört, die Ergebnisvariable als Schleifenvariable zu verwenden, dann bitte...

Delphi-Quellcode:
function AssertArray(AArray: TArray<Boolean>): Boolean;
var
  Current: Boolean;
begin
  for Current in AArray do
  begin
    if not Current then
    begin
      Exit(False);
    end;
  end;
  Result := True;
end;
Dennis
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: array[1..10] auf Wert prüfen?

  Alt 13. Aug 2018, 06:43
Hallo,
Zitat:
Innerhalb der Schleife würde das beim Zugriff auf diese Variable wieder umgegreht, falls diese Variable überhaupt ausgelesen wird, aber nach der Schleife bleibt i eventuell bei 0 oder sogar -1 stehen, was man versteht, da das INC/DEC vor der Abbruchbedingung liegen könnte und der Vergleich mit 0 kürzeren optimaleren Prozessor-Code erzeugt.
Das ist nicht ganz korrekt.
Wenn die Schleifenvariable innerhalb der Schleife nicht benutzt wird, optimiert das der Compiler,
weil ein Compare mit 0 als Endergebnis der Schleifenvariable schneller ist.

Wird die Schleifenvariable innerhalb der Schleife benutzt, zählt der "Compiler richtig".

Und eine Schleifenvariable darf eh nicht außerhalb der Schleife benutzt werden.
Das bringt auch hoffentlich eine Compilerwarnung, wenn es trotzdem versucht wird.
Heiko

Geändert von hoika (13. Aug 2018 um 06:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: array[1..10] auf Wert prüfen?

  Alt 13. Aug 2018, 09:46
Und eine Schleifenvariable darf eh nicht außerhalb der Schleife benutzt werden.
Das bringt auch hoffentlich eine Compilerwarnung, wenn es trotzdem versucht wird.
Unglücklich formuliert:
Delphi-Quellcode:
var i : integer;
  text:string;
begin
  text:='';
  for i:=1 to 7 do
    text:=text+'m';
  for i:=1 to 5 do
    text:=text+'n';
  //showmessage(text+inttostr(i));
das funktoniert ohne Warnung

während das
Delphi-Quellcode:
var i : integer;
  text:string;
begin
  text:='';
  for i:=1 to 7 do
    text:=text+'m';
  for i:=1 to 5 do
    text:=text+'n';
  showmessage(text+inttostr(i));
eine Warnung nach sich zieht.

[Warnung] Unit1.pas(35): FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein

Also eher "der Zugriff auf die Schleifenvariable ohne erneut einen Wert zugewiesen zu haben"

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: array[1..10] auf Wert prüfen?

  Alt 13. Aug 2018, 18:21
Hallo,
warum sollte Dein erstes Code-Stück eine Warnung erzeugen?

Zitat:
Also eher "der Zugriff auf die Schleifenvariable ohne erneut einen Wert zugewiesen zu haben"
Jein, die Schleifenvariable steht meistens in einem Register (ax,eax usw.).
Dieser Registerinhalt kann nach "einer Weile" Code hinter der Schleife einfach einen anderen Wert haben.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz