OSDN Git Service

referenceCountを導入。今のところ正常に動作している。メモリリークについても一部改善。69.67KB(1852/2023)>36.59KB(588/2163)
[chnosproject/CHNOSProject.git] / CHNOSProject / AI003 / AI003 / main.c
index 05fbd0d..0110272 100755 (executable)
@@ -64,12 +64,13 @@ int main(int argc, const char * argv[])
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){\r
                     break;\r
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){\r
-                    sorted = CHNLIB_UIPArray_SortInDescendingOrderByData32(WorkingSet.RootWordList);\r
+                    sorted = CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(WorkingSet.RootWordList);\r
                     i_max = CHNLIB_UIPArray_GetNumberOfDatas(sorted);\r
                     for(i = 0; i < i_max; i++){\r
                         printf("word%3d:%3d:%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(sorted, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(sorted, i)));\r
                     }\r
-                    CHNLIB_UIPArray_FreeOnlyArray(&sorted);\r
+                    //CHNLIB_UIPArray_FreeOnlyArray(&sorted);\r
+                    release(sorted);\r
                 } else if(CHNLIB_String_CompareStringWithCString(temp, "readfile")){\r
                     //::readfile:filename\r
                     readfp = fopen(CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, 4)), "rb");\r
@@ -81,8 +82,9 @@ int main(int argc, const char * argv[])
                 }\r
             }\r
             \r
-            //WorkingSet.SystemWordList0を使っているので、解放しないように注意\r
-            CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
+            ////WorkingSet.SystemWordList0を使っているので、解放しないように注意\r
+            //CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
+            release(separated);\r
         }\r
         \r
         if(!passthink){\r
@@ -90,8 +92,17 @@ int main(int argc, const char * argv[])
             //::readfile:AITestData_ja.txt\r
             AI_Think_LearnWordFromInputString(input);\r
             \r
-            CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);\r
+            //入力履歴を追加\r
+            i = CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, 0, input);\r
+            if(i > AI_INPUT_HISTORY_MAX){\r
+                //履歴の整理\r
+                for(i = 0; i < AI_INPUT_HISTORY_MAX; i++){\r
+                    CHNLIB_UIPArray_RemoveByIndex(&WorkingSet.InputHistory, 0);\r
+                }\r
+            }\r
         }\r
+        \r
+        release(input);\r
     }\r
     \r
     return 0;\r
@@ -117,15 +128,11 @@ void AI_Think_LearnWordFromInputString(CHNLIB_String *input)
         tagIndex = AI_Memory_AddRootWordData(CHNLIB_UIPArray_GetPointerByIndex(candidateWordList, i));\r
         \r
         CHNLIB_UIPArray_SetData32ByIndex(WorkingSet.RootWordList, tagIndex, CHNLIB_UIPArray_GetData32ByIndex(WorkingSet.RootWordList, tagIndex) + CHNLIB_UIPArray_GetData32ByIndex(candidateWordList, i));\r
-        \r
-        if(tagIndex <= maxExistingWordIndex){\r
-            //既存のタグなので、解放されるようにdata32をFalseにしておく。\r
-            CHNLIB_UIPArray_SetData32ByIndex(candidateWordList, i, False);\r
-        }\r
-        //新規追加されたタグについては0以上の値つまりTrueが設定されているはずなので、解放されない。\r
     }\r
-    //data32 == Falseのタグ、つまり既存のタグと同じだったもののみ解放する。\r
-    CHNLIB_UIPArray_FreeSelectedAll(&candidateWordList);\r
+    //すでに存在したタグは追加されていないため、ReferenceCountが1のはずなので、解放される。\r
+    //追加されたタグはReferenceCountが2のため、解放されない。\r
+    release(candidateWordList);\r
+    //CHNLIB_UIPArray_FreeSelectedAll(&candidateWordList);\r
 \r
     return;\r
 }\r
@@ -175,7 +182,7 @@ CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)
             }\r
         }\r
         if(candidatelength > 0){\r
-            CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstr_input, 0, k - 1), CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstrp_input, 0, candidatelength - 1)), &AI_Memory_AddRootWordData_IsDuplicated);\r
+            CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, autorelease(CHNLIB_String_ExtractByLength(input, CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstr_input, 0, k - 1), CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstrp_input, 0, candidatelength - 1))), &AI_Memory_AddRootWordData_IsDuplicated);\r
         }\r
         CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_input, &cstrp_input);\r
     }\r
@@ -290,8 +297,8 @@ void AI_System_InitializeSystemWorkingSet(void)
 {\r
     //WorkingSetを初期化する。\r
     WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();\r
-    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(":"));\r
-    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(","));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(":")));\r
+    CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, autorelease(CHNLIB_String_Initialize(",")));\r
     \r
     WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
     \r
@@ -310,6 +317,7 @@ void AI_System_LoadMemory(const char configfilename[])
     fclose(fp);\r
     \r
     fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
+    release(currentfilename);\r
     \r
     WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
     for(i = 1; ;i++){\r
@@ -318,12 +326,9 @@ void AI_System_LoadMemory(const char configfilename[])
             break;\r
         }\r
         CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
-        //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!\r
+        release(line);\r
     }\r
     fclose(fp);\r
-    CHNLIB_String_Free(currentfilename);\r
-    \r
-    //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);\r
     \r
     return;\r
 }\r