| Autor |
Beitrag |
delphianer5
      
Beiträge: 30
|
Verfasst: So 19.09.10 00:29
Hi,
ich habe ein Programm geschrieben und es treten mir unbekannte Fehlermeldungen auf, ich bin mehrmals durchgegangen, aber habe den Fehler nicht entdeckt wie das ja meistens so ist.
Ziel des Programms:
Projekt Würfeln: Man gibt die Anzahl an wie oft gewürfelt wird(über Edit Feld) und nach einem Klick auf dem Button, rechnet die Anwendung wie oft zufallsbedingt die Zahlen 1-6 gewürfelt worden sind mit Angabe der Absoluten- und der Relativen Häufigkeit in einem StringGrid.
Fehlermeldung:
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: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| unit Uwuerfel;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; Wurfzahl, i, Zufallszahl, k, spalte, zeile: integer; Abs: array [1..6] of integer; Rel: array [1..6] of real;
implementation
{$R *.dfm}
procedure Initialisierung; var i:integer; begin for i :=1 to 6 do Abs[i]:=0; for i :=1 to 6 do Rel[i]:=0; end; procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin Initialisierung; StringGrid1.Cells[0,0]:='Wurfzahl'; for i :=1 to 6 do StringGrid1[i, 0]:= IntToStr(i); StringGrid1.Cells[0,1]:='Absolute Häufigkeit'; StringGrid1.Cells[0,2]:='Relative Häufigkeit in %'; for i :=1 to 6 do StringGrid1.Cells[i,1]:=IntToStr(Abs[i]); for i :=1 to 6 do StringGrid1.Cells[i,2]:=FloatToStr(Rel[i]); end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin Initialisierung; randomize; Wurfzahl:=StrToInt(Edit1.Text); for i :=1 to Wurfzahl do begin ZufallsZahl :=random(6)+1; Abs[Zufallszahl] :=Abs[Zufallszahl]+1; end; for i :=1 to 6 do StringGrid1.Cells[i,1]:=IntToStr(Abs[i]); for i :=1 to 6 do Rel[i]:=Abs[i]/Wurfzahl*100; for i :=1 to 6 do StringGrid1.Cells[i,2]:=FloatToStr(Rel[i],ffFixed,7,2); end; procedure TForm1.Button2Click(Sender: TObject); begin close end;
end. |
Danke für eure Hilfe.
mfg
Zuletzt bearbeitet von delphianer5 am So 19.09.10 13:46, insgesamt 2-mal bearbeitet
|
|
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: So 19.09.10 01:23
Beim ersten drüberschauen fällt mir mal auf, dass da nur StringGrid1 statt StringGrid1.Cells steht
Zu viele Parameter bei FloatToStr(): da sollte es nur eine Double-Variable/Zahl geben oder?
Edit:
korrektur, es gibt 2 FloatToStrings, aber höchsens 2 Parameter:
Delphi-Quelltext 1: 2: 3:
| function FloatToStr(Value: Extended): string; overload; function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string; overload; |
Außerdem nimmt Delphi kein Komma (",") als abgrenzung von Kommazahlen sondern das Englische System: Punkte(".") also
dt.: 3,141592653589793238462643383
eng.: 3.141592653589793238462643383
Für diesen Beitrag haben gedankt: delphianer5
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 19.09.10 01:27
Morgen
[Mist, zu spät] -> Hier stand mal was
Sonst noch falsch: (Edit in bold)
*Vor nicht-Lokale Variablen sollte immer ein Buchstabe(z.B. F wie Feld vor Variablen einer Klasse, wie unten, oder ein a vor lokale). Das hat den Hintergrund, dass Bezeichner ohne Buchstabe davor für Prozeduren und Funktionen reserviert sind. Z.B. ist dein Variablenname 'Abs' bereits die Funktion Absolute Value, die einer Zahl ihren Betrag zuordnet.
*Du verwendest zu viele globale Variablen(wobei man eigentlich generell gar keine braucht).
*i und k sind Schleifenvariablen, die global zu verwenden kann böse enden.
*Außerdem deklarierst du i einmal global und mehrmals lokal. 2 geht, aber nicht mit 1 zusammen. Beschwert sich der Compiler nicht?
*Wurfzahl und Zufallszahl sollten lokale Variablen von Button1Click sein, zeile, spalte und k sehe ich nicht verwendet.
*Randomize muss von der Funktion her eigentlich nur einmal in's FormCreate, danach sind alle erzeugten Zahlen zugesichert zufällig(und zwar nicht so, vor dem ersten Randomize ist der Seed nämlich nicht initialisiert. D.h., die Zahlenfolge bei mehrmaligem Random-Aufruf ist immer gleich ohne Randomize).
*Standard ist eigentlich CamelCase, d.h. uWuerfel oder UWuerfel statt Uwuerfel.
*Und natürlich darfst du deine Komponenten auch gerne benennen  (Button1, Stringgrid1, ..). Das machst du im Object Inspector.
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: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| unit uWuerfel;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private FAbs: array [1..6] of integer; FRel: array [1..6] of real; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure Initialisierung; var i: Integer; begin for i := 1 to 6 do begin FAbs[i] := 0; FRel[i] := 0; end; end;
procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin Initialisierung; StringGrid1.Cells[0,0] := 'Wurfzahl'; StringGrid1.Cells[0,1] := 'Absolute Häufigkeit'; StringGrid1.Cells[0,2] := 'Relative Häufigkeit in %'; for i :=1 to 6 do begin StringGrid1[i, 0] := IntToStr(i); StringGrid1.Cells[i,1] := IntToStr(FAbs[i]); StringGrid1.Cells[i,2] := FloatToStr(FRel[i]); end; end;
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; Wurfzahl, Zufallszahl: Integer; begin Initialisierung; Randomize; Wurfzahl := StrToInt(Edit1.Text); for i := 1 to Wurfzahl do begin ZufallsZahl := Random(6) + 1; FAbs[Zufallszahl] := FAbs[Zufallszahl] + 1; end; for i := 1 to 6 do begin StringGrid1.Cells[i,1] := IntToStr(FAbs[i]); FRel[i] := FAbs[i] * 100 / Wurfzahl; StringGrid1.Cells[i,2] := FloatToStr(FRel[i],ffFixed,7,2); end; end;
procedure TForm1.Button2Click(Sender: TObject); begin Close; end;
end. |
PS: Du hast sehr vieles richtig gemacht, dein Post ist sehr ordentlich  Jetzt nur noch den Quelltext einrücken und einen vielsagenderen Titel wählen 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am So 19.09.10 11:20, insgesamt 3-mal bearbeitet
Für diesen Beitrag haben gedankt: delphianer5
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: So 19.09.10 05:58
Es gibt da aber noch die Funktion FloatToStrF(), die mit den benutzten Parametern arbeitet.

_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
Für diesen Beitrag haben gedankt: delphianer5
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.09.10 11:26
Hallo!
Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Delphi-Forum.de Richtlinien:
| Richtlinien: | 1.2 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]
|
Einfach oben bei Deinem ersten Beitrag auf "Edit" klicken und den Titel ändern. Dank Dir!
Grüße
BenBE 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
delphianer5 
      
Beiträge: 30
|
Verfasst: So 19.09.10 14:27
Danke an alle für eure Hilfe!Habe euch mal "gedankt".
@Georg08: Mega Danke! Genau das hatte ich gemeint, ich hätte da Stunden drauf starren können und hätte das nie gesehen^^
Danke für deinen Auszug aus der Hilfe, aber ich verstehe nicht was du damit meinst.
Hmm, mein Infolehrer macht das mit Komma und delphi beschwert sich auch nicht - vlt. Deutsche Version oder so?
@Hidden: Danke für deine ausführliche Hilfe. Bin für jeden Tipp in Stil Schreibweise etc dankbar. Hab das alles umgesetzt.
@MaPsTaR: Kannst du mir bitte ausführlicher erklären was diese Funktion tut?Verstehe den Sinn nicht, soll ja eig. nur konvertiert werden.
@BenBE:Gestern Abend viel mir einfach nichts besseres ein,sry. So besser?
[u]Noch eine Frage an alle:/[u]
Problem: Wenn man eine StringGrid-Komponente aufs Fenster zieht, werden ja nur 5 Spalten und Zeilen angezeigt. Wir hatte ein Projekt geschrieben 1mal1 wo man die Obergrenze der zu multiplizieren Zahlen eingegeben werden konnte und da konnte man unten und rechts den Auschnitt des StringGrid verschieben, so das man alle Spalten/Zeilen sehen konnte.
Jetzt wir jedoch nur die Spalten 1-4 angezeigt, aber ich möchte auch die Felder für die 5 und die 6 haben.
Wie schaffe ich das?
Bild(weil bestimmt keiner versteht was ich meine, bei der Beschreibung^^):
Danke!
mfg
|
|
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: So 19.09.10 14:48
Relativ leicht:
Schau dir mal im Objektinspektor die Eigenschaften ColCount und RowCount an^^
ColCount: Spaltenanzahl
RowCount: Zeilenanzahl
Also für dich
Delphi-Quelltext 1: 2: 3: 4: 5:
| StringGrid1.ColCount := 6; StringGrid1.RowCount := 3 |
Für diesen Beitrag haben gedankt: delphianer5
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 19.09.10 14:51
Für diesen Beitrag haben gedankt: delphianer5
|
|
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: So 19.09.10 14:53
@ BenBE Danke
Habe die erste vergessen 
|
|
delphianer5 
      
Beiträge: 30
|
Verfasst: So 19.09.10 16:41
Danke,perfekt!
Hier bekommt man recht flott Hilfe!
|
|
|