﻿# V656\. Variables are initialized through the call to the same function\. It's probably an error or un\-optimized code\.

Анализатор обнаружил потенциальную ошибку, найдя в коде инициализацию двух различных переменных одинаковыми выражениями\. Анализатор считает опасными не все выражения, а только в которых используется вызов функций\.

Рассмотрим наиболее простой случай:

```cpp
x = X();
y = X();
```

Возможны три варианта действий:

1\) Код содержит ошибку\. Необходимо исправить ошибку, заменив 'X\(\)' на 'Y\(\)'\.

2\) Код верен, но работает медленно\. Если функция 'X\(\)' требует много вычислений, то лучше написать 'y \= x;'\.

3\) Код верен и работает быстро\. Или функция 'X\(\)' читает значение из файла\. Тогда чтобы избавиться от ложного срабатывания, можно использовать комментарий "//\-V654"\.



Теперь рассмотрим реальный пример:

```cpp
while (....)
{
  if ( strstr( token, "playerscale" ) )
  {
    token = CommaParse( &text_p );
    skin->scale[0] = atof( token );
    skin->scale[1] = atof( token );
    continue;
  }
}
```

В данном коде нет ошибки\. Однако код не оптимален\. Его можно  переписать таким образом, что бы исключить лишний вызов функции 'atof'\. Учитывая то, что присваивание находится в цикле и может быть вызвано много раз, такое изменение может привести к заметному выигрышу в быстродействии функции\. Исправленный вариант кода:

```cpp
while (....)
{
  if ( strstr( token, "playerscale" ) )
  {
    token = CommaParse( &text_p );
    skin->scale[1] = skin->scale[0] = atof( token );
    continue;
  }
}
```



Рассмотрим ещё один пример:

```cpp
String path, name;
SplitFilename(strSavePath, &path, &name, NULL);
CString spath(path.c_str());
CString sname(path.c_str());
```

В данном примере присутствует явная ошибка\. Переменная 'path' используется два раза: для инициализации переменных 'spath' и 'sname'\. Однако, по логике программы видно, что для инициализации переменной 'sname' должна быть использована переменная 'name'\. Исправленный вариант кода:

```cpp
....
CString spath(path.c_str());
CString sname(name.c_str());
```