Курилка программистов, Флуд на около программерские темы |
Здравствуйте, гость ( Авторизация | Регистрация )
Курилка программистов, Флуд на около программерские темы |
12.11.2016, 12:04
Сообщение
#81
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
saas, тогда все должно работать
-------------------- nop
|
 
|
|
|
|
12.11.2016, 13:50
Сообщение
#82
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
saas, тогда все должно работать У тебя typedef в паблик секции, перенеси его в private(в сталкере class без модификатора) Типа такого: Студия его собирает, а clang и gcc выдают ошибку. |
 
|
|
12.11.2016, 14:16
Сообщение
#83
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Студия его собирает, а clang и gcc выдают ошибку. да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом. -------------------- nop
|
 
|
|
12.11.2016, 15:15
Сообщение
#84
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
да, действительно. однако, даже если компилятор студии проглотил такой код, это не должно привести к описанной выше проблеме в рантайме, очевидно проблема кроется в чем-то другом. Под Debug на Visual Studio 2015 Update 3 вызывается, как и положено CEffectorCam::ProcessCam. Но баг я все равно вижу. Однозначно в чем-то другом. Хотя нет, у меня похоже Когда идешь по диагонали и перезаряжаешься, что-то мелькает на экране А еще есть такой: Сообщение отредактировал abramcumner - 12.11.2016, 15:18 |
 
|
|
12.11.2016, 16:27
Сообщение
#85
|
|
Кандидат Игровых Наук Репутация: 2153 Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
У меня только Update 1 стоит. Юзаю релизную сборку.
Вот тут код чуть более похожий на тот, что в движке - Однако тут он выдаёт корректный результат. Сейчас полез в игру в эти же самые функции, видоизменил (кастрировал) их так чтобы они примерно соответствовали примеру из 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) UPD1: Вот удалось воспроизвести ошибку - Как же так происходит? ._. Возможно ошибка кроется в том что у меня старый апдейт, к вечеру попробую обновить. (хотя на rextester то наверно самая последняя версия компилятора стоит) Хотелось-бы хотя бы заставить компилятор валиться при таких ошибках, подобно тому как это происходит в gcc. UPD2: Похоже вся проблема возникает из-за знака отрицания !, если убрать его из CAnimatorCamLerpEffector то всё опять-же работает корректно. Следует заметить что я не просто так возвращаю int а не bool, потому что сами GSC там используют макросы FALSE (int 0) и TRUE (int 1) вместо булевых значений. UPD3: Заменил все int на bool - ошибка осталась: Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему? Сообщение отредактировал Shoкer - 12.11.2016, 16:53 -------------------- Мне просто нравятся синие буквы под сообщением.
|
 
|
|
12.11.2016, 17:03
Сообщение
#86
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Получается всё дело в конструкции !inherited::inherited::ProcessCam(), символ ! видимо исключает один inherited из конструкции, но почему? Скорее всего все дело в глюках студии Типа этого: или этого: Если интересно, можешь проверить дебажную сборку или в релизе отключить оптимизации. |
 
|
|
12.11.2016, 17:36
Сообщение
#87
|
|
Кандидат Игровых Наук Репутация: 2153 Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
Собрал только xrGame без оптимизации - ошибка осталась. Попробую ещё на третий апдейт перейти, потом отпишусь о результатах.
-------------------- Мне просто нравятся синие буквы под сообщением.
|
 
|
|
12.11.2016, 18:20
Сообщение
#88
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Shoкer, самое лучшее решение - собирать в той студии (и вообще с теми же компонентами) - что и разработчики. Тогда гарантированно будет правильный результат. Да, новые студии лучше и все такое, но появляются такие баги как у тебя.
У меня например, были странные баги (ТЧ) пока не поставил SP1 на 10 студию, а именно: при нажатии на кнопку в меню "Загрузить послед. сохран. игру" игра тупо висла, а с новым xrSound вообще не запускалась (вылетала на стадии синхронизации). Но это мое имхо конечно же. Можно и потанцевать с новыми студиями, тут каждый сам решает. Сообщение отредактировал RayTwitty - 12.11.2016, 18:37 -------------------- |
 
|
|
12.11.2016, 20:10
Сообщение
#89
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Вот удалось воспроизвести ошибку - да, действительно есть проблема, вот ассемблерный выхлоп проблемной строчки кода: Код ; 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
|
 
|
|
12.11.2016, 21:53
Сообщение
#90
|
|
Кандидат Игровых Наук Репутация: 2153 Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
> s<11>(k);
Действительно, как этот код вообще собирается , хотя его даже gcc переваривает. (Я правда в шаблоны слабоват) Но вообще моя проблема в принципе не в том как исправить эту ошибку, а в том как выявить подобные ошибки в остальных файлах проекта, может где то есть настройка чтобы заставить компилятор\студию более строго относится к коду и ослабить его "самодеятельность"? А то есть опасения что это не единственное место в коде Сталкера с таким поведением. Сообщение отредактировал Shoкer - 12.11.2016, 21:54 -------------------- Мне просто нравятся синие буквы под сообщением.
|
 
|
|
12.11.2016, 21:58
Сообщение
#91
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
как это код вообще работает все просто, на самом деле это логическое выражение, расставь пробелы и сразу станет понятно как выявить подобные ошибки в остальных файлах проекта только переписывать проблемные участки кода, я бы вообще от этого тайпдефа отказался, либо использовал using из С++11. еще можно багрепорт засабмитить в мелкософт. -------------------- nop
|
 
|
|
12.11.2016, 22:52
Сообщение
#92
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
|
 
|
|
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, все было нормально. Может быть, кто нибудь знает - что это за дичь? -------------------- |
 
|
|
27.11.2016, 23:04
Сообщение
#94
|
|
Доктор Игровых Наук Репутация: 1084 Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, запустил твой пример, ошибок нет, нода 7.1.0.
-------------------- |
 
|
|
27.11.2016, 23:11
Сообщение
#95
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
запустил твой пример, ошибок нет Где-нибудь вверху есть Код const fs = require('fs') ? Без подключения этого модуля и у меня работает. Сообщение отредактировал RayTwitty - 27.11.2016, 23:11 -------------------- |
 
|
|
27.11.2016, 23:29
Сообщение
#96
|
|
Доктор Игровых Наук Репутация: 1084 Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, есть.
-------------------- |
 
|
|
28.11.2016, 02:21
Сообщение
#97
|
|
Почти Мастер Репутация: 75 Группа: Участник Сообщений: 1168 Награды: 4 Регистрация: 10.11.2015 |
Придумал тут, дефайны к черту, с пояса гранаты или нет, лучше задавать конфигом, а то в рев181 не берутся в пояс по дефолту(надо настраивать конфиг), и реально делаем секцию inventory_manager и там задаём: используем гранаты и патроны с пояса или нет, я думаю так удобней будет, и для отладки можно сразу проверить два варианта, так лучше и самим мододелам. Сейчас идея на компиляции.
ЗЫ Ещё интересные проблемы были, сделал перегруженный метод 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) } Вот как то так. Сообщение отредактировал NanoBot-AMK - 28.11.2016, 02:23 -------------------- СТАЛКЕР только для ПК!
|
 
|
|
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 -------------------- |
 
|
|
28.11.2016, 18:18
Сообщение
#99
|
|
Доктор Игровых Наук Репутация: 1084 Группа: Участник Сообщений: 3950 Награды: 6 Регистрация: 24.08.2010 |
RayTwitty, сейчас проверил на 6.6.0, все также хорошо. У тебя это происходит в контексте какого-то проекта, или в отдельно взятом модуле тоже так?
-------------------- |
 
|
|
17.12.2016, 16:40
Сообщение
#100
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
Код 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 -------------------- |
 
|
|
Текстовая версия | Сейчас: 28.04.2024, 15:18 |