Entwickler-Ecke

Sonstiges (Delphi) - ganz viele fehler im quelltext


Sanne - Mi 18.12.02 22:25
Titel: ganz viele fehler im quelltext

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:
54:
var
groesse:                          integer;
aktgroesse:                       integer;
scheibe:                          array of tshape;
i:                                longint;
scheibe1,scheibe2,scheibe3,scheibe4,scheibe5,scheibe6,scheibe7,scheibe0:    integer ;
begin
DBcheckbox1.checked:=false;
DBcheckbox2.checked:=false;
DBcheckbox3.checked:=false;
DBcheckbox4.checked:=false;
DBcheckbox5.checked:=false;
DBcheckbox6.checked:=false;
DBcheckbox7.checked:=false;
DBcheckbox8.checked:=false;

scheibe7:=128;
scheibe6:=64;
scheibe5:=32;
scheibe4:=16;
scheibe3:=8;
scheibe2:=4;
scheibe1:=2;
scheibe0:=1;

groesse:=strtoint(label9.caption);

aktgroesse:=0;
i:=7;

begin

repeat
aktgroesse:=aktgroesse+scheibe[i];
if groesse<aktgroesse then
aktgroesse:=aktgroesse-scheibe[i];
dec[i];
until i<0;

ok:=groesse>aktgroesse;
if ok then

      case i of
      1:DBcheckbox1.checked:=true;
      2:DBcheckbox2.checked:=true;
      3:DBcheckbox3.checked:=true;
      4:DBcheckbox4.checked:=true;
      5:DBcheckbox5.checked:=true;
      6:DBcheckbox6.checked:=true;
      7:DBcheckbox7.checked:=true;
      8:DBcheckbox8.checked:=true;
      end;
end;
end;


das ist der quelltext wie ihn mir mein prof gestern gegeben hat- ich denke das hauptproblem liegt an dem blöden dec und den eckigen klammern- kann mir irgendwie nicht vorstellen daß der quelltext einigermaßen funktionieren könnte- aber vielleicht wißt ihr das besser
auf jeden fall werden mir zig fehler angezeigt und ich weiß überhaupt nicht mehr was ich machen soll :(


Alibi - Mi 18.12.02 22:31
Titel: Re: ganz viele fehler im quelltext

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:
var
groesse:                          integer;
aktgroesse:                       integer;
scheibe:                          array of tshape;
i:                                longint;
scheibe: array[0..7] of   integer ;
begin
DBcheckbox1.checked:=false;
DBcheckbox2.checked:=false;
DBcheckbox3.checked:=false;
DBcheckbox4.checked:=false;
DBcheckbox5.checked:=false;
DBcheckbox6.checked:=false;
DBcheckbox7.checked:=false;
DBcheckbox8.checked:=false;

scheibe7:=128;
scheibe6:=64;
scheibe5:=32;
scheibe4:=16;
scheibe3:=8;
scheibe2:=4;
scheibe1:=2;
scheibe0:=1;

groesse:=strtoint(label9.caption);

aktgroesse:=0;
i:=7;

repeat
aktgroesse:=aktgroesse+scheibe[i];
if groesse<aktgroesse then
aktgroesse:=aktgroesse-scheibe[i];
dec(i);
until i<0;

if groesse>aktgroesse then

      case i of
      1:DBcheckbox1.checked:=true;
      2:DBcheckbox2.checked:=true;
      3:DBcheckbox3.checked:=true;
      4:DBcheckbox4.checked:=true;
      5:DBcheckbox5.checked:=true;
      6:DBcheckbox6.checked:=true;
      7:DBcheckbox7.checked:=true;
      8:DBcheckbox8.checked:=true;
      end;
end;

Das Gröbste müsste raus sein.


Delete - Mi 18.12.02 22:32

Wie lauten die Fehlermeldungen (mit Zeilenangabe)?. Was soll das Programm machen? Was soll in diesem Code-Abschnitt passieren? Kannst du es irgendwo hochladen mit Sourcen?


Sanne - Mi 18.12.02 22:36

ich probiers mal kurz so aus... dann sag ich dir mehr- danke


Wolff68 - Mi 18.12.02 22:39

Also nur mal überflogen.

Folgende Fehler bzw Unsinnigkeiten:

1. Das Begin vor dem repeat brauchst Du nicht. Und dann natürlich auch nicht das dazugehörige end;

2. Der Ausdruck Scheibe[i] ist für den Zugriff auf eine Array-Variable.
Scheibe ist aber kein Array, sondern einzelne Variablen Scheibe1, Scheibe2,...

Vorschlag: Definiere Scheibe als Array.
var Scheibe : Array[0..7] of Integer;
Dann musst Du aber auch die Zuweisungen ändern in Scheibe[1] := 2; usw. Dafür funktioniert dann aber das mit Scheibe[i].

3. Dec[i] muß definitiv mit runden Klammern geschrieben werden.

4. Wird nach verlassen der repeat..until Schleife i immer kleiner 0 sein.
Was also erwartest Du für Werte im case i of?


Sanne - Mi 18.12.02 22:40


Quelltext
1:
scheibe: array[0..7] of   integer ;                    

Bezeichner redefiniert

sonst müßte es passe- ist der einzige fehler den der noch anzeigt


Wolff68 - Mi 18.12.02 22:45

Hast Du Scheibe schonmal definiert? Vielleicht als Globale Variable?


Jack Falworth - Mi 18.12.02 22:45

Die Variablen Scheibe1 bis Scheibe0 löschen und nur das Array stehen lassen, dann klappts.


MfG

Jack Falworth


Sanne - Mi 18.12.02 22:50

bin irgendwie total überfragt- hab echt keinen plan- jetzt sieht das ganze so aus:


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:
var
groesse:                          integer;
aktgroesse:                       integer;
i:                                longint;
scheibe: array[0..7] of   integer ;
ok:      integer;
begin
DBcheckbox1.checked:=false;
DBcheckbox2.checked:=false;
DBcheckbox3.checked:=false;
DBcheckbox4.checked:=false;
DBcheckbox5.checked:=false;
DBcheckbox6.checked:=false;
DBcheckbox7.checked:=false;
DBcheckbox8.checked:=false;

scheibe[7]:=128;
scheibe[6]:=64;
scheibe[5]:=32;
scheibe[4]:=16;
scheibe[3]:=8;
scheibe[2]:=4;
scheibe[1]:=2;
scheibe[0]:=1;

groesse:=strtoint(label9.caption); 

aktgroesse:=0; 
i:=7;

repeat
aktgroesse:=aktgroesse+scheibe[i]; 
if groesse<aktgroesse then
aktgroesse:=aktgroesse-scheibe[i]; 
dec(i);
until i<0; 

ok:=groesse>aktgroesse;
if ok then 
      case i of
      1:DBcheckbox1.checked:=true;
      2:DBcheckbox2.checked:=true; 
      3:DBcheckbox3.checked:=true;
      4:DBcheckbox4.checked:=true; 
      5:DBcheckbox5.checked:=true;
      6:DBcheckbox6.checked:=true; 
      7:DBcheckbox7.checked:=true;
      8:DBcheckbox8.checked:=true; 
      end;
end;

hab noch das mit dem ok reingebracht....


Delete - Mi 18.12.02 22:52


Quelltext
1:
scheibe: array of TShape;                    

Da hat sie die Scheiben schon mal deklariert.

Vorschlag:

Quelltext
1:
2:
shScheibe: array of TShape;
intScheibe: array[0..6] of Integer;


Sanne - Mi 18.12.02 22:52

und jetzt geht gar nichts mehr- er meckert beim ok das integer und boolean nicht zusammenpassen- daß der ausdruck boolean sein muß...
ich mag nimmer :(


Sanne - Mi 18.12.02 22:54

muß ich denn beides schrieben oder kann ich einfach das
scheibe: array of tshape;
löschen?


Delete - Mi 18.12.02 22:57


Quelltext
1:
2:
ok:=groesse>aktgroesse; 
if ok then


OK ist ein Integer, du machst ja auch einen Vergleich, der so in Ordnung ist, nur eine if-Abfrage kann nur wahr/falsch sein. Und wenn OK den Wert 10 hat, wie soll denn dann if entscheiden ob es wahr oder falsch ist?
Folgendes geht dann natürlich wieder:

Quelltext
1:
if ok < 999 then                    

Sollte es tun. Oder je nach dem was passieren soll, könnte ich mir auch das vorstellen:

Quelltext
1:
if groesse > aktgroesse then                    


Wolff68 - Mi 18.12.02 23:00

Also zumindest innerhalb des geposteten Qodes benützt Du das Scheibe nicht als TShape.
Somit können wir nur raten.
Aber dann nenne doch das Scheibenarray für den Integer einfach um in Scheibengroesse : Array[0..7] of integer;
Du darfst eben jeden Variablennamen nur einmal verwenden.
Klar, sonst weis er ja nicht, ob Du nun das Schape oder die Zahl willst...


Sanne - Mi 18.12.02 23:01

ist dann ok boolean und nicht integer oder was? jetzt blick ich gar nichts mehr


Sanne - Mi 18.12.02 23:03

jetzt klappts...


Sanne - Mi 18.12.02 23:06

aber jetzt hab ich noch folgendes problem
die checkboxes machen nichts.... bei jedem i bei dem groesse>aktgroesse ist sollte die dazugehörige checkbox aktiviert werden.... macht´s aber nicht :(


Wolff68 - Mi 18.12.02 23:06

Bleibt nur noch die rage was Du in der case abfrage abfragen willst.
i wird zu diesem Zeitpunkt wohl immer kleiner 0 sein. Also niemals zwischen 1 und 8...

Was hast denn damit vor? Irgendeinen Zusand visualisieren?


Sanne - Mi 18.12.02 23:11

ja genau das.... er soll anzeigen welche scheiben er in der rechnung verwendet hat- die für groesse>aktgroesse gelten
also zb. scheibe1, scheibe 3, scheibe 4 und scheibe 7- dann soll dementsprechend die checkbox 1, 3, 4 und 7 aktiviert werden


Wolff68 - Mi 18.12.02 23:14

Dann musst Du die Checkboxen innerhalb der Schleife setzen.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
repeat
  aktgroesse:=aktgroesse+scheibe[i];
  TDBcheckbox(FindComponent('DBcheckbox' + IntToStr(i))).checked := true;
  if groesse<aktgroesse then begin
    aktgroesse:=aktgroesse-scheibe[i];
    TDBcheckbox(FindComponent('DBcheckbox' + IntToStr(i))).checked := false;
  end;
  dec(i);
until i<0;

Ist aber auf die schnelle ungetestet.


Sanne - Mi 18.12.02 23:28

seh ich das richtig daß ich nur 2 zeilen einsetzten muß- oder?
also dann zeigt er "zugriffsverletzung......blablabla" an....
... warum kann das nicht einfach klappen? :(


Wolff68 - Mi 18.12.02 23:40

Also normalerweise ist das mit eben diesen 2 Zeilen getan. Den Case-Block brauchst nicht.

Wie gesagt war das ungetestet. Vielleicht hab ich mich auch irgendwo verschrieben. Um es selber zu testen müsste ich schon die ganze prozedur in ein eigenes Form packen, die Checkboxen drauf usw.

Ich werd jetzt aber für Heute schlußmachen. Muß morgen um halb 5 raus. :(
Vielleicht ist noch jemand da, der das klärt.

Viel Glück noch.


Sanne - Mi 18.12.02 23:43

danke trotzdem hast mir wahnsinnig geholfen- echt!
schlaf gut