amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Float Exception [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

12.10.2007, 20:57 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Hallo!

Diesmal brauche ich Hilfe.
Ich habe einen Bilinear Scaling Alog gecoded.
Er basiert rein auf Integern.

Ich kompiliere meine Textexecutable mit

gcc main.c -o testexe

Alles ist in einer File.
Ich bekomme aber an der markierten Stelle "Floating point exection" als output der Exe, und dann bricht sie ab.

Was mache ich falsch ? Sieht sonst alles gut aus.

code:
for (dy=0; dy<(dh+bordery); dy++) {
        int sy = (dy*sh) / dh; // calculate source y
        int fy = (dy*sh) - (sy*dh); // calculate the fractional part
        int ify = dh-fy; // calculate the inverse fractional part
        ARGBPixel *DPixel = ((ARGBPixel*)destaddr) + (dy*dppr); // calculate dest address
        for (dx=0; dx<(dw+borderx); dx++) {
          int sx = (dx*sw) / dw; // calculate source x
          ARGBPixel *SPixel = ((ARGBPixel*)sourceaddr) + (sy*sppr + sx); // calculate source address
          int fx = (dx*sw) - (sx*dw); // calculate the fractional part
          int ifx = dw-fx; // calculate the inverse fractional part
          int div = dx*dy;

          int faa = ((fx *  fy) << 8) / div;  <= HIER GIBT ES DAS PROBLEM, bei der Division "/"
          int fba = ((ifx *  fy) <<8) / div;
          int fab = ((fx *  ify) <<8) / div;
          int fbb = ((ifx *  ify) <<8) / div;
          int C;
          C  = (int)(SPixel[0].A)            *  faa; // Interpolate alpha
          C += (int)(SPixel[1].A)          * fba;
          C += (int)(SPixel[sppr].A)     * fab;
          C += (int)(SPixel[sppr+1].A) * fbb;                  
          DPixel->A = (UBYTE)(C >> 8);
          C  = (int)(SPixel[0].R)            *  faa; // Interpolate red
          C += (int)(SPixel[1].R)          * fba;
          C += (int)(SPixel[sppr].R)     *  fab;
          C += (int)(SPixel[sppr+1].R) * fbb;                  
          DPixel->R = (UBYTE)(C >> 8);
          C  = (int)(SPixel[0].G)            *  faa; // Interpolate green
          C += (int)(SPixel[1].G)          * fba;
          C += (int)(SPixel[sppr].G)     *  fab;
          C += (int)(SPixel[sppr+1].G) * fbb;                  
          DPixel->G = (UBYTE)(C >> 8);
          C  = (int)(SPixel[0].B)            *  faa; // Interpolate blue
          C += (int)(SPixel[1].B)          * fba;
          C += (int)(SPixel[sppr].B)     * fab;
          C += (int)(SPixel[sppr+1].B) * fbb;                  
          DPixel->B = (UBYTE)(C >> 8);
          DPixel++;
        }
      }

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

12.10.2007, 21:58 Uhr

uho
Posts: 114
Nutzer
@Der_Wanderer:

Aber gerne; ist zum Glück nicht zu schwierig:

Division durch Null ist halt immer schlecht...

int div=dx*dy; - sowohl dx als auch dy beginnen bei 0, womit
div natürlich auch 0 ist, was dann zu dem Fehler in besagter
Zeile führt.


Wundert mich nur, daß das der Compiler überhaupt schluckt;

Aztec spuckt selbst, wenn man

const int dx=1234, dy=1234;
int div=dx*dy;

schreibt "initializer is not a constant" aus...

Daher hat man dann auch immer viel Extra-Aufwand, wenn man
(eigl.) konstante Werte in Strukturen eintragen muß...


Gruß

uho


[ - Antworten - Zitieren - Direktlink - ]

12.10.2007, 22:15 Uhr

Der_Wanderer
Posts: 1229
Nutzer
* kopfklatsch! *

Was habe ich da zusammengeproggt !?
Das ist natürlich vollkommener Unsinn...

Vielen Dank für den Hinweis.

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

15.10.2007, 12:00 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von uho:
Wundert mich nur, daß das der Compiler überhaupt schluckt;

Aztec spuckt selbst, wenn man

const int dx=1234, dy=1234;
int div=dx*dy;

schreibt "initializer is not a constant" aus...

Willkommen im Jahre 2007 ;)

Da kann man das eben hinschreiben, statt
const int dx=1234, dy=1234;
int div;
div=dx*dy;

schreiben zu müssen, was an dem grundsätzlichen Problem der Division durch 0 keinen Deut ändern würde. Mit heutigen Compiler kann man halt ein bisschen Schreibarbeit sparen, wobei "heutige" wohl einen Zeitraum irgendwas >10 Jahre umfasst. Interessant aber, dass const int "not a constant" ist...

mfg


[ Dieser Beitrag wurde von Holger am 15.10.2007 um 12:03 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Float Exception [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.