先に言っておきますが、説明しようとしている問題をほんの数行のコードで再現することはできませんでした (信じてください、私は試しました)。そして、以下に説明する問題を修正しました。なぜそれが起こったのかを突き止めようとしています。
C 用の端末コード エディターを作成しています 。別のアーキテクチャ (具体的には Arm) でテストすると、奇妙なエラーが発生しました。上にスクロールしなくなりました (下にスクロールしません)。この関数呼び出しの問題を次のコードに絞り込みましたmain
。
} else if ((c + 64) == 'V'){
edit_scroll (&session, session.max_y / 2);
session.cursor = session.disp;
session.flags |= EDIT_FLAG_REPRINT;
} else if ((c + 64) == 'Y'){
//here
edit_scroll (&session, -1 * (session.max_y / 2)); /*
| |
Removing parenthesis causes compilation errors
in some platforms.
*/
session.cursor = session.disp;
session.flags |= EDIT_FLAG_REPRINT;
}
edit_scroll
負の値が渡されると上にスクロールします (図のように)。これらの 2 つの括弧を追加したときにエラーを修正したところ2147483598
、関数呼び出し内で式が評価されていることがわかりました。int
このコンパイルでの最大値はであり、このテストを実行したとき2,147,483,647
の のサイズであることに注意してください(変数は端末の高さを表します)。session.max_y
100
edit_scroll
実装は次のとおりです。
int edit_scroll (struct edit * session, int deltay){
// I printed deltay at this line, when I determined the value
int i = session->disp;
char * data = session->buffer.data;
if (deltay > 0){
for (; data[i] && deltay; i++){
if (data[i] == '\n'){
deltay--;
}
}
if (!deltay){
session->disp = i;
}
}
if ((deltay < 0) && (session->disp > 0)){
for (i--; i > 0; i--){
if (data[i - 1] == '\n'){
if (!(++deltay)){
break;
}
}
}
session->disp = i;
}
return 0;
}
私が言ったように、小さなテスト プログラムではこのエラーを再現できませんでした。Clang と Gcc でこれを試してみましたが、どちらも同じエラーが発生します。なぜこれはこのような奇数に評価されるのですか? これはコンパイルエラーであると言っても過言ではありませんか?
-1 * session.max_y / 2
アセンブリを表示するのに役立ちますか? もっとソースコードを投稿する必要がありますか? .c
ファイルだけでも行よりも少し多いため、コード全体を投稿することをためらっています1800
。