0

for ループの開始変数を変更して、代わりに if ステートメントを使用しようとしています。ただし、それらは同等ではないようです..

次のようなループがあります。

int K = 0;
std::uint32_t CheckSum = 0;
const std::uint8_t* BuffPos = static_cast<const std::uint8_t*>(Data);
int Start = Height < 12 ? 1 : 12;

for (std::size_t I = Start; I < Height; ++I)
{
    for (std::size_t J = 0; J < Width; ++J, ++K)
    {
        BuffPos += 3;  //skip RGB and move to alpha pixel.
        CheckSum += *(BuffPos++);  //Checksum = count of alpha pixels.
    }
}

std::cout<<CheckSum;

ただし、ループを で開始したくありませんI = Start。if ステートメントでそれを行いたいと思います。私は次のことを試しました:

int K = 0;
std::uint32_t CheckSum = 0;
const std::uint8_t* BuffPos = static_cast<const std::uint8_t*>(Data);
int Start = Height < 12 ? 1 : 12;

for (std::size_t I = 0; I < Height; ++I)
{
    for (std::size_t J = 0; J < Width; ++J, ++K)
    {
        BuffPos += 3; //Skip RGB and move to alpha pixel.

        if (I >= Start)  //The if statement.
            CheckSum += *(BuffPos++);  //Checksum = count of alpha pixels.
    }
}

std::cout<<CheckSum;

ただし、if ステートメントを含む 2 番目のバージョンは、まったく同じビットマップの最初のバージョンとはまったく異なる数値を出力します。

これを行う理由はありますか?どうすれば修正できますか?なぜ違うのかわかりません:S

4

3 に答える 3

3

お気づきのとおり、それはもはや同じではありません。

確かに、チェックサム ビットを分離しましたが、今はBufPos別の回数インクリメントしています。ループの反復回数が増えたためBuffPos、チェックサムの作成を開始すると、最初のバージョンとは異なる値になります。

このように見てください。最初のバージョンは でチェックサムの蓄積を開始しBuffPos + 3ます。2 番目のバージョンは、 からチェックサムの蓄積を開始しますBuffPos + (Start * Width) + 3

正直なところ、最初のバージョンの方が優れています。どちらが正しいとは言えませんが、最初のバージョンが (から反復Start) であると仮定すると、なぜブランチを導入する必要があるのでしょうか? コードを混乱させるだけです。

2 番目のバージョンを最初のバージョンと同じにしたい場合は、初期化BuffPosするData + Start * Widthか、両方のステートメントをif. もちろん、それを行うと、 まで何もしていないだけで、何I == Startかわかるはずです。

于 2013-09-14T05:46:06.320 に答える