Autor Beitrag
mic7
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 08.12.04 14:40 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var R : array[1..6of integer;

..
 else begin
     for k:=1 to 6 do
       for i:=1 to 6 do
         begin
           R[k]:= listbox1.items.strings[i]; //statt strings?
    anz:=ListBox1.items.count-1;
     for n:=0 to anz do
       begin
         for m := 0 to anz do
           begin

...


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 08.12.04 14:48 
mic7 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var R : array[1..6of integer;
[...]
           R[k]:= listbox1.items.strings[i]; //statt strings?
[...]

Schau Dir mal die Funktionen StrToInt und StrToIntDef an.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 08.12.04 14:49 
Wie ichs mir dachte.
R[k] ist ein Integer.
listbox1.items.strings[i] ist ein String.
ausblenden Delphi-Quelltext
1:
R[k]:= StrToInt(listbox1.items.strings[i]);					

Sollte helfen.
mic7 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 08.12.04 15:46 
Dein Array fängt bei 1 an zu zählen. Die Listbox aber bei 0.
mic7 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 08.12.04 15:55 
fehlermeldung noch imma da... kann sich viell jmd mal meinen code ansehn, vermute einen logikfehler ..

ausblenden volle Höhe Delphi-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:
procedure TForm1.Button3Click(Sender: TObject);
   var R : array[0..6of 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 user profile iconChristian S.: Delphi-Tags hinzugefügt.
Basti
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 345

Windows Vista
D2005 Pers, D7 Pers
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 08.12.04 16:26 
mic7 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
var R : array[0..6of integer;					

Das Array ist somit auf 7 Elemente fixiert.

In der Listbox hast Du x Elemente:

ausblenden 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

ausblenden 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

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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ß...

:roll: mir sind leider die ideen ausgegangen..ich hoff ihr habt noch geduld mit einen d-anfäger wie mir..

ausblenden volle Höhe Delphi-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:
procedure TForm1.Button3Click(Sender: TObject);
   var R : array[0..5of 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); //kleinster relativer Fehler
            
               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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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...
:beer:
mic7 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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...
:beer:


geb ich dir vollkommen recht..sorry :wink:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if Es > E then  //Muss es hier nicht Es < E heißen???
   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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-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:
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; // aktueller Widerstand Ri in der Schleife
  Rj : double; // aktueller Widerstand Rj in der Schleife
  Rp : double; // Widerstand bei Paralellschaltung von Ri und Rj
  Rs : double; // Widerstand bei Serienschaltung von Ri und Rj
  Rx : double; // gesuchter Widerstand
  Fp : double; // relativer Fehler bei Paralellschaltung von Ri und Rj
  Fs : double; // relativer Fehler bei Serienschaltung von Ri und Rj
  Fr : double; // kleinster gefundener Fehler
  R1 : double; // gefundener Widerstand R1
  R2 : double; // gefundener Widerstand R2
  i, j : integer; // Zählervariablen für Schleifen

  // berechnet Widerstand bei Serienschaltung zweier Widerstände
  function RSerie(R1, R2: double): double;
  begin
    Result := R1 + R2;
  end;

  // berechnet Widerstand bei Parallelschaltung zweier Widerstände
  function RParallel(R1, R2: double): double;
  begin
    Result := (R1 * R2) / (R1 + R2);
  end;

  // berechnet rel. Fehler zweier Widerstände
  function RelativerFehler(Rx, R: double): double;
  begin
    Result := 100 * abs(Rx - R) / R;
  end;

begin

  // rel. Fehler auf Maximum setzen
  Fr := MaxDouble;

  // gesuchter Widerstand aus Edit-Feld übernehmen
  Rx := StrToFloat(edtGesuchterWiderstand.Text);

  for i := 0 to (lstbxWiderstaende.Count - 1do
  begin

    // aktuellen Ri aus der Listbox zuweisen
    Ri := StrToFloat(lstbxWiderstaende.Items[i]);

    // ist dieser Wert der gesuchte Rx?
    if (Ri = Rx) then
    begin
      R1 := Ri;
      R2 := 0;
      Fr := 0// ja, dann relativer Fehler = 0%
    end;

    for j := i to (lstbxWiderstaende.Count - 1do
    begin

      // aktuellen Rj aus der Listbox zuweisen
      Rj := StrToFloat(lstbxWiderstaende.Items[j]);

      // Serienschaltung von Ri und Rj überprüfen
      Rs := RSerie(Ri, Rj);
      Fs := RelativerFehler(Rx, Rs);
      if (Fs < Fr) then
      begin
        R1 := Ri;
        R2 := Rj;
        Fr := Fs;
      end;

      // Parallelschaltung von Ri und Rj überprüfen
      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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 14.12.04 01:58 
danke vielmals für die mühe...

maxdouble- versionsabhängig?
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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.