C++のqsort_sを使用して並び替えが起きない場合、先頭のデータが最後に移動するのを回避したい

MFCプログラマー 141 評価のポイント
2024-11-13T08:45:10.1633333+00:00

開発環境は 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}が返ります。

よろしくお願いいたします。

C++
C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
24 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 10,321 評価のポイント MVP
    2024-11-13T09:00:38.8833333+00:00

    入力した元の配列の並びを維持するのであれば

    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に収まらない可能性の修正


0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。