Форум трейдеров » Торговые стратегии » Бета-тестинг
+ Подписаться
Страница 14 из 58 ПерваяПервая ... 4121314151624 ... ПоследняяПоследняя
  1. 293
    Комментарии
    1
    Темы
    293
    Репутация Pro
     
    В начале пути

    2 Медалей
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Где засада-то?
    Не очень понятно что и как объявлено вне функции и как оно туда передается и что возвращает функция, но рискну предположить.
    Возвращается идентификатор не как указатель на массив чаров а сам массив.
    В первом случае работает потому что переопределен оператор = и он копирует массив в память по адресу указателя.(адрес сей уже выделен при инициализации new)
    Во втором случае указателю присваивается не адрес где искать массив а значение из массива(может будет работать через указ=@функция()
    или
    указ=new char [size];
    указ=функция() -копировать ).
    Вариант второй
    и еще подумалось, память выделенная под свои обьекты внутри функции будет очищена по ее заверешнию в большинстве компиляторов. Может и сохраняется указатель туда где был массив но лучше его скопировать все в память выделенную при иниц указателя. Этот варинт более правдоподобен.
  2. 2,947
    Комментарии
    17
    Темы
    2950
    Репутация Pro
    Аватар для Mr.WT  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от morf Посмотреть сообщение
    То есть на Висту сейчас лицензию The Wild Cat's Strategics лучше не покупать?
    Вообще-то однозначного ответа нет. Если у вас начальная лицензия под Вистой нормально отработала - можно и полноценную купить. А если вы пока ещё под Висту начальную не оформляли - тогда лучше и не надо, подождите. Я здесь объявлю, когда будет готов новый пакет.
    Цитата Сообщение от mihas Посмотреть сообщение
    Возвращается идентификатор не как указатель на массив чаров а сам массив.
    Вот это похоже на истину. Но опять же совершенно непонятно, почему так происходит. Компилятор знает, что в функцию передаётся указатель. Компилятор знает, что адрес массива, полученного в результате вызова библиотечной функции, должен быть присвоен переданной переменной. Более того - компилятор всё это делает правильно. Там не только strlen(buf) проверяется, я делал вывод на консоль массива по адресу сразу перед return(0) и сразу после. Первый вывод правильно показывает ид компа, второй - уже фигню всякую.
    В общем, заморачиваться на эту ситуёвину я не стал, просто всё сделал без разбивки на разные функции. Однако всё таки данная "фантастика" весьма интересна :D
  3. 2,947
    Комментарии
    17
    Темы
    2950
    Репутация Pro
    Аватар для Mr.WT  
    Мастер форумных наук

    5 Медалей
    Вот, чтоб было понятнее:
    Код:
    int func(char * buf) {
    ...
    if(strlen(buf) != 19) return(5);
    puts(buf);
    return(0);
    }
    
    ...
    _ret = func(hwid_buf);
    if ( _ret == 0 ) puts(hwid_buf);
    Вывод на консоль при этом такой:
    [правильный ид компа]
    [всякая фигня]
    Дас ист фантастишь! :D
  4. 293
    Комментарии
    1
    Темы
    293
    Репутация Pro
     
    В начале пути

    2 Медалей
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Первый вывод правильно показывает ид компа, второй - уже фигню всякую.
    Однако всё таки данная "фантастика" весьма интересна :D
    Нет тут фантастики. Если все так, то это стандарт. Работая с памятью внутри функции или подпрограммы во всех языках если нет априори выделенной области памяти куда это все будет сохранятся создастя локальное адресное пространство и когда функия завершится и будет возврат к основной программе (pop из стека) адреса испортятся. Вся адресация относительная.
    Это как обьявить внутри функции int a , сохранить в него результат получить a_ptr=@a и прочитать после завершения функции что теперь по адресу a_ptr где было а. Естественно не будет там a
    Можно правдо обьявить пространство имен и закрепить адреса за переменными, но ....
    Этого всего можно избежать если в конструкторе выделить память под буффер new, а в функциях работать с этими адресами присваивая им значения.
  5. 2,947
    Комментарии
    17
    Темы
    2950
    Репутация Pro
    Аватар для Mr.WT  
    Мастер форумных наук

    5 Медалей
    Цитата Сообщение от mihas Посмотреть сообщение
    Нет тут фантастики.
    Фантастика тут есть. И она происходит исключительно при вызове LoadLibrary. Если переопределить данную функцию и сделать её локальной, а не добывать из отдельной длл, всё будет работать правильно.
  6. 293
    Комментарии
    1
    Темы
    293
    Репутация Pro
     
    В начале пути

    2 Медалей
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Фантастика тут есть. И она происходит исключительно при вызове LoadLibrary. Если переопределить данную функцию и сделать её локальной, а не добывать из отдельной длл, всё будет работать правильно.
    Мне кажется будет, но не всегда. До тех пор пока не будет чем то "убит" этот адресс памяти, который теперь "свободен" и не обязан хранить значения присвоенные ранее. Такая работа с памятью может вызывать плавающие ошибки.
    Т.е мой пред. пример с переменной а. Если програмка простая то ptr_A все еще будет содержать адресс по кторому записано а, но если подргузить что либо большое в память может там уже быть бяка
  7. 2,947
    Комментарии
    17
    Темы
    2950
    Репутация Pro
    Аватар для Mr.WT  
    Мастер форумных наук

    5 Медалей
    Не, не... Минутку.
    Мы в функции выделяем некоторый объём памяти для хранения данных определённого типа. Это - "наша" область памяти, то есть текущей функции. Если мы теперь вызовем внутри другую функцию и передадим ей адрес нашей области в качестве аргумента, эта другая функция при своём завершении просто не сможет очистить или "убить" что-то, хранящееся не в её границах. Иначе бы возник Access Violation. Конечно, попытаться очистить непринадлежащую ему память может компилятор, а не функция. Но это уже баг компилятора. Потому что он должен знать, что ему можно чистить, а что - нельзя.
    Ситуация с передачей указателей в другие функции - это обычная, распространённая ситуация. Если б это не работало, у нас бы вообще не было никакого софта :)
  8. 2,947
    Комментарии
    17
    Темы
    2950
    Репутация Pro
    Аватар для Mr.WT  
    Мастер форумных наук

    5 Медалей
    mihas, поясню на вышеприведённом примере:
    Код:
    int func(char * buf) {
    int a, b, c;
    ...
    if(strlen(buf) != 19) return(5);
    puts(buf);
    return(0);
    }
    
    ...
    _ret = func(hwid_buf);
    if ( _ret == 0 ) puts(hwid_buf);
    Здесь при вызове функции func() локальные переменные a, b, c имеют полное право быть очищенными компилятором при возврате в основную функцию. Эта область памяти тем не менее не будет доступна для других программ, пока не завершится текущая программа. Однако память, выделенная под hwid_buf должна быть сохранена в целости - это память текущей работающей функции.
    Теперь посмотрим, как мы определили саму функцию - int func(char * buf)
    Компилятор видит, что в функцию должен передаться адрес, под который необходимо создать локальную переменную buf и потом работать с ней, как с пойнтером. При завершении функции компилятор может очистить локальные переменные a, b, c, и buf, но при этом будет очищен лишь сам пойтер, никак не данные по адресу.
  9. 293
    Комментарии
    1
    Темы
    293
    Репутация Pro
     
    В начале пути

    2 Медалей
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    mihas, поясню на вышеприведённом примере:
    Код:
    int func(char * buf) {
    int a, b, c;
    ...
    if(strlen(buf) != 19) return(5);
    puts(buf);
    return(0);
    }
    
    ...
    _ret = func(hwid_buf);
    if ( _ret == 0 ) puts(hwid_buf);
    Здесь при вызове функции func() локальные переменные a, b, c имеют полное право быть очищенными компилятором при возврате в основную функцию. Эта область памяти тем не менее не будет доступна для других программ, пока не завершится текущая программа. Однако память, выделенная под hwid_buf должна быть сохранена в целости - это память текущей работающей функции.
    Теперь посмотрим, как мы определили саму функцию - int func(char * buf)
    Компилятор видит, что в функцию должен передаться адрес, под который необходимо создать локальную переменную buf и потом работать с ней, как с пойнтером. При завершении функции компилятор может очистить локальные переменные a, b, c, и buf, но при этом будет очищен лишь сам пойтер, никак не данные по адресу.
    Сам поинтер очищен быть не может если он обьвлен до вызова Ф. Поинтер это переменная, а глобальные переенные передаются внутрь функций модифицируются и используются дальше вне их. Что такое переменная... это указатель в таблицу имен по кторому хранится адресс памяти для значения перемнной.
    Почему если обьявить локалькую перем. в функции она пропадет по заверешнии(не адресс пропадет на это место, его можно сохранить, а само значение в памяти), а заполненный
    кусочек памяти под буфер должен остатся ? Он останется в 2х случаях. 1 если его размещать по адресу где до вызова функции выделенна память. 2 если его куда-то скопировать.

    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Мы в функции выделяем некоторый объём памяти для хранения данных определённого типа. Это - "наша" область памяти, то есть текущей функции. Если мы теперь вызовем внутри другую функцию и передадим ей адрес нашей области в качестве аргумента, эта другая функция при своём завершении просто не сможет очистить или "убить" что-то, хранящееся не в её границах
    Все верно,но
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Компилятор видит, что в функцию должен передаться адрес, под который необходимо создать локальную переменную buf и потом работать с ней, как с пойнтером.
    в функцию должен передаться адрес...
    под который необходимо создать локальную переменную buf
    Где это указано ? Компилятору о столь хитром плане ничего не известно.
    Компилятор видит,в функцию должна передаться переменная содержащая како-то адресс. В эту переменную нужно записать адресс начала блока памяти полученного после выполнения GetHardwareID. Блока локального.
    Может я не понял чего-то.
    мне кажется все должно начать работать если выделить память по адресу указателя и писать значения GetHardwareID туда, а не наоборот.
  10. 44
    Комментарии
    0
    Темы
    44
    Репутация Pro
     
    Новичок

    2 Медалей
    Цитата Сообщение от Mr.WT Посмотреть сообщение
    Парни,
    я буду весьма доволен, если вы свой комп изучите как свои пять пальцев...
    Тогда все проблемы вам будут просто пофик.
    Останется лишь делом заняться.

    А дел много. У меня есть часа два в сутках, дабы проблемы решить с Вистой. Честно говоря, не хватает...
    И даже более того скажу - вполне возможно, что Виста окажется в опале. Да. Извините, все претензии - к дяде Биллу.
    Уважаемый Mr.WT.
    У меня на компьютере установлено две копии МТ4. Инсталляция комплекса WCS для каждого терминала проведена отдельно Не без проблем мне удалось перенести файл WCS_License.dat в корень системного диска С из временной папки Tmp. Регистрация
    моей лицензии произошла не сразу. Сначала появилось множество разных сообщений на русском языке,а потом и на английском "Error attempfing to connect. Connection timeout or network unreacheble."
    Терпение моё кончилось и я удалил оба МТ4 вместе WCS ,а
    затем инсталлировал всё заново.
    В результате получил сообщение "YOUR LICENSE IS SUCCESSFULLI REGISTERED". И всё стало работать на обоих терминалах нормально. Это было вчера.
    А сегодня на обоих терминалах появился СИГНАЛ - "Ошибка системы контроля.Время лицензиина ДАННОМ компьютере истекло"
    И комплекс WCS работать перестал.

    Не могу понять почему на ДАННОМ компьютере. Нужен другой?
    Посоветуйте, пожалуйста, что предпринять. (А лицензию я приобрёл 19 апреля 2009г. на полгода)

Вверх
РегистрацияX

чтобы писать, читать, комментировать