Я использую код ниже в приложении Android. В некоторых телефонах код работает правильно, как и ожидалось. В других случаях переменная неожиданно меняет свое значение.
Пример LogCat из некоторых тестов:
03-27 13:38:59.628 17735-17735/? I/System.out: my_var=1.0
03-27 13:38:59.651 17735-17740/? I/zygote: Do partial code cache collection, code=448KB, data=496KB
03-27 13:38:59.652 17735-17740/? I/zygote: After code cache collection, code=446KB, data=495KB
Increasing code cache capacity to 2MB
03-27 13:38:59.693 17735-17735/? I/System.out: my_var=0.0
РЕДАКТИРОВАТЬ: я пытался создать минимальный метод, показывающий неожиданное поведение; в этом случае my_var меняет значение за пределы l oop, которое я указывал ранее; Я не мог видеть сообщения зиготы в этих тестах; Тем не менее, я думаю, что неожиданное поведение может быть связано с изменениями в кеше. Неожиданное поведение происходит только в некоторых телефонах (~ 6-дюймовый телефон LGE LG-Q710AL Android 8.1.0 API 27). Спасибо вам за ваше время. Любая помощь будет принята с благодарностью.
public double[] my_method(double[] array, String my_string) {
/*
Example of LogCat:
(exit 1) my_var=1.0
(exit 2) my_var=1.0
(exit 3) my_var=1.0
(exit 4) my_var=0.0 <=== SHOULD BE 1.0
*/
for (int i=0; i<2500; i++) //example of input_array.
array[i]=66.4079;
my_string="string_1"; //example of input_string.
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int result = -1;
int max = 1;
int count=0;
double number_8=0;
int number_of_items=array.length;
int[] array_of_items_multiplied = new int[number_of_items];
double my_var=10;
if ( my_string.equals("string_1") )
my_var=1; //selected case
else if ( my_string.equals("string_2") )
my_var=100;
double [] other_array = new double[100];
double number_1 = number_of_items/100.0;
int number_2=0;
double number_3=0;
int number_4=0;
boolean bool_1=false;
double number_5= ( my_string.equals("string_1") ) ? 66.4079 : 0;
int number_6=0;
double auxVar_array_i=0;
for (int i=0; i<number_of_items; i++) {
array_of_items_multiplied[i]=(int)Math.round(array[i]*my_var);
if ( i >= (int)(number_2*number_1)
&&
i < (int)((number_2+1)*number_1)
)
{
if ( bool_1==false
&& auxVar_array_i!=number_5
)
{
number_6++;
if (number_6>23)
bool_1=true;
}
number_3+=auxVar_array_i;
number_4++;
}
else {
if (number_4!=0)
other_array[number_2]=(number_3/number_4);
else {
other_array[number_2]=(number_3);
}
number_3=auxVar_array_i;
number_4=1;
number_2++;
if (number_2>99) {
number_2=99;
}
}
}
System.out.println("(exit 1) my_var="+my_var);
if (number_4!=0)
other_array[number_2]=(number_3/number_4);
else {
other_array[number_2]=(number_3);
}
System.out.println("(exit 2) my_var="+my_var);
for (int arrayItem : array_of_items_multiplied) {
if (map.get(arrayItem) != null) {
count = map.get(arrayItem);
count++;
map.put(arrayItem, count);
if (count > max) {
max = count;
result = arrayItem;
}
}
else
map.put(arrayItem, 1);
}
System.out.println("(exit 3) my_var="+my_var);
for (double number_7: other_array)
number_8+=number_7;
number_8=number_8/100.0;
System.out.println("(exit 4) my_var="+my_var);
double number_9=(double)result;
double number_10=0;
if (result==-1 && max==1) {
number_9=number_8*my_var;
number_10=1;
}
double[] another_array=new double[102];
another_array[0]=(number_9/my_var);
another_array[1]=number_10;
System.arraycopy(other_array, 0, another_array, 2, 100);
return another_array;
}