string 2 double, и обратно - страница 2

 

Такую библиотеку написал давно. Была задача обмениваться данными между программами одного окна.

Для решения более глобальных проблем можно эту библиотеку освоить.

 
sergeev:


GlobalVariableSet(name+"."+val, true);

при чтении GV выбираем их по идентификатору name+"."

если val величина переменная (неизвестная, которую нужно сохранить) то как спрашивается получить имя этой самой переменной если оно не известно (неизвестна его часть).

 

Как-то писал от нечего делать:

void gGVSetText(string aGVName,string aText){
   int tTextLen;
   int tArSize;
   int tAr[];
   fConvertStrToIntAr(aText,tAr,tTextLen,tArSize);
   GlobalVariableSet(aGVName,tTextLen);
      for(int ti=0;ti<tArSize;ti++){
         GlobalVariableSet(aGVName+"_"+ti,tAr[ti]);
      }
}


string gGVGetText(string aGVName){
   int tTextLen=GlobalVariableGet(aGVName);
   int tArSize=MathCeil(0.25*tTextLen);
   int tAr[];
   ArrayResize(tAr,tArSize);
      for(int ti=0;ti<tArSize;ti++){
         tAr[ti]=GlobalVariableGet(aGVName+"_"+ti);
      }
   return(fConvertArrToStr(tAr,tTextLen));
}

bool gGVCheckAndGetText(string aGVName,string & aText){
      if(!GlobalVariableCheck(aGVName)){
         return(false);
      }   
   int tTextLen=GlobalVariableGet(aGVName);
   int tArSize=MathCeil(0.25*tTextLen);
   int tAr[];
   ArrayResize(tAr,tArSize);
      for(int ti=0;ti<tArSize;ti++){
            if(!GlobalVariableCheck(aGVName+"_"+ti)){
               return(false);
            }      
         tAr[ti]=GlobalVariableGet(aGVName+"_"+ti);
      }
   aText=fConvertArrToStr(tAr,tTextLen);
   return(true);
}

 

string fConvertArrToStr(int aArray[],int aStrLen){
   string tRetStr="";
   int tPointer;
   int tShift;
      for(int ti=0;ti<aStrLen;ti++){
         tPointer=ti/4;
         tShift=(ti-4*tPointer)*8;
         tRetStr=tRetStr+CharToStr(aArray[tPointer] >> tShift & 0x000000FF);
      }
   return(tRetStr);
}
Может быть не все правильно.
 
Zhunko:

Такую библиотеку ... можно эту библиотеку освоить.

Спасибо за подсказку Вадим, придется и мне написать нечто подобное. Мне универсальность функций не нужна а нужно максимально сократить время выполнения. Буду придумывать нечто специальное-скорострельное...
 
f.t.:

если val величина переменная (неизвестная, которую нужно сохранить) то как спрашивается получить имя этой самой переменной если оно не известно (неизвестна его часть).

Перебором всех глобальных переменных....
 
AlexSTAL:
Перебором всех глобальных переменных....

GlobalVariableName(i) - это совсем не так как хотелось, но возможно комуто и подойдет :)

 
f.t.:

если val величина переменная (неизвестная, которую нужно сохранить) то как спрашивается получить имя этой самой переменной если оно не известно (неизвестна его часть).


я ведь написал (и думаю для вас это не открытие) - что поиск переменной идет по префиксу name+"."
 
sergeev:
я ведь написал (и думаю для вас это не открытие) - что поиск переменной идет по префиксу name+"."
да-да, конечно.... просто мне нужно было ПРЯМОЕ (и быстрое) получение по имени, поскольку переменных предвидится очччень много и циклических переборов по именам мне нужно избежать.
 

С побитовым представлением целых числе все однозначно, с вещественными - нет (может быть даже зависимость от процессоров разных производителей).

Целочисленные 8-ми байтовые числа могут содержать 2^64 < 10^19 различных целых чисел. Точно такое же количество различных вещественных чисел может содержать 8-ми байтовый double. Но только у double диапазон значительно больше 2^64. Это достигается за счет того, что многие числа (например, целые) не представимы в double. Т.е. существует такое целое число N и его double-представление M, что для числа N + 1 его double-представление тоже будет M.

Все целые числа из диапазона 2^32 содержатся в double. Поэтому вы можете элементарно сохранять строчки длинной в 4 символа в double.

 
f.t.:
да-да, конечно.... просто мне нужно было ПРЯМОЕ (и быстрое) получение по имени, поскольку переменных предвидится очччень много и циклических переборов по именам мне нужно избежать.

я конечно могу ошибаться, но в самом GlobalVariableGet/Set присутствует перебор, только скрытый в недрах МТ.
поэтому проход по списку с GlobalVariableName не очень замедлит процесс. хотя конкретных опытов не ставил...

с другой стороны если вы планируете так сильно "напрягать" большим числом GV, то наверно проще делать свой GV, с возможностью сохранять строки.

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