Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
22 страниц V  « < 3 4 5 6 7 > »   
Ответить в данную темуНачать новую тему
> Курилка программистов, Флуд на около программерские темы
autistic
сообщение 12.11.2016, 12:04
Сообщение #81


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


saas, тогда все должно работать http://rextester.com/BHL91516


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 12.11.2016, 13:50
Сообщение #82


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 12.11.2016, 12:02) *
saas, тогда все должно работать http://rextester.com/BHL91516

У тебя typedef в паблик секции, перенеси его в private(в сталкере class без модификатора)
Типа такого: http://rextester.com/ETMLJ41638
Студия его собирает, а clang и gcc выдают ошибку.
Перейти в начало страницы
 
autistic
сообщение 12.11.2016, 14:16
Сообщение #83


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 12.11.2016, 15:48) *
Студия его собирает, а clang и gcc выдают ошибку.

да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом.


--------------------
nop
Перейти в начало страницы
 
abramcumner
сообщение 12.11.2016, 15:15
Сообщение #84


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 12.11.2016, 14:14) *
да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом.

Под Debug на Visual Studio 2015 Update 3 вызывается, как и положено CEffectorCam::ProcessCam. Но баг я все равно вижу. Однозначно в чем-то другом.

Хотя нет, у меня похоже https://github.com/OpenXRay/xray-16/issues/117
Когда идешь по диагонали и перезаряжаешься, что-то мелькает на экране

А еще есть такой: https://github.com/OpenXRay/xray-16/issues/121

Сообщение отредактировал abramcumner - 12.11.2016, 15:18
Перейти в начало страницы
 
Shoкer
сообщение 12.11.2016, 16:27
Сообщение #85


Кандидат Игровых Наук
******************

Репутация:   2153  
Группа: Участник
Сообщений: 3488
Награды: 4
Регистрация: 27.07.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


У меня только Update 1 стоит. Юзаю релизную сборку.
Вот тут код чуть более похожий на тот, что в движке - http://rextester.com/LVBODH52203
Однако тут он выдаёт корректный результат.

Сейчас полез в игру в эти же самые функции, видоизменил (кастрировал) их так чтобы они примерно соответствовали примеру из rextester.com, собрал ... и в игре всё вызывается как положено. Откатил изменения - снова идёт некорректный вызов.

Подсунул игре такой код:

Код
BOOL CAnimatorCamLerpEffector::ProcessCam(SCamEffectorInfo& info)
{
    Msg("Test1"); // Корректно
    inherited::inherited::ProcessCam(info);
    Msg("Test2");
    if(!inherited::inherited::ProcessCam(info))    return FALSE;  // Некорректно

И в итоге оказалось что первая строка вызывается "правильно" (CEffectorCam), а вот вторая где if уже некорректно (CAnimatorCamEffector) o_O.gif

UPD1: Вот удалось воспроизвести ошибку - http://rextester.com/JBGUB72847
Как же так происходит? ._. Возможно ошибка кроется в том что у меня старый апдейт, к вечеру попробую обновить. (хотя на rextester то наверно самая последняя версия компилятора стоит)

Хотелось-бы хотя бы заставить компилятор валиться при таких ошибках, подобно тому как это происходит в gcc.

UPD2: Похоже вся проблема возникает из-за знака отрицания !, если убрать его из CAnimatorCamLerpEffector то всё опять-же работает корректно. Следует заметить что я не просто так возвращаю int а не bool, потому что сами GSC там используют макросы FALSE (int 0) и TRUE (int 1) вместо булевых значений.

UPD3: Заменил все int на bool - ошибка осталась: http://rextester.com/ONYXUT27881
Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему?

Сообщение отредактировал Shoкer - 12.11.2016, 16:53


--------------------
Мне просто нравятся синие буквы под сообщением.
Перейти в начало страницы
 
abramcumner
сообщение 12.11.2016, 17:03
Сообщение #86


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Shoкer @ 12.11.2016, 16:25) *
Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему?

Скорее всего все дело в глюках студии smile.gif Типа этого: https://connect.microsoft.com/VisualStudio/...Details/2000179
или этого: https://connect.microsoft.com/VisualStudio/...Details/2016129

Если интересно, можешь проверить дебажную сборку или в релизе отключить оптимизации.
Перейти в начало страницы
 
Shoкer
сообщение 12.11.2016, 17:36
Сообщение #87


Кандидат Игровых Наук
******************

Репутация:   2153  
Группа: Участник
Сообщений: 3488
Награды: 4
Регистрация: 27.07.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Собрал только xrGame без оптимизации - ошибка осталась. Попробую ещё на третий апдейт перейти, потом отпишусь о результатах.


--------------------
Мне просто нравятся синие буквы под сообщением.
Перейти в начало страницы
 
RayTwitty
сообщение 12.11.2016, 18:20
Сообщение #88


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Shoкer, самое лучшее решение - собирать в той студии (и вообще с теми же компонентами) - что и разработчики. Тогда гарантированно будет правильный результат. Да, новые студии лучше и все такое, но появляются такие баги как у тебя.

У меня например, были странные баги (ТЧ) пока не поставил SP1 на 10 студию, а именно: при нажатии на кнопку в меню "Загрузить послед. сохран. игру" игра тупо висла, а с новым xrSound вообще не запускалась (вылетала на стадии синхронизации).

Но это мое имхо конечно же. Можно и потанцевать с новыми студиями, тут каждый сам решает.

Сообщение отредактировал RayTwitty - 12.11.2016, 18:37


--------------------
Перейти в начало страницы
 
autistic
сообщение 12.11.2016, 20:10
Сообщение #89


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Shoкer @ 12.11.2016, 18:25) *
Вот удалось воспроизвести ошибку - http://rextester.com/JBGUB72847

да, действительно есть проблема, вот ассемблерный выхлоп проблемной строчки кода:
Код
; 37   :         if (!inherited::inherited::ProcessCam())    return 0;

    mov    ecx, DWORD PTR _this$[ebp]
    call    ?ProcessCam@CAnimatorCamEffector@@UAEHXZ; CAnimatorCamEffector::ProcessCam

из которого следует, что вызывается не тот метод.
решения мне в данной ситуации видится два:
1. плохое решение
2. хорошее решение

объяснить это можно тем, что С++ контекстно-зависимый язык, т.е. некоторые похожие конструкции несут совершенно различную функциональность в разных контекстах, например:
Код
template <int N> void f(int v)
{
    (void *)v;
}

int main()
{
    int s = 123;
    int k = 1234;
    
    f<11>(k);
    s<11>(k);
    
    return 0;
}


и некоторые малоочевидные конструкции могут сбивать компилятор с толку.

Сообщение отредактировал refuse - 12.11.2016, 20:11


--------------------
nop
Перейти в начало страницы
 
Shoкer
сообщение 12.11.2016, 21:53
Сообщение #90


Кандидат Игровых Наук
******************

Репутация:   2153  
Группа: Участник
Сообщений: 3488
Награды: 4
Регистрация: 27.07.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


> s<11>(k);
Действительно, как этот код вообще собирается o_O.gif, хотя его даже gcc переваривает. (Я правда в шаблоны слабоват)

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

Сообщение отредактировал Shoкer - 12.11.2016, 21:54


--------------------
Мне просто нравятся синие буквы под сообщением.
Перейти в начало страницы
 
autistic
сообщение 12.11.2016, 21:58
Сообщение #91


Геймер
******

Репутация:   86  
Группа: Участник
Сообщений: 128
Награды: 4
Регистрация: 05.05.2012




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Shoкer @ 12.11.2016, 23:51) *
как это код вообще работает

все просто, на самом деле это логическое выражение, расставь пробелы и сразу станет понятно

Цитата(Shoкer @ 12.11.2016, 23:51) *
как выявить подобные ошибки в остальных файлах проекта

только переписывать проблемные участки кода, я бы вообще от этого тайпдефа отказался, либо использовал using из С++11. еще можно багрепорт засабмитить в мелкософт.


--------------------
nop
Перейти в начало страницы
 
Молния в вакууме
сообщение 12.11.2016, 22:52
Сообщение #92


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(refuse @ 12.11.2016, 21:08) *
1. плохое решение
2. хорошее решение

Можно ещё скобки добавить.
Код
!(inherited::inherited::ProcessCam(info))
Перейти в начало страницы
 
RayTwitty
сообщение 27.11.2016, 22:24
Сообщение #93


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


NodeJS

Имеется функция случайной перетасовки значений в массиве:
CODE
global.shuffle = function(array) {
let currentIndex = array.length, temporaryValue, randomIndex

// While there remain elements to shuffle...
while (currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex)
currentIndex--

// And swap it with the current element.
temporaryValue = array[currentIndex]
array[currentIndex] = array[randomIndex]
array[randomIndex] = temporaryValue
}

return array
}

попробовал запихнуть ее в прототип объекта Array, чтобы использовать как и другие стандартные функции:
CODE
Array.prototype.shuffle = function() {
let array = this
let currentIndex = array.length, temporaryValue, randomIndex

// While there remain elements to shuffle...
while (currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex)
currentIndex--

// And swap it with the current element.
temporaryValue = array[currentIndex]
array[currentIndex] = array[randomIndex]
array[randomIndex] = temporaryValue
}

return array
}

но получаю какой-то бред в консоль при инициализации модуля, в котором есть использование модуля fs:
Код
fs.js:951
  return binding.readdir(pathModule._makeLong(path), options.encoding);

Аналогично этому, добавлял новые методы в прототип объекта String, все было нормально.

Может быть, кто нибудь знает - что это за дичь?


--------------------
Перейти в начало страницы
 
1001v
сообщение 27.11.2016, 23:04
Сообщение #94


Доктор Игровых Наук
*******************

Репутация:   1084  
Группа: Участник
Сообщений: 3950
Награды: 6
Регистрация: 24.08.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


RayTwitty, запустил твой пример, ошибок нет, нода 7.1.0.


--------------------

Перейти в начало страницы
 
RayTwitty
сообщение 27.11.2016, 23:11
Сообщение #95


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(1001v @ 27.11.2016, 23:02) *
запустил твой пример, ошибок нет

Где-нибудь вверху есть
Код
const fs = require('fs')

?

Без подключения этого модуля и у меня работает.

Сообщение отредактировал RayTwitty - 27.11.2016, 23:11


--------------------
Перейти в начало страницы
 
1001v
сообщение 27.11.2016, 23:29
Сообщение #96


Доктор Игровых Наук
*******************

Репутация:   1084  
Группа: Участник
Сообщений: 3950
Награды: 6
Регистрация: 24.08.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


RayTwitty, есть.


--------------------

Перейти в начало страницы
 
NanoBot-AMK
сообщение 28.11.2016, 02:21
Сообщение #97


Почти Мастер
***********

Репутация:   75  
Группа: Участник
Сообщений: 1168
Награды: 4
Регистрация: 10.11.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Придумал тут, дефайны к черту, с пояса гранаты или нет, лучше задавать конфигом, а то в рев181 не берутся в пояс по дефолту(надо настраивать конфиг), и реально делаем секцию inventory_manager и там задаём: используем гранаты и патроны с пояса или нет, я думаю так удобней будет, и для отладки можно сразу проверить два варианта, так лучше и самим мододелам. Сейчас идея на компиляции. rolleyes.gif

ЗЫ
Ещё интересные проблемы были, сделал перегруженный метод explode, где можно задавать вредителя, старый метод оставил для совместимости. Дак проблема была, метод explode(0) работал, а метод explode() отваливался, так как в скрипте менеджер перегруженных методов не знал какой метод выбрать или explode(u32) или explode(CScriptGameObject*), сделал ещё один перегруженный метод explode(void) который выбирает принудительно один из методов. И тут тоже проблемы были.
CODE

// Так не прокатило.
void CScriptGameObject::explode()
{
explode(0);
}
// А так прошло.
void CScriptGameObject::explode()
{
int zero = 0; // для однозначности вызова перегруженной функции void CScriptGameObject::explode(u32)
explode(zero);
}
// Но сделал так.
void CScriptGameObject::explode()
{
explode(nullptr); // для однозначности вызова перегруженной функции void CScriptGameObject::explode(CScriptGameObject *initiator)
}

Вот как то так. cool.gif

Сообщение отредактировал NanoBot-AMK - 28.11.2016, 02:23


--------------------
СТАЛКЕР только для ПК!
Перейти в начало страницы
 
RayTwitty
сообщение 28.11.2016, 17:41
Сообщение #98


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


1001v, пока выяснил, что такая байда при добавлении любой функции в объект массива.
Код
Array.prototype.shuffle = function() {
  return 'test'
}

Подозреваю, что где-то у меня косяк, хотя и очень странный.

Нода 6.9.1.

Сообщение отредактировал RayTwitty - 28.11.2016, 17:41


--------------------
Перейти в начало страницы
 
1001v
сообщение 28.11.2016, 18:18
Сообщение #99


Доктор Игровых Наук
*******************

Репутация:   1084  
Группа: Участник
Сообщений: 3950
Награды: 6
Регистрация: 24.08.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


RayTwitty, сейчас проверил на 6.6.0, все также хорошо. У тебя это происходит в контексте какого-то проекта, или в отдельно взятом модуле тоже так?


--------------------

Перейти в начало страницы
 
RayTwitty
сообщение 17.12.2016, 16:40
Сообщение #100


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


https://developer.mozilla.org/ru/docs/Web/J...s/Object/assign
Код
Object.assign(target, ...sources)

По идее, этот метод должен копировать данные (ключи и значения) из одного объекта в другой. Но у меня почему-то копируются ссылки. Т.е. при изменении target, изменения вносятся и в sources.

upd:
Код
let obj1 = {}
let obj2 = {field1: [5, 25, 100], field2: 'text'}

Object.assign(obj1, obj2) // копирование obj2 в obj1
obj1.field1.splice(0, 1) // удаление первого элемента массива в obj1

console.log(JSON.stringify(obj2)) // => массив в obj2 тоже изменился!

Видимо, это не глубокое копирование. Подобъекты нужно копировать вручную (в том числе и массивы, поскольку в JS, массив интерпретируется тоже как объект), например так:
Код
function deepCopy(obj) {
    if (typeof obj != "object")
        return obj
    
    var copy = obj.constructor()
    for (var key in obj) {
        if (typeof obj[key] == "object")
            copy[key] = deepCopy(obj[key])
        else
            copy[key] = obj[key]
    }
    
    return copy
}


Сообщение отредактировал RayTwitty - 17.12.2016, 17:10


--------------------
Перейти в начало страницы
 

22 страниц V  « < 3 4 5 6 7 > » 
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29.03.2024, 04:14