C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
24 件の質問
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
開発環境は Windows11/ VisualC++(MFC)です。
タイトル通りのですが、
qsort_sを使用してデータが8個以下で一度も並び替えが起きない場合、なぜか先頭のデータが最後に移動するので、
それの回避方法があれば教えてください。
以下はサンプルプログラムです
struct TestStruct {
int order;
int value;
};
int comp(void* z, const void* x, const void* y)
{
TestStruct* p1 = (TestStruct*)x;
TestStruct* p2 = (TestStruct*)y;
if ( p1->value != p2->value )
{
return p1->value - p2->value; // 比較値が全部同じなのでここには来ない
}
return 0;
}
//qsort_sの使用箇所
const int NUM = 8; // 9以下はバッファが回転する
TestStruct test[NUM];
for (int i = 0; i < NUM; i++)
{
test[i].order = i;
test[i].value = 5;
}
qsort_s((void*)test, sizeof(test) / sizeof(TestStruct), sizeof(TestStruct), comp, test);
以下が qsort_sから返ってきたデータです
test[0] {order=1 value=5 }
test[1] {order=2 value=5 }
test[2] {order=3 value=5 }
test[3] {order=4 value=5 }
test[4] {order=5 value=5 }
test[5] {order=6 value=5 }
test[6] {order=7 value=5 }
test[7] {order=0 value=5 } ← test[0]だったデータがtest[7]に来ている
NUMが9以上だとこの現象が起きずに 9の場合のtest[8] は {order=8, value=5}が返ります。
よろしくお願いいたします。
入力した元の配列の並びを維持するのであれば
int comp(void* z, const void* x, const void* y)
{
TestStruct* p1 = (TestStruct*)x;
TestStruct* p2 = (TestStruct*)y;
if (p1->value != p2->value)
{
return p1->value - p2->value; // 比較値が全部同じなのでここには来ない
}
//return 0;
//return (uint8_t*)x - (uint8_t*)y; //配列の中身のアドレスを比較して、小さいアドレスが先になるようにしてみる
return (x < y) ? -1 : 1; //配列の中身のアドレスを比較して、小さいアドレスが先になるようにしてみる
}
2024-11-13 20:15 64bitビルドで巨大な配列の場合にアドレス減算がintに収まらない可能性の修正