Entwickler-Ecke

Sonstiges (Delphi) - fehler im quelltext und case of


Sanne - Mo 16.12.02 19:07
Titel: fehler im quelltext und case of
hallo hab da mal wieder n problem.... :?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
procedure TForm1.Button2Click(Sender: TObject);
var
n,x,z,y: extended;
groesse:       integer;
begin
n:=7;
x:=power(2,7);
z:=8;
repeat

      repeat
      z:=z-1;
      n:=n-1;
      y := x + Power(2, n);
      x:=y;
      until
      y>groesse;


      if y>groesse then
      y:=y-power(2,n);
      repeat
      n:=n-1;
      y:=y+power(2,(n-1));
      until
      y<=groesse;
      x:=y ;

until
y=groesse;
end;

var
z: integer;
shape9,shape10,shape11,shape12,shape13,shape14,shape15,shape16: TShape;
begin
case z of 7: shape9.visible:=true;
else
case z of 6:shape10.visible:=true;
else
case z of 5:shape11.visible:=true;
else
case z of 4:shape12.visible:=true;
else
case z of 3:shape13.visible:=true;
else
case z of 2:shape14.visible:=true;
else
case z of 1:shape15.visible:=true;
else
case z of 0:shape16.visible:=true;
else
end;

bis zur case of- schleife sollte es eigentlich funktionieren- aber manchmal gibt er ne warnung aus- von wegen "variable 'groesse' wurde wahrscheinlich nicht initialisiert"
die groesse wurde vorher durch einen zufallsgenerator festgelegt... ist also bekannt
zum anderen soll ich mit dieser berechnung herausfinden welche shapes- 9-15 ich sichtbar machen soll- kenn mich da aber wirklich nicht so aus
vielleicht habt ihr ja tips
die shapes werden dann auch noch an eine andere position geschoben- aber das ist ein anderes problem


Sanne - Mo 16.12.02 19:50

nachtrag:

vielleicht sollte ich noch beschreiben was das komplette programm machen soll und was dieser teil dann macht

also ich soll eine bmp mit einer person drauf laden- das geht schon :D
dann muß ich dieser person durch einen zufallsgenerator eine größe zuweisen und gleichzeitig die bildhöhe dementsprechend verändern- geht auch schon :D
jetzt kommt der teil den ihr vorliegen habt
nun soll die größe mit 8 shapes mit den höhen 1 2 4 8 16 32 64 128 veranschaulicht werden in dem man alle shapes aufeinanderstapelt und mit der größ-möglichen beginnt- das ganze neben der bmp- am ende soll dann der stapel genauso hoch sein wie die bmp

ich hab in dem quelltext den ihr habt erstmal ausgerechnet welche shapes verwendet werden müssen- das ist dann die variable z
die shapes sind definiert durch 2^n
und y ist die variable für die höhe

vielleicht ist es so verständlicher


Wolff68 - Mo 16.12.02 20:56

Also mal unabhängig was Dein Programm machen soll, zu Deinen 2 Problemen:

1. Die Variable Größe wird in der Procedure erstellt (var groesse : Integer)
Danach Willst Du wissen ob was größer ist als groesse. Nur sagst Du nirgends wie groß denn groesse eigentlich ist ! Und genau das meckert der Compiler. Mit nicht initialisiert meint der Compiler, daß da nie ein Wert zugewiesen wurde.

2. Schau Dir doch nochmal die Syntax von einem Case-Block an.
der sollte eher so aussehen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case z of 
  7: shape9.visible:=true; 
  6:shape10.visible:=true; 
  5:shape11.visible:=true; 
  4:shape12.visible:=true; 
  3:shape13.visible:=true; 
  2:shape14.visible:=true; 
  1:shape15.visible:=true; 
  else //Wenn z was anderes ist
    ShowMessage('Z war ausserhalb';
end;
(ungetestet)
Das ist da das schöne am case. Man braucht wesentlich weniger schreiben!


Sanne - Mo 16.12.02 22:03

wie kann ich denn dann genau an der stelle der größe, die zahl zuweisen die ich 3 prozeduren weiter vorne ausgerechnet habe????
genau das gleiche gilt für z- merkt der compiler sich die zahlen von z oder wie läuft das?


Aya - Di 17.12.02 06:30

Hi,

mach die Variablen z und größe einfach Global.. also schreib sie oben unter den Var-Block wo auch Form1: TForm steht :)

Dann merkt er sie sich, egal in welcher Procedure sie verwendet werden (natürlich darf es die Variable dann in der Procedur nich nochmal geben)

Au'revoir,
Aya~


Wolff68 - Di 17.12.02 23:22

@Aya: Tip: Ich würde eher empfehlen die 'globale' Variable im privat oder public-Teil der Form zu erstellen.
Das hat so viel ich weis Vorteile bei der Speicherung (nich im Heap) und ausserdem kann man auf Variablen, die im public-Bereich angelegt werden auch von anderen Units aus zugreifen.

Übrigends: Die Variable darf in einer procedure oder function durchaus nochmal vergeben werden. Nur überdeckt (nicht überschreibt) diese dann die globale Variable, was zu absolut genialen Verwirrungen und Haareraufen bei der Fehlersuche führt 8)
Im Prinzip hast Du daher recht: Nicht nochmal verwenden!
Besonders, weil der Compiler keinen Fehler oder Warnung ausspricht, weil es ja eigentlich legitim ist...