Autor |
Beitrag |
mic7
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 08.12.04 14:01
es werden 1 bis 6 zahlenwerte(integer) in eine listbox eingetragen.. habe zwei schleifen, nur weiß ich nicht wie ich meine einträge aus der listbox initialisiere ..damit ich dann meine abfragen machen kann... habe immer inkompatible typen
?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 08.12.04 14:08
Zeig mal den Source, wo du die Fehlermeldung bekommst. Ich vermute, dass du Integer mit String vergleichst. Also musst du eins von beiden wandeln.
|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 08.12.04 14:40
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var R : array[1..6] of integer;
.. else begin for k:=1 to 6 do for i:=1 to 6 do begin R[k]:= listbox1.items.strings[i]; anz:=ListBox1.items.count-1; for n:=0 to anz do begin for m := 0 to anz do begin
... |
Moderiert von Christian S.: Delphi-Tags hinzugefügt.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 08.12.04 14:48
mic7 hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| var R : array[1..6] of integer; [...] R[k]:= listbox1.items.strings[i]; [...] | |
Schau Dir mal die Funktionen StrToInt und StrToIntDef an.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 08.12.04 14:49
Wie ichs mir dachte.
R[k] ist ein Integer.
listbox1.items.strings[i] ist ein String.
Delphi-Quelltext 1:
| R[k]:= StrToInt(listbox1.items.strings[i]); |
Sollte helfen.
|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 08.12.04 15:40
das m umwandeln hat geklappt danke.. folgende fehlermeldung hab ich noch: der index der liste überschreitet das maximum 3(anzahl meiner eingegeben werte).. hab ich was vergessen zu definieren?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 08.12.04 15:46
Dein Array fängt bei 1 an zu zählen. Die Listbox aber bei 0.
|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 08.12.04 15:55
fehlermeldung noch imma da... kann sich viell jmd mal meinen code ansehn, vermute einen logikfehler ..
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:
| procedure TForm1.Button3Click(Sender: TObject); var R : array[0..6] of integer; Rp : double; Rs : double; Rx : double; E : double; Ep : double; Es : double; m,n,i,k,anz: integer;
begin
Rx := StrToInt(Edit2.text); E := 10000000.0; if pos(floattostr(Rx),ListBox1.Items.text)<> 0 then begin ShowMessage('Widerstand vorhanden!'); Edit3.text := '0'; Edit4.text := 'Vorhanden'; end
else begin anz:=ListBox1.items.count-1; for n:=0 to anz do begin for m := 0 to anz do begin for k:=0 to 6 do for i:=0 to 6 do begin R[k]:= StrToInt(listbox1.items.strings[i]); end; Rp := (R[n] * R[m]) / (R[n] + R[m]); Rs := R[n] + R[m];
Ep := (Rx - Rp) / Rx; Es := (Rx - Rs) / Rx; if Ep < E then begin ... .. |
Moderiert von Christian S.: Delphi-Tags hinzugefügt.
|
|
Basti
      
Beiträge: 345
Windows Vista
D2005 Pers, D7 Pers
|
Verfasst: Mi 08.12.04 16:02
1.) Benutze bitte die Delphi-Tags für Code.
2.) Gib die Fehlermeldungen mit an.
3.) Was macht das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| for k:=0 to 6 do for i:=0 to 6 do begin R[k]:= StrToInt(listbox1.items.strings[i]); end; |
Damit überschreibst du R[k] doch ständig, ohne die ersten 5 Werte verwendet zu haben.
_________________ Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 08.12.04 16:26
mic7 hat folgendes geschrieben: | Delphi-Quelltext 1:
| var R : array[0..6] of integer; | |
Das Array ist somit auf 7 Elemente fixiert.
In der Listbox hast Du x Elemente:
Delphi-Quelltext 1:
| anz:=ListBox1.items.count-1; |
anz = x
Dabei kann x < 7, x = 7 oder x > 7 sein.
Und jetzt gehen wir mal alle drei Fälle durch:
1. x < 7
Delphi-Quelltext 1: 2: 3: 4:
| for i:=0 to 6 do begin R[k]:= StrToInt(listbox1.items.strings[i]); end; |
In diesem Fall läuft die Schleife über die in der Listbox enthaltene Anzahl von Strings hinaus - Du bekommst also einen Fehler beim Zugriff auf die nicht vorhandenen Strings.
2. x = 7
In dem Fall ist die Anzahl der in der Listbox enthaltenen Strings gleich der von Dir hartcodierten Größe des Arrays und Schleifendurchläufe - also alles i.O.
3. x > 7
In diesem Fall greifst Du hier
Delphi-Quelltext 1: 2:
| Rp := (R[n] * R[m]) / (R[n] + R[m]); Rs := R[n] + R[m]; |
auf nicht definierte Array-Elemente zu (die Größe des Arrays hast Du ja auf 7 limitiert).
Ergo: Du kannst nur in dem Fall von exakt 7 Listbox-Einträgen das Funktionieren Deines Codes voraussetzen.
btw: Ich kann nur immer wieder für ein sinnvolles Benennen von visuellen Controls plädieren.
|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mi 08.12.04 20:19
so ich hab jetzt einfach mal den gesamten code eingetragen... wenn ich drei einträge in die listbox mache klappt alles und der relative fehler ist richtig..... wenn ich jedoch mehere einträge mache, dann wird der fehler viel zu groß...
 mir sind leider die ideen ausgegangen..ich hoff ihr habt noch geduld mit einen d-anfäger wie mir..
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:
| procedure TForm1.Button3Click(Sender: TObject); var R : array[0..5] of integer; Rp : double; Rs : double; Rx : double; E : double; Ep : double; Es : double; m,n,anz: integer;
begin Rx := StrToInt(Edit2.text); E := 10000000.0; if pos(floattostr(Rx),ListBox1.Items.text)<> 0 then begin ShowMessage('Widerstand vorhanden!'); Edit3.text := '0'; end
else begin anz:=ListBox1.items.count-1; for n:=0 to anz do begin for m := 0 to anz do begin R[n]:= StrToInt(listbox1.items.strings[n]); R[m]:= StrToInt(listbox1.items.strings[m]); Rp := (R[n] * R[m]) / (R[n] + R[m]); Rs := R[n] + R[m];
Ep := (Rx - Rp) / Rx; Es := (Rx - Rs) / Rx;
if Ep < E then begin E := Ep; Edit3.text := FloatToStrF(100*(abs(Rx- Rp)/Rx),ffFixed,10,2); end; if Es > E then begin E := Es; Edit3.text := FloatToStrF(100*(abs(Rx-Rs)/Rx),ffFixed,10,2); end; end; end; end;
end;
end. |
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Fr 10.12.04 01:02
mic7 hat folgendes geschrieben: | [...] wenn ich drei einträge in die listbox mache klappt alles und der relative fehler ist richtig..... wenn ich jedoch mehere einträge mache, dann wird der fehler viel zu groß... |
Sorry, aber da müsstest Du schon sagen, was Du eigentlich machen willst - mir das jetzt aus Deinem Quellcode zu erarbeiten mache ich nur gegen Bezahlung...

|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Fr 10.12.04 12:04
Robert.Wachtel hat folgendes geschrieben: | mic7 hat folgendes geschrieben: | [...] wenn ich drei einträge in die listbox mache klappt alles und der relative fehler ist richtig..... wenn ich jedoch mehere einträge mache, dann wird der fehler viel zu groß... |
Sorry, aber da müsstest Du schon sagen, was Du eigentlich machen willst - mir das jetzt aus Deinem Quellcode zu erarbeiten mache ich nur gegen Bezahlung...
 |
geb ich dir vollkommen recht..sorry
hier meine angabe:
in einem labor gibt es n verschiedene widerstände mit den werten R1 bis Rn(jeweils mehrere stück). beim aufbau einer schaltung braucht man einen widerstand mit dem wert Rx, der möglichst genau realisiert werden soll
1.durch vorhandenen widerstand
2.durch parallelschaltung 2er widerstände(Rpar=Ri*Rj/ Ri+Rj)
oder
3.durch serienschaltung 2er widerstände(Rser=Ri+Rj)
,wobei jener fall auszuwählen ist, bei dem der kleinste relative fehler(in %)auftritt (Fr=100*abs(Rx-R)/Rx)
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Fr 10.12.04 12:45
Ich steige da ja noch nicht so ganz durch.
Aber du machst deinen E, den du zum Vergleichen benutzt, ja auch immer wieder größer, sobald deine Serienschaltung einen größeren Fehler produziert, als wie in E zuvor drin steht.
Delphi-Quelltext 1: 2: 3: 4:
| if Es > E then begin E := Es; ... |
Je größer deine Widerstände in der Liste werden, umso weiter entfernen sie sich in Reihe geschaltet von deinem Sollwert (dann, wenn ihre Summe irgendwann mal größer ist, wie der Sollwert). Somit wird der Referenz-Fehlerwert E immer größer statt kleiner.
Ich denke, du hast < und > verwechselt.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Fr 10.12.04 16:42
mic7 hat folgendes geschrieben: | [...]in einem labor gibt es n verschiedene widerstände mit den werten R1 bis Rn(jeweils mehrere stück). beim aufbau einer schaltung braucht man einen widerstand mit dem wert Rx, der möglichst genau realisiert werden soll
1.durch vorhandenen widerstand
2.durch parallelschaltung 2er widerstände(Rpar=Ri*Rj/ Ri+Rj)
oder
3.durch serienschaltung 2er widerstände(Rser=Ri+Rj)
,wobei jener fall auszuwählen ist, bei dem der kleinste relative fehler(in %)auftritt (Fr=100*abs(Rx-R)/Rx) |
So, ich hoffe 1. dass ich Dich richtig verstanden habe und 2. dass ich keinen logischen Fehler eingebaut habe:
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: 83: 84: 85: 86: 87: 88:
| procedure TfrmWiderstandlabor.btnSucheWiderstandClick(Sender: TObject); var Ri : double; Rj : double; Rp : double; Rs : double; Rx : double; Fp : double; Fs : double; Fr : double; R1 : double; R2 : double; i, j : integer; function RSerie(R1, R2: double): double; begin Result := R1 + R2; end;
function RParallel(R1, R2: double): double; begin Result := (R1 * R2) / (R1 + R2); end;
function RelativerFehler(Rx, R: double): double; begin Result := 100 * abs(Rx - R) / R; end;
begin
Fr := MaxDouble;
Rx := StrToFloat(edtGesuchterWiderstand.Text);
for i := 0 to (lstbxWiderstaende.Count - 1) do begin
Ri := StrToFloat(lstbxWiderstaende.Items[i]);
if (Ri = Rx) then begin R1 := Ri; R2 := 0; Fr := 0; end;
for j := i to (lstbxWiderstaende.Count - 1) do begin
Rj := StrToFloat(lstbxWiderstaende.Items[j]);
Rs := RSerie(Ri, Rj); Fs := RelativerFehler(Rx, Rs); if (Fs < Fr) then begin R1 := Ri; R2 := Rj; Fr := Fs; end;
Rp := RParallel(Ri, Rj); Fp := RelativerFehler(Rx, Rp); if (Fp < Fr) then begin R1 := Ri; R2 := Rj; Fr := Fp; end;
end; end;
edtWiderstand1.Text := FloatToStr(R1); edtWiderstand2.Text := FloatToStr(R2); edtRelativerFehler.Text := FloatToStr(Fr);
end; |
Ich denke, dass der Quelltext und die namentliche Bennennung der Komponenten weitestgehend selbsterklärend sind.
|
|
mic7 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 14.12.04 01:58
danke vielmals für die mühe...
maxdouble- versionsabhängig?
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 14.12.04 11:53
mic7 hat folgendes geschrieben: | maxdouble- versionsabhängig? |
Es ist in der Unit "Math". Evtl. musst du die mit einbinden. Wenn deine Version es nicht kennt, nimm - so wie du es zuvor bei dir für die Variable E gemacht hast - einen "unerreichbar" hohen Wert.
Abgesehen davon:
Hast du jetzt nur stumpf den Code von Robert.Wachtel übernommen, oder versuchst du auch, deinen Code ans Laufen zu kriegen?
Ich würde nämlich gerne wissen, ob du meine Einschätzungen aus meinem vorherigen Posting teilst.
|
|