mit shorts geht es mit longs nicht



  • ich hab Bresenhams Linienalgorithmus implementiert:

    void line1(short x1, short y1, short x2, short y2, char color)
    {
      short delta_x;
      short delta_y;
      short xstep;
      short ystep;
      short length;
      short e;
      short offset;
    
      delta_x = x2 - x1;
      delta_y = y2 - y1;
      xstep = 1;
      ystep = -width;
    
      if(delta_x < 0)
      {
        delta_x = -delta_x;
        xstep = -xstep;
      }
      if(delta_y < 0)
      {
        delta_y = -delta_y;
        ystep = -ystep;
      }
      if(delta_y > delta_x)
      {
        long t = delta_x;
        delta_x = delta_y;
        delta_y = t;
        t = xstep;
        xstep = ystep;
        ystep = t;
      }
    
      length = delta_x + 1;
      e = delta_y;
    
      x1 += width2;
      x2 += width2;
      y1 = - y1 + height2 - 1;
      y2 = - y2 + height2 - 1;
    
      offset = y1 * width + x1;
    
      while(length-- > 0)
      {
        ppixel[offset] = color;
    
        offset += xstep;
        e += delta_y;
    
        if(e >= delta_x)
        {
          e -= delta_x;
          offset += ystep;
        }
      }
    }
    

    die Linie soll von x1|y1 nach x2|y2 gezogen werden, in der Farbe color

    width ist die breite der Zeichenläche
    heigh die höhe
    width2 ist die halbe breite
    heght2 die halbe höhe

    (width2 und height2 wird am Anfang deklariert, damit sie nicht immer wieder ausgerechnet wrden müssen)

    ppixel ist ein char-array, in dem die Farbe jedes Pixels der Zeichenläche gespeichert ist

    compilieren tu ich das ganze mit Turbo C, also 16-Bit

    alle shorts die in dem Code vorkommen will ich in longs umwandeln, wenn ich das mache fängt die funktion allerdings an zu spinnen
    und auf meiner Zeichenfläche kommt nichts an
    belasse ich die shorts klappt es problemlos

    ein großes Problem stellt das nicht dar, aber mich würde einfach mal interessieren warum es mit longs nicht klappt



  • scales of justice schrieb:

    ich hab Bresenhams Linienalgorithmus implementiert:

    void line1(short x1, short y1, short x2, short y2, char color)
    {
      short delta_x;
      short delta_y;
      short xstep;
      short ystep;
      short length;
      short e;
      short offset;
    
      delta_x = x2 - x1;
      delta_y = y2 - y1;
      xstep = 1;
      ystep = -width;
    
      if(delta_x < 0)
      {
        delta_x = -delta_x;
        xstep = -xstep;
      }
      if(delta_y < 0)
      {
        delta_y = -delta_y;
        ystep = -ystep;
      }
      if(delta_y > delta_x)
      {
        long t = delta_x;
        delta_x = delta_y;
        delta_y = t;
        t = xstep;
        xstep = ystep;
        ystep = t;
      }
    
      length = delta_x + 1;
      e = delta_y;
    
      x1 += width2;
      x2 += width2;
      y1 = - y1 + height2 - 1;
      y2 = - y2 + height2 - 1;
    
      offset = y1 * width + x1;
    
      while(length-- > 0)
      {
        ppixel[offset] = color;
    
        offset += xstep;
        e += delta_y;
    
        if(e >= delta_x)
        {
          e -= delta_x;
          offset += ystep;
        }
      }
    }
    

    die Linie soll von x1|y1 nach x2|y2 gezogen werden, in der Farbe color

    width ist die breite der Zeichenläche
    heigh die höhe
    width2 ist die halbe breite
    heght2 die halbe höhe

    (width2 und height2 wird am Anfang deklariert, damit sie nicht immer wieder ausgerechnet wrden müssen)

    ppixel ist ein char-array, in dem die Farbe jedes Pixels der Zeichenläche gespeichert ist

    compilieren tu ich das ganze mit Turbo C, also 16-Bit

    alle shorts die in dem Code vorkommen will ich in longs umwandeln, wenn ich das mache fängt die funktion allerdings an zu spinnen
    und auf meiner Zeichenfläche kommt nichts an
    belasse ich die shorts klappt es problemlos

    ein großes Problem stellt das nicht dar, aber mich würde einfach mal interessieren warum es mit longs nicht klappt

    16 bit mode heißt nicht umsonst 16bit und nicht 32bit.

    short : 16 bit
    long : 32 bit

    Gut,d ie cpu kanns ja in dx:ax speichern , abe kA.



  • nein, daran liegt es nicht
    warum denkst du weis Turbo C dann überhaupt was long ist, wenn er es sowiso nicht benutzen kann?
    wär ja sinnfrei

    der eine Teil kommt in ein anderes Register, oder so ähnlich

    EDIT:

    habs jetzt, hab bloß das falsche Speichermodell genommen -.-
    auf sowas kommt man einfach nicht wenn man sonst unter Windows programmiert


Log in to reply