Autor Beitrag
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 20.02.03 20:25 
Du kannst ein
ausblenden Quelltext
1:
2:
3:
{$WARNING OFF}
uses Windows, Messages, ..., ShellCtrls
{$WARNING ON}

einbauen.

_________________
Ist Zeit wirklich Geld?
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 20.02.03 21:15 
Aber ich würde mich um sowas nicht kümmern. Wieso ist es (laut Elend) ein schlechter Eindruck, wenn beim kompilieren Warnungen erscheinen? Klar, initialisieren sollte man schon, aber es sind nur Warnungen. Die Sache mit dem "DEMO" und "DEMOO" finde ich viel schlimmer. Hätte man den Code überprüft, bzw beim Tippen aufgepasst, wäre es egal, ob man x erst auf 0 setzt oder nicht. Es ist höchstens interessant, wenn man den Quellcode weitergeben will, und da sind so Sachen wie "Irgendeine Unit könnte möglicherweise awoanders nicht laufen" extrem sinnvoll, und sollten nicht ausgeschaltet sein. So könnte zum Beispiel eine Unit Assembler-Code enthalten, der nur auf einem Intel-Prozessor läuft. Wäre es nicht für einen Programmierer sinnvoll zu erfahren, daß die Unit, die er sich gerade besorgt hat, nicht auf seinem Rechner läuft, weil er Amd-Anhänger ist? Oder was ist mit der "deprecated"-Warnung? Ich will doch wissen, daß eine Unit, die ich benutze, teilweise überaltert ist, bzw demnächst den Bach runter geht.
Wirklich Sorgen mache ich mir nur, wenn sich das [Warning] in ein [Error] verwandelt. Und so viele Warnings gibt's bei mir eigentlich auch nicht, da ich Variablen i.d.R. auch vorher irgendwie initialisiere, bevor ich sie benutze.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 20.02.03 21:47 
@Hansa:

Das Beispiel von Aya eignet sich nicht unbedingt, um die Nützlichkeit von exit darzustellen, weil es eben nur eine einzige Bedingung ist, die abgeprüft wird.

Stelle dir aber mal vor du hast eine Funktion AlleBedingungenErfuellt, die 20 Bedingungen abprüfen muss. Ich initialisiere in diesem Falle Result mit False und springe, sobald eine der 20 Bedingungen nicht erfüllt ist, einfach mit exit heraus. Am Ende der Prozedur setze ich Result auf True.

Anderes Beispiel: Du suchst das erste Objekt in einer Liste, das ein bestimmtes Unterobjekt hat:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function SucheObjekt(GesuchterName:String):TObjekt;
var i,j:integer;
begin
  Result:=NIL;
  for i:=0 to Objekte.Count-1 do
    for j:=0 to j do Objekte[i].UnterObjekte.Count-1 do
      if Objekte[i].UnterObjekte[j].Name=Gesucht then
      begin
        Result:=Objekte[i];
        exit;
      end;
end;


OHne die Verwendung von exit ist das schon ein wenig komplexer: Aus den For-Schleifen werden plötzlich While-Schleifen mit der zusätzlichen Bedingung "and (Result<>NIL). In der While-Schleife selbst muss dann noch die Zählervariable erhöht werden. Die einzige Alternative zu den While-Schleifen wäre das Verlassen der For-Schleifen mittels Break, wobei das auch in zusätzlichen Abprüfungen endet. Übersichtlicher wird es auf gar keinen Fall.

Cu,
Udontknow


Zuletzt bearbeitet von Udontknow am So 23.02.03 16:04, insgesamt 1-mal bearbeitet
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 20.02.03 21:49 
@ Tommie Lie: Warnungen sind sehr häufig "Zeitbomben", also Fehlerquellen, die erst zur Laufzeit sich bemerkbar machen.

Cu,
Udontknow
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 20.02.03 21:56 
schon klar.
Natürlich kann eine Systemabhängige Unit bei einigen Rechnern dazu führen, daß das Programm nicht wie erwartet läuft. Aber hier war ja wohl die frage, wie man diese "lästigen" Meldungen wegmachen kann. Und das sollte man IMHO nicht machen, sondern sie lieber da stehen lassen, damit jeder, der versucht, den Code selbst zu kompilieren merkt, daß die und die Unit nicht ganz aktuell ist, oder die und die eben nicht überall läuft.
Man kann die Meldungen zwar mit $WARNS ausschalten, sollte dies aber nicht tun. Das war meine Aussage.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 20.02.03 22:15 
Zitat:
werden plötzlich While-Schleifen mit der zusätzlichen Bedingung "and (Result<>NIL).


auf Result verzichte ich ja auch. :mrgreen: Nee, im Ernst, habe mir mal eines meiner großen Programme angeschaut, das hat über 50000 Zeilen eigenen Quelltext. Da ist kein Exit oder so was drin. Aus Erfahrung habe ich das alles eliminiert. Es geht auch anders. Wer Exit und Result benutzen will ? Ich hindere ihn nicht. Was passiert denn eigentlich, wenn ich result lokal oder global selber deklariere :?: Hmm :shock: .

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 21.02.03 10:10 
Ganz abgesehen davon, daß es nicht gerade der Lesbarkeit des Codes dienlich ist, eine Variable Result zu definieren:

Lokal kannst du es in einer Funktion nicht definieren, du erhälst einen Compilerfehler("Bezeichner redifiniert."). Global kannst du auf die Variable zugreifen, indem du explizit die Unit bzw. das Objekt angibst, wo die Variable definiert wurde:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
function TForm1.Test: Integer;
begin
  Result:=3;
  Unit1.Result:=4;
  ShowMessage(IntToStr(Result));
  ShowMessage(IntToStr(Unit1.Result));
end;


Wie jetzt, du benutzt auch nicht Result? Schreibst du keine Funktionen? Niemals? Das kann ich fast nicht glauben... :shock:

Jetzt würde mich wirklich mal interessieren, wie du mein Beispiel umsetzen würdest. Mach das bitte mal.

Cu,
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 21.02.03 11:13 
Hallo,
Aya hat folgendes geschrieben:
Was soll ich denn gegen diese Fehlermeldung machen...??
Delphi 6 hat folgendes geschrieben:
[Warning] Unit1.pas(7): Unit 'ShellCtrls' is specific to a platform


diese Warnung finde ich wiederum extrem wichtig für CLX Anwendungen. Sie weißt darauf hin wann du diese Platformunabhängigkeit verletzt.
Das darfst und musst du mitunter machen, aber dann solltest du sicherstellen, das der Entsprechende Programmteil auch nur unter dem Betriebsystem mit einkompiliert wird für den er ist:
ausblenden Quelltext
1:
2:
uses
  SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,  QDialogs, QStdCtrls, QComCtrls, QFileCtrls {$IFDEF Win32}, ShellCtrls{$ENDIF}  {$IFDEF LINUX}, CLIB{$ENDIF};


Allerdings muss ich grade feststellen das dadurch die Warnung nicht verschwindet. Auch wird sie in VCL Projekten angezeigt, wo sie meiner Meinung nach, nichts zu suchen hat. Entweder da weicht Borlands Philosophie von meiner ab oder es hat jemand beim Inplementieren dieser Warnung geschlammpt.

Gruß
Klabautermann
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 21.02.03 12:08 
Udontknow hat folgendes geschrieben:
Lokal kannst du es in einer Funktion nicht definieren, du erhälst einen Compilerfehler("Bezeichner redifiniert.").

Nicht ganz. Wenn du die bestimmte Compilerschalter setzt geht das schon da der Compiler dann keine Result Varialbe in den Code einbaut.
Udontknow hat folgendes geschrieben:
Jetzt würde mich wirklich mal interessieren, wie du mein Beispiel umsetzen würdest. Mach das bitte mal.

Eventl. so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TForm1.Test: Integer; 
begin 
  Test := 3; 

  Unit1.Result:=4; 
  ShowMessage(IntToStr(Result)); 
  ShowMessage(IntToStr(Unit1.Result)); 
end;


Gruß
TINO
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 21.02.03 12:56 
@Udontknow : Tino kam mir offenbar etwas zuvor. :D

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm1.Test: Integer;
begin
  Test:=3;
  Unit1.UnitTest:=4;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  IF Test = 0 THEN;
  ShowMessage('TEST '+IntToStr(Test));
  ShowMessage('UNIT '+IntToStr(Unit1.UnitTest));
end;


willst Du das showmessage innerhalb der Funktion :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TForm1.Test: Integer;
var t : integer;
begin
  t := 3;
  Test:=t;
  Unit1.UnitTest:=4;
  ShowMessage (IntToStr (t));
end;

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 21.02.03 15:41 
@Tino & Hansa:

Hansa schrieb:
Zitat:
Was passiert denn eigentlich, wenn ich result lokal oder global selber deklariere


Ich schrieb:
Zitat:
Lokal kannst du es in einer Funktion nicht definieren, du erhälst einen Compilerfehler("Bezeichner redifiniert.").


Tino schrieb:
Zitat:
Nicht ganz. Wenn du die bestimmte Compilerschalter setzt geht das schon da der Compiler dann keine Result Varialbe in den Code einbaut.


Oh wirklich? Wie lauten die Compilerschalter? Anyway, ohne Compilerschalter klappt es nicht. Und ihr habt irgendwie Funktionen gepostet, wo Result eben nicht lokal deklariert wird.

Aber abgesehen davon: Mit "mein Beispiel" meinte ich die Funktion SucheObjekt, die ich weiter oben gepostet hatte. Wie würdest du sie ohne exit realisieren, Hansa?

Cu,
Udontknow
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 22.02.03 22:42 
na gut, ohne EXIT, Result usw.:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
var ende,
      gefunden : boolean;
      i,
      j : integer;
      T : Tobjekt;
  
begin 
   i := 0;
   T := NIL;
   ende := false;
   gefunden := false;
   while not ende and (i < objekte.count) do  begin
       i := i + 1;
       j := 0;
       while not ende and (j < objekte.unterobjekte.count[j]) do  begin
           j := j + 1;
          gefunden := objekte[i].unterobjekte [j].name := gesucht;
          ende := gefunden;
       end;
       if gefunden then 
         SucheObjekt := objekte[i].unterobjekte [j].name;
   end;

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: So 23.02.03 16:02 
Und nochmal zum Vergleich:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function SucheObjekt(GesuchterName:String):TObjekt; 
var i,j:integer;
begin 
  Result:=NIL; 
  for i:=0 to Objekte.Count-1 do 
    for j:=0 to j do Objekte[i].UnterObjekte.Count-1 do 
      if Objekte[i].UnterObjekte[j].Name=Gesucht then 
      begin 
        Result:=Objekte[i]; 
        exit; 
      end; 
end;


Ich denke, nun ist es klar, dass das Aussenvorlassen von exit so manchen Code zum italienischen Spaghetti-Code verkommen lässt. :wink:

Cu,
Udontknow
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 23.02.03 17:20 
Udontknow hat folgendes geschrieben:
Und nochmal zum Vergleich


Vergleiche nicht Äpfel mit Birnen. Dein Code ist vielleicht etwas kürzer zum tippen, aber es geht doch darum, ob man EXIT nun braucht oder nicht. Das ist hier die Frage. Oder nicht :?: Und jetzt : braucht man das wirklich ? Übrigens : mein Code ist weder getestet, noch optimiert.

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: So 23.02.03 19:17 
Zitat:
aber es geht doch darum, ob man EXIT nun braucht oder nicht. Das ist hier die Frage


Man braucht auch keine OOP, um zu programmieren. Man braucht auch kein Delphi. Man braucht auch keinen Monitor. Lochkarten tun´s ja auch. :wink:

Es geht nicht darum, ob die Anwendung von exit obligatorisch ist oder nicht, es geht um Übersichtlichkeit, um Verständlichkeit, um Lesbarkeit von Code. Und der ist in so manchen Situationen einfach besser lesbar, wenn exit eingesetzt wird. Die Fehleranfälligkeit des Codes ist dann einfach geringer. Vergleiche doch nur mal die Anzahl der Bedingungen oder der benötigten Variablen in den Routinen.

Je weniger Codezeilen du hast, um so übersichtlicher ist dein Programm (komm mir jetzt keiner mit 20 Befehlen in einer Zeile, ihr wisst, was ich meine).

Cu,
Udontknow
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 23.02.03 19:23 
also braucht mans doch nicht unbedingt oder doch? :mrgreen: Was denn nu ? Auf 5 Zeilen mehr oder weniger kommts wohl nicht an.

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: So 23.02.03 22:11 
LOL! :)

Hansa, du bist mir einer! Ich habe nur gesagt, daß Code sehr viel übersichtlicher damit wird. In deinem vorletzten Post erklärst du "aber es geht doch darum, ob man EXIT nun braucht oder nicht". Daraufhin teilte ich dir mit, daß es nicht um "Brauchen" geht sondern um Übersichtlichkeit,
und jetzt tust du so, als hätte ich irgendwann behauptet, daß die Verwendung von exit obligatorisch wäre.

Nenene, Rethorik vom feinsten! :wink:

Also, noch einmal:

Kürzerer Code -> Übersichtlicherer Code -> geringere Fehleranfälligkeit.

Zitat:
Auf 5 Zeilen mehr oder weniger kommts wohl nicht an.

Das ist doch nur ein Beispiel. Der möglichen Komplexität sind keine Grenzen gesetzt. Dementsprechend sind auch die Einsparungen und die Steigerung der Lesbarkeit.

Cu,
Udontknow
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 24.02.03 00:09 
ich brauche ein Beispiel, daß es ohne EXIT nicht geht.

_________________
Gruß
Hansa
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 24.02.03 00:46 
hansa hat folgendes geschrieben:
ich brauche ein Beispiel, daß es ohne EXIT nicht geht.

Das gibt es nicht, da du es mit einer oder mehreren boolschen Variablen und if bzw. Break nachprogrammieren kannst. Aber ob das dann noch übersichtlich ist, sei dahingestellt.

Als Alternative kann man ja noch mit GoTo arbeiten. :lol:

_________________
Ist Zeit wirklich Geld?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 24.02.03 00:55 
AndyB hat folgendes geschrieben:
Als Alternative kann man ja noch mit GoTo arbeit


ja, das fehlt ja noch. Vorher hat sich niemand getraut, dieses Wort auszusprechen. :shock:

_________________
Gruß
Hansa