fix find with 2 args after https://codereview.scilab.org/#/c/17216/ 44/17544/3
Antoine ELIAS [Fri, 4 Dec 2015 12:37:45 +0000 (13:37 +0100)]
Change-Id: Ie94e400e4fe2db3c4f3401f734a3b51b7d33753b

scilab/modules/boolean/sci_gateway/cpp/sci_find.cpp
scilab/modules/boolean/tests/unit_tests/find.dia.ref
scilab/modules/boolean/tests/unit_tests/find.tst

index c04887c..ba5b878 100644 (file)
@@ -38,13 +38,19 @@ types::Function::ReturnValue sci_find(types::typed_list &in, int _iRetCount, typ
 
     if (in.size() == 2)
     {
-        if (in[1]->isDouble() == false || in[1]->getAs<types::Double>()->isScalar() == false || in[1]->getAs<types::Double>()->get(0) <= 0)
+        if (in[1]->isDouble() == false || in[1]->getAs<types::Double>()->isScalar() == false)
+        {
+            Scierror(999, _("%s:  Wrong type for input argument #%d: Scalar positive integer expected.\n"), "find", 2);
+            return types::Function::Error;
+        }
+
+        iMax = (int)in[1]->getAs<types::Double>()->get()[0];
+        if (iMax <= 0 && iMax != -1)
         {
             Scierror(999, _("%s:  Wrong type for input argument #%d: Scalar positive integer expected.\n"), "find", 2);
             return types::Function::Error;
         }
 
-        iMax = (int)in[1]->getAs<types::Double>()->get(0);
     }
 
     int* piIndex = 0;
@@ -66,7 +72,7 @@ types::Function::ReturnValue sci_find(types::typed_list &in, int _iRetCount, typ
         int size = pB->getSize();
         int* p = pB->get();
         iMax = iMax == -1 ? size : std::min(iMax, size);
-        for (int i = 0 ; i < iMax ; i++)
+        for (int i = 0 ; i < size && iValues < iMax ; i++)
         {
             if (p[i])
             {
@@ -81,7 +87,7 @@ types::Function::ReturnValue sci_find(types::typed_list &in, int _iRetCount, typ
         int size = pD->getSize();
         double* p = pD->get();
         iMax = iMax == -1 ? size : std::min(iMax, size);
-        for (int i = 0; i < iMax; i++)
+        for (int i = 0; i < size && iValues < iMax; i++)
         {
             if (p[i])
             {
@@ -100,7 +106,7 @@ types::Function::ReturnValue sci_find(types::typed_list &in, int _iRetCount, typ
         int *pCols = pRows + iNNZ;
         iMax = iMax == -1 ? iNNZ : std::min(iMax, iNNZ);
 
-        for (int i = 0; i < iMax; i++)
+        for (int i = 0; i < iNNZ && iValues < iMax; i++)
         {
             piIndex[iValues] = (pCols[i] - 1) * iRows + (pRows[i] - 1);
             iValues++;
@@ -119,7 +125,7 @@ types::Function::ReturnValue sci_find(types::typed_list &in, int _iRetCount, typ
         int* pCols = pRows + iNNZ;
 
         iMax = iMax == -1 ? iNNZ : std::min(iMax, iNNZ);
-        for (int i = 0; i < iMax; i++)
+        for (int i = 0; i < iNNZ && iValues < iMax; i++)
         {
             piIndex[iValues] = (pCols[i] - 1) * iRows + (pRows[i] - 1);
             iValues++;
index 2e003cc..0090c7a 100644 (file)
@@ -9,4 +9,9 @@
 //
 a = zeros(1,2000);
 a(1:2:2000)=1:1000;
-assert_checkequal(and(find(a==0)==(2:2:2000)), %T);
+assert_checktrue(and(find(a==0)==(2:2:2000)));
+//with 2nd arg
+a = 1:10;
+assert_checkequal(find(a > 5, 2), [6 7]);
+assert_checkequal(find(a > 5, 10), [6 7 8 9 10]);
+assert_checkequal(find(a > 5), [6 7 8 9 10]);
index 8ac43ed..6a4d798 100644 (file)
 a = zeros(1,2000);
 a(1:2:2000)=1:1000;
 
-assert_checkequal(and(find(a==0)==(2:2:2000)), %T);
\ No newline at end of file
+assert_checktrue(and(find(a==0)==(2:2:2000)));
+
+//with 2nd arg
+a = 1:10;
+assert_checkequal(find(a > 5, 2), [6 7]);
+assert_checkequal(find(a > 5, 10), [6 7 8 9 10]);
+assert_checkequal(find(a > 5), [6 7 8 9 10]);