Переинициализация переменной. - страница 2

 
eevviill:

Разработчики. А это как объяснить?

параметр "3"

 Первый алерт выдаёт нормально(всмысле как надо) что тип double. Сразу за ним алерт выдаёт что string

Объясняется очень просто.

Переписал Ваш пример в несколько строк, чтоб было понятнее.

string new_par1 = ind1_parametr1;  // Создаём переменную new_par1 типа string

if( !string_( ind1_parametr1 ) )
{
        double new_par1 = double( ind1_parametr1 );     // Создаём ещё одну переменную с таким же именем, но типа double.
                                                        // При этом первая переменная new_par1(string) будет скрыта.
        Alert( new_par1 );

}       // Здесь вторая переменная new_par1(double) уничтожается и всё, что мы ей присвоили, исчезает безвозвратно.

Alert( new_par1 );  // А здесь мы уже снова видим первую new_par1(string). Её содержимое осталось неизменным.

Переменная может быть только одного типа.

Конечно можно извратиться с классами, но хотелось бы знать, для чего?

Скорее всего, Вам лучше просто сделать две переменные. 

 
Ko1dun:

Объясняется очень просто.

Переписал Ваш пример в несколько строк, чтоб было понятнее.

Переменная может быть только одного типа.

Конечно можно извратиться с классами, но хотелось бы знать, для чего?

Скорее всего, Вам лучше просто сделать две переменные. 

 

Этот параметр должен передаватся в индикатор iCustom. Тип изначально всех переменных string, так как это тестер стрелочных индикаторов.

 

А много там класами извращатся?  

 
Много.
 
Ko1dun:
Много.

А если не кодом, то какой логический порядок действий?

 
eevviill:

Мне нужно поменять тип переменной при определённой ситуации.

Вряд ли. Какая исходная цель?

 

> А если не кодом, то какой логический порядок действий? 

Я плохо понимаю, что Вам нужно.

Может покажете свой код.

 
TheXpert:

Вряд ли. Какая исходная цель?

ind1_up=iCustom(Symbol(),0,ind1_name,new_par1,

Передача значения в iCustom 

 
Ko1dun:

Я плохо понимаю, что Вам нужно.

Может покажете свой код.

 

extern string ind1_parametr1 = "3";

char Sig_f()
{
string new_par1 = ind1_parametr1; 
if(!string_(ind1_parametr1)) double new_par1=double(ind1_parametr1);

double ind1_up=iCustom(Symbol(),0,ind1_name,new_par1,
...
}

//////////////////////////////////////////////////////////////////////
bool string_(string par)
{
if(StringLen(par)==StringLen(string(double(par)))) return(false);

return(true);
}
 

Из этого кода не видно необходимости в извращениях.

Вот нормальный вариант: 

extern string ind1_parametr1 = "3";

void Sig_f()
{
   if( !string_( ind1_parametr1 ) ){
      double new_par1 = double( ind1_parametr1 );
      
      double ind1_up = iCustom( Symbol(), 0, ind1_name, new_par1,
      ...
   }
   else {
      string new_par1 = ind1_parametr1; 
      
      double ind1_up = iCustom( Symbol(), 0, ind1_name, new_par1,
      ...
   }

}

//////////////////////////////////////////////////////////////////////
bool string_( string par )
{
   int len = StringLen( par );
   
   for( int i = 0; i < len; i++ ){
      ushort ch = StringGetCharacter( par, i );
      switch( ch ){
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
         case '.':
            break;
         default:
            return true;
      }
   }
   return false;
}
 
Ko1dun:

Из этого кода не видно необходимости в извращениях.

Вот нормальный вариант: 

Там ещё за пераметром 1 в индикатор передаются 20. Гы гы гы.

Я понял. Не реально. 

 

Хотя всё просто. Пусть разработчики удаление #define введут, а то как то странно создавать можно, удалять нет.

#undef 

Причина обращения: