Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Operator ist auf diesen Operandentyp nicht anwendbar?


Lemartes - Do 20.04.06 00:53
Titel: Operator ist auf diesen Operandentyp nicht anwendbar?

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:
function TForm1.equal : boolean;
var i,j,k,l,m,n, is_equal : integer;
var var_r, var_s : real;
var ergebnis: array[1..3of real;
begin
var_r:= 0;
var_s:= 0;
is_equal:= 0;

for i:= 1 to 3 do
  ergebnis[i]:= stzvek[2,i] - stzvek[1,i];   // Die beiden Stützvektoren auf eine Seite bringen

for j:= 1 to 3 do
  if (rvek_r[1,j] = 0and (rvek_s[1,j] <> 0then   // prüfen, ob "r" in einer der 3 Gleichungen nicht vorkommt
    var_s:= ergebnis[j] / rvek_s[1,j];               // und gegebenenfalls "s" daraus berechnen

if var_s = 0 then  // wenn "s" nicht berechnet werden konnte
  begin
  for k:= 1 to 3 do
    if (rvek_s[1,k] = 0and (rvek_r[1,k] <> 0then // prüfen, ob "s" in einer der 3 Gleichungen nicht vorkommt
      var_r:= ergebnis[k] / rvek_r[1,k];             // und gegebenenfalls "r" daraus berechnen
  for l:= 1 to 3 do
    if (rvek_s[1,l] <> 0and (rvek_r[1,l] <> 0then
      var_s:= (ergebnis[l] - (var_r * rvek_r[1,l])) / rvek_s[1,l];   // "r" aus "s" berechnen
  end
  else   // wenn "s" berechnet wurde
  for m:= 1 to 3 do
    if (rvek_s[1,m] <> 0and (rvek_r[1,m] <> 0then
      var_r:= (ergebnis[m] - (var_s * rvek_s[1,m])) / rvek_r[1,m];   // "s" aus "r" berechnen

if (var_s = 0and (var_r = 0then   //wenn "r" und "s" auf diese Weise nicht berechnet werden konnten, dann
  begin
  var_s:= ((ergebnis[1] * rvek_r[2]) - (ergebis[2] * rvek_r[1])) / ((rvek_s[1] * rvek_r[2]) - (rvek_s[2] * rvek_r[1]));
  var_r:= (ergebnis[1] - (var_s * rvek_s[1])) / rvek_r[1];
  end


for m:= 1 to 3 do
  if ((rvek_r[m] * var_r) + (rvek_s[m] * var_s)) = ergebnis[m] then 

    is_equal:= is_equal + 1;

if is_equal = 3 then
  equal := true;

end;




habe diesen queslltext. die gesamten arrays sind real werte, von daher sollte das funktionieren.
der compiler sagt aber an den markierten stellen immer [Fehler] Unit1.pas(119): Operator ist auf diesen Operandentyp nicht anwendbar.
von der häufigkeit der fehlermeldugen würd ich sagen, dass die * schuld sind, eine einfache multiplikation sollte aber normal funktionieren. bin grad etwas ratlos...

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Moderiert von user profile iconGausi: Topic aus Sonstiges (Delphi) verschoben am Fr 21.04.2006 um 08:37


Alstar - Do 20.04.06 01:34

Hallo!

Zu deiner Problemstellung direkt kann ich nichts (sinnvolles) beitragen, allerdings solltest du Fliesskommawerte nie auf Gleichheit pruefen, da dies meisstens False ergibt.

Alstar


Lemartes - Do 20.04.06 07:26

ist aber ein mathematikprogramm, bei dem das zwingend notwendig ist.
wenn ich die aus nem edit mit 0 einlese, wird da wohl auch 0 drin stehen, von daher ist das kein problem. wird wohl auch selten vorkommen, aber muss ja für alle fälle funktionieren.


Gausi - Do 20.04.06 07:56

Auch bei Mathematik-Programmen sollten Real-Werte nie auf Gleichheit überprüft werden. Besser wäre es, wenn man den Differenzbetrag auf < eps überprüft, wobei eps in etwa die Maschinengenauigkeit ist.


uwewo - Do 20.04.06 08:12

Hallo,

es ist sehr schwer in Deinem Code-Schnipsel zu erkennen wo der Fehler liegt,
poste etwas mehr von Deinem Code und man kann es ausprobieren.

Uwe


Kroko - Do 20.04.06 08:29

(a) Um Real-Typ auf Null zu prüfen gibt es in der Unit Math die Funktionen "IsZero"+ F1
(b) Warum steht in der Deklaration eigentlich 3x var, 1x sollte auch genügen :wink:


Simon Joker - Do 20.04.06 09:04

Der Fehler ist doch sonnenklar!

Die Variable "rvek_r" muß irgendwie so deklariert sein "Array of Array" denn du greift mit 2 Indices darauf zu.

Delphi-Quelltext
1:
2:
3:
  ..
  if (rvek_r[1,j] = 0and (rvek_s[1,j] <> 0then 
..

Dito "rvek_s".

Dann willst du mit einem Index Multiplikationen durchführen.

Delphi-Quelltext
1:
2:
3:
4:
5:
if (var_s = 0and (var_r = 0then   //wenn "r" und "s" auf diese Weise nicht berechnet werden konnten, dann
  begin
  var_s:= ((ergebnis[1] * rvek_r[2]) - (ergebis[2] * rvek_r[1])) / ((rvek_s[1] * rvek_r[2]) - (rvek_s[2] * rvek_r[1]));
  var_r:= (ergebnis[1] - (var_s * rvek_s[1])) / rvek_r[1];
  end;

Das funktioniert natürlich nicht, denn Real * Array ist nun mal nicht wirklich eine sinnvolle Operation.

MfG Simon


Lemartes - Do 20.04.06 16:29

ok, das zeigt mir, dass ich abends, wenn ich so wie so verwirrt bin nur noch mit copy and paste arbeiten sollte...

funzt jetzt. man sollte sich schon merken, was nen zweidimensionales array war und was nicht...

danke leute.

und da steht 3x var, weil ich das immer so gemacht hab, wenn nen neuer typ kam. für meine eigene übersicht...