Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

11

13.05.2005, 13:53

C-/C++-Quelltext

1
2
3
4
5
 inline myVektor operator / (float f) const
 {
     f=(f != 0 ? 1/f : 1);
     return myVektor(x*f,y*f,z*f);
}


gesetz dem falle das f= 0 ist gibt er ein INF zurück und das schleppt sich dann durhc die koplette Rechnung sodass die Werte alle INF sind.....

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

12

13.05.2005, 14:04

Dann werfe doch eine Assertion, da wohl ein Fehler vorliegt und du den nicht einfach ignorieren solltest!!

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

13

13.05.2005, 14:09

Das war nur ein Beispiel. Der Fall kann ja auch wo anders auftreten wo 0 durchaus üblich sind. Und ehe ich wegen jeder kleinen NUll da das pürogramm wild rumschmeißen lasse. Regel ich das lieber so......

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

14

13.05.2005, 15:43

Das ist Blödsinn was du da vor hast. Wenn du mal durch 0 dividieren musst, hast du mit Sicherheit irgendwo einen Denkfehler.
Die einzige Ausnahme, die mir einfallen würde, wäre bei der Implementierung eines Taschenrechners. Wenn der Benutzer durch 0 teilen will, fängt man das ab.
Bei einer Berechnung, wie lange noch eine gewissen Aktion dauert, muss man sowas auch abfangen, da es in der ersten Zeit undefiniert ist, wie lange eine bestimmte Aktion dauert. (oder kennt jemand ein Downloadmanager/Installationsprogramm, welches in der ersten Sekunde einen realistischen Wert für die restliche Zeit ausgibt?)

Ciao

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

15

13.05.2005, 15:44

Meine Rede!

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

16

13.05.2005, 16:25

ich würde auf jedenfall irgendwie abbrechen, da wenn du bei nem x/0 problem einfach mit 0 als ergebnis weiter rechnest das verhalten des programms vollkommen unkolltrolliert und falsch wird. durch null teilen ist undefiniert und kann im prinzip alles sein: grenzwert von (2x-2)/(x-1) für x gegen eins ist zB solch ein problem und konvergiert gegen 2 (l'hopital).
denke es wäre am besten ne exception zu werfen, ob diese dann abgefangen wird oder nicht kann man dann ja von fall zu fall unterscheiden, aber in der regel kommen keine teilungen durch null vor, wie helmut ja bereits bemerkte.

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

17

13.05.2005, 21:35

Oder in kritischen Bereichen eine Assertion werfen.
Da hast du den Vorteil, dass diese nur in der Debugversion geprüft wird und in der Releaseversion nicht.

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

18

16.05.2005, 14:56

Für all die klugen Menschen unter uns ;)

C-/C++-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
bool LineHitsBox(myVektor start, myVektor end, myVektor& mini,  inline float operator / (const myVektor& v)
 {
        if((x==v.x) && (y==v.y) && (z==v.z)) //wenn die Strecken identisch sind

            return 0;

        float tempx=x*(v.x != 0 ? 1/v.x : 0);
        float tempy=y*(v.y != 0 ? 1/v.y : 0);
        float tempz=z*(v.z != 0 ? 1/v.z : 0);

                if(tempx!=0)
                    if(tempy!=0)
                    {
                        if(tempx!=tempy)
                            return -1;
                        if(tempz!=0)
                            if(tempy == tempz)//alle gleich

                                return tempx;
                            else
                                return -1;
                        else
                            return tempx;// tempx und tempy gleich und tempz ungültig

                    }
                    else
                    {
                        if(tempz==0)//wenn nur tempx gültig

                            return tempx;
                        else
                            if(tempz == tempx)// wenn tempx und tempz gleich und tempy ungültig

                                return tempx;   
                            else
                                return -1;
                    }
                else if(tempy!=0)
                    {
                        if(tempz==0)//wenn nur tempy gültig

                            return tempz;
                        else
                            if(tempy == tempz)// wenn tempy und tempz gleich und tempx ungültig

                                return tempy;
                            else
                                return -1;
                    }
                else if(tempz!=0)
                        return tempz;
                else
                    return -1;
 }

Situation:
Vektor durch Vektor; klar es gibt sicher elegantere Lösungen, nur wenn einer der Werte bei der Vers von v Null ist, wäre die gesamte Sache komplett im Eimer....

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

19

16.05.2005, 16:01

Darf ich fragen, warum man, wenn man einen Vector durch einen Vector teilt eine einzige Zahl bekommt?

Und wie schon gesagt, wenn dein Programm durch 0 teilt, hast du irgendwas falsch gemacht. Und sowas direkt in der Vectorklasse abzufangen ist keine gute Idee. Höchstens mit einem Assert prüfen.

Dein Code sollte eher so aussehen:

Quellcode

1
2
3
4
    inline Vector2 operator / (const Vector2& v) const
{
  return Vector2(x / v.x, y / v.y);
}


Ciao

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

20

16.05.2005, 16:04

Es geht dabei um Kollisionserkennung.
Da ja v2=v1*s ist muss man auch s rausfinden können.....

Werbeanzeige