LINUX.ORG.RU

История изменений

Исправление bormant, (текущая версия) :

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/tree/kate/part/katebuffer....
Однако тем самым внесли ошибку. С labs() изменилась логика: беззнаковый аргумент расширяется до знакового большей разрядности, становится (-1)u. А первоначальная логика расчитана на потерю «знаковости», на то, что после abs() аргумент (-1)u == 0xffffffff станет равен 1, а не 0xffffffff.

Поэтому скажем дружное «фи» товарищу Slávek Banko за такое «исправление» (компилируется, но не работает как задумано):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/commit/kate/part/katebuffe...

#include <iostream>

int main()
{
    unsigned int i=-1;
    std::cout << "before: " << abs(i) << "  after: " << labs(i) << "\n";
}

before: 1  after: 4294967295


То есть исправлять-то нужно было на
  while ( (foldingList.size()>0)  && ( abs((int)foldingList[foldingList.size()-2])==1)) {

Исправление bormant, :

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/tree/kate/part/katebuffer....
Однако тем самым внесли ошибку. С labs() изменилась логика: беззнаковый аргумент расширяется до знакового большей разрядности, становится (-1)u. А первоначальная логика расчитана на потерю «знаковости», на то, что после abs() аргумент (-1)u == 0xffffffff станет равен 1, а не 0xffffffff.

Поэтому скажем дружное «фи» товарищу Slávek Banko за такое «исправление» (компилируется, но не работает как задумано):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/commit/kate/part/katebuffe...

#include <iostream>

int main()
{
    unsigned int i=-1;
    std::cout << "before: " << abs(i) << "  after: " << labs(i) << "\n";
}

before: 1  after: 4294967295

Исправление bormant, :

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/tree/kate/part/katebuffer....
Однако тем самым внесли ошибку. С labs() изменилась логика: беззнаковый аргумент расширяется до знакового большей разрядности, становится (-1)u. А первоначальная логика расчитана на потерю «знаковости», на то, что после abs() аргумент (-1)u == 0xffffffff станет равен 1, а не 0xffffffff.

Поэтому скажем дружное «фи» товарищу Slávek Banko за такое «исправление» (компилируется, но не работает как задумано):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/commit/kate/part/katebuffe...

Исправление bormant, :

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ):
https://mirror.git.trinitydesktop.org/cgit/tdelibs/tree/kate/part/katebuffer....
Однако тем самым внесли ошибку. С labs() изменилась логика: беззнаковый аргумент расширяется до знакового большей разрядности, становится (-1)u. А первоначальная логика расчитана на потерю «знаковости», на то, что после abs() аргумент (-1)u == 0xffffffff станет равен 1, а не 0xffffffff.

Поэтому скажем дружное «фи» товарищу Slávek Banko за такое «исправление»:
https://mirror.git.trinitydesktop.org/cgit/tdelibs/commit/kate/part/katebuffe...

Исходная версия bormant, :

Но по логике исполнения избавиться от abs() нельзя из-за:

void KateBuffer::addIndentBasedFoldingInformation(TQMemArray<uint> &foldingList,bool addindent,uint deindent)
{
  //...
    for (uint z= foldingList.size()-(deindent*2); z < foldingList.size(); z=z+2)
    {
      foldingList[z] = -1;  // беззнаковая (-1)
      foldingList[z+1] = 0;
    }
  }
}

Поэтому в TDE поменяли вызов на labs( ... ).