\r
int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer)\r
{\r
+ //戻り値:追加されたタグのIndex\r
//Arrayの末尾にデータを追加する。\r
int index;\r
\r
\r
int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag))\r
{\r
- //戻り値:IsAdded(True/False)\r
+ //戻り値:追加されたタグ、もしくは重複する既存のタグのIndex\r
//int (*IsDuplicated)(void *listtag, void *newtag)は、重複を確認する関数へのポインタ。\r
- //listtagã\81«arrayã\81®ã\81\99ã\81¹ã\81¦ã\81®pointerã\82\92ä¸\8eã\81\88ã\80\81ã\81\99ã\81¹ã\81¦ã\81\8cFalseã\81 ã\81£ã\81\9få ´å\90\88追å\8a ã\81\97ã\81¦Falseã\82\92è¿\94ã\81\99。\r
- //Trueã\81\8cè¿\94ã\81£ã\81\9fæ\99\82ç\82¹ã\81§ã\80\81追å\8a ã\82\92ã\81\9bã\81\9aTrueを返す。\r
+ //listtagã\81«arrayã\81®ã\81\99ã\81¹ã\81¦ã\81®pointerã\82\92ä¸\8eã\81\88ã\80\81ã\81\99ã\81¹ã\81¦ã\81\8cFalseã\81 ã\81£ã\81\9få ´å\90\88追å\8a ã\81\99ã\82\8b。\r
+ //Trueã\81\8cè¿\94ã\81£ã\81\9fæ\99\82ç\82¹ã\81§ã\80\81追å\8a ã\82\92ã\81\97ã\81ªã\81\84ã\81§æ\97¢å\98ã\81®ã\82¿ã\82°ã\81«å¯¾ã\81\99ã\82\8bIndexを返す。\r
int i, i_max;\r
\r
i_max = CHNLIB_UIPArray_GetNumberOfDatas(*array);\r
for(i = 0; i < i_max; i++){\r
if(IsDuplicated(CHNLIB_UIPArray_GetPointerByIndex(*array, i), pointer)){\r
- return False;\r
+ return i;\r
}\r
}\r
\r
- CHNLIB_UIPArray_AppendLast(array, data32, pointer);\r
- \r
- return True;\r
+ return CHNLIB_UIPArray_AppendLast(array, data32, pointer);\r
}\r
\r
int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index)\r
\r
void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array)\r
{\r
- //Array及びdata32==TrueのPointerをFree.\r
+ //Array及びdata32==FalseのPointerをFree.\r
CHNLIB_UIPArray_FreeOnlySelectedPointer(*array);\r
CHNLIB_UIPArray_FreeOnlyArray(array);\r
return;\r
return array->tag[index].pointer;\r
}\r
\r
+void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)\r
+{\r
+ //指定されたdata32を持つindexのデータのPointerを返す。\r
+ return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));\r
+}\r
+\r
int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32)\r
{\r
//指定されたdata32を持つ最小のIndexを返す。\r
return CHNLIB_UIPArray_INDEX_NOTFOUND;\r
}\r
\r
-void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32)\r
+CHNLIB_UIPArray *CHNLIB_UIPArray_CopyArray(const CHNLIB_UIPArray *source)\r
{\r
- //指定されたdata32を持つindexのデータのPointerを返す。\r
- return CHNLIB_UIPArray_GetPointerByIndex(array, CHNLIB_UIPArray_GetIndexByData32(array, data32));\r
+ //sourceと等価な配列を新たに生成して返す。\r
+ CHNLIB_UIPArray *destination;\r
+ int i, i_max;\r
+ \r
+ destination = CHNLIB_UIPArray_Initialize();\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(source);\r
+ \r
+ for(i = 0; i < i_max; i++){\r
+ CHNLIB_UIPArray_AppendLast(&destination, CHNLIB_UIPArray_GetData32ByIndex(source, i), CHNLIB_UIPArray_GetPointerByIndex(source, i));\r
+ }\r
+ \r
+ return destination;\r
+}\r
+\r
+CHNLIB_UIPArray *CHNLIB_UIPArray_SortInDescendingOrderByData32(const CHNLIB_UIPArray *array)\r
+{\r
+ //タグをData32の値で降順(大きい方から小さい方)になるように整列した新たなArrayを返す。\r
+ CHNLIB_UIPArray *sorted, *temp;\r
+ int i, i_max;\r
+ int candidateIndex, candidateData32, currentData32;\r
+ \r
+ sorted = CHNLIB_UIPArray_Initialize();\r
+ temp = CHNLIB_UIPArray_CopyArray(array);\r
+ i_max = CHNLIB_UIPArray_GetNumberOfDatas(temp);\r
+ \r
+ for(i = 0; i < i_max; i++){\r
+ //tempのData32に1を足す(0を追加済みとマークするため)。\r
+ CHNLIB_UIPArray_SetData32ByIndex(temp, i, CHNLIB_UIPArray_GetData32ByIndex(temp, i) + 1);\r
+ }\r
+ \r
+ for(;;){\r
+ candidateData32 = 0;\r
+ for(i = 0; i < i_max; i++){\r
+ currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);\r
+ if(candidateData32 < currentData32){\r
+ candidateData32 = currentData32;\r
+ candidateIndex = i;\r
+ }\r
+ }\r
+ if(candidateData32 == 0){\r
+ break;\r
+ }\r
+ for(i = candidateIndex; i < i_max; i++){\r
+ currentData32 = CHNLIB_UIPArray_GetData32ByIndex(temp, i);\r
+ if(candidateData32 == currentData32){\r
+ //-1を忘れないように\r
+ CHNLIB_UIPArray_AppendLast(&sorted, currentData32 - 1, CHNLIB_UIPArray_GetPointerByIndex(temp, i));\r
+ CHNLIB_UIPArray_SetData32ByIndex(temp, i, 0);\r
+ }\r
+ }\r
+ }\r
+ \r
+ return sorted;\r
}\r
\r
//\r