Forum: Compiler & IDEs was macht diese if Bedingung


von tobi (Gast)


Lesenswert?

Hallo,

Ich habe einige fragen zu der folgenden Funktion aus einer Matrix Lib.
 - kann mir jemand sagen, für welche Matrixoperation die funktion da 
ist.
 - was unterscheidet die Bedingung am ende der funktion?
 - wie kann man diese if Bedingung in C# umsetzen?
1
double matrix3D::minor(int col,int ver) const
2
{
3
  double matrix[3][3];
4
5
  int dstCol,dstVer;
6
  dstCol=0;
7
  for(int srcCol=0;srcCol<4;srcCol++)
8
  {
9
    dstVer=0;
10
    if(srcCol==col)
11
    {
12
      srcCol++;
13
      if(srcCol>3)
14
        break;
15
    }
16
    for(int srcVer=0;srcVer<4;srcVer++)
17
    {
18
      if(srcVer==ver)
19
      {
20
        srcVer++;
21
        if(srcVer>3)
22
          break;
23
      }
24
      if(dstCol>2 || dstVer>2)
25
        THROW_ERROR(VALUE_OUT_OF_RANGE);
26
27
      matrix[dstCol][dstVer]=coeffs[srcCol][srcVer];
28
      dstVer++;
29
    }
30
    dstCol++;
31
  }
32
33
    if((col+ver)&1)   // was fragt die bedingung ab
34
    return -det3x3(matrix);
35
  else
36
    return det3x3(matrix);
37
}

danke

von AVerr (Gast)


Lesenswert?

if((col+ver)&1)

das & ist ein bitweises UND.
Die Summe von col und ver wird also mit einer 1 verundet ( wenn du dir 
das auf Bitebene ansiehst wirst du sehen, was damit bezweckt wird ).
In C# geht es genauso. Die Bitoperatoren gibt es da auch.

von tobi (Gast)


Lesenswert?

danke
... aber wenn ich die bedingung so in C# übernehme, bekomm ich einen 
fehler an der stelle

von dingsa (Gast)


Lesenswert?

tobi schrieb:
> ... aber wenn ich die bedingung so in C# übernehme, bekomm ich einen
> fehler an der stelle

Meldung zeigen!

von tobi (Gast)


Lesenswert?

if (col + ver) & 1)
...Visual Studio\Projects\viewer2\datentypen\matrix3D.cs(364,27): Fehler 
CS1002: ; erwartet.

von tobi (Gast)


Lesenswert?

sorry hatte die klammer vergessen...


D:\ASUS\Eigene Dokumente\Visual Studio 
2008\Projects\cncviewer2\cncviewer2\datentypen\matrix3D.cs(364,13): 
Fehler CS0029: Eine implizite Konvertierung vom Typ "int" in "bool" ist 
nicht möglich.

von AVerr (Gast)


Lesenswert?

tobi schrieb:
> if (col + ver) & 1)

Da fehlt eine öffnende Klammer ...
if ((col + ver) & 1)

von tobi (Gast)


Lesenswert?

jop die hatte ich bemerkt.... aber einen fehler gibts trotzdem..

von AVerr (Gast)


Lesenswert?

tobi schrieb:
> Fehler CS0029: Eine implizite Konvertierung vom Typ "int" in "bool" ist
> nicht möglich.

Ok ... es liegt daran, dass
((col + ver) & 1)
eine integer-Variable ist.
Ein Vergleich braucht aber einen bool-Typen ( true oder false ).

In C werden Zahlen ungleich 0 als true betrachtet, 0 als false.
C# braucht eine genauere Differenzierung:
if (((col + ver) & 1) == 1)
(das kann man in dem Fall machen, da bei der Verundung mit 1 nur 0 oder 
1 rauskommen kann)

von tobi (Gast)


Lesenswert?

ok danke... genau so hatte ich es probiert.
also stimmt es so.
na dann muss ich meinen fehler wo anders finden

danke für die schnelle hilfe

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

tobi schrieb:
>  - was unterscheidet die Bedingung am ende der funktion?
> ...
>     if((col+ver)&1)   // was fragt die bedingung ab

Es geht um die Berechnung der Determinante bzw. deren Vorzeichen,
irgendwas in der Gegend von (det3x3 ist geheim)

http://de.wikipedia.org/wiki/Determinante#Berechnung
http://de.wikipedia.org/wiki/Adjunkte

Es berechnet den Term
aus dem zweiten Artikel.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.