Войти
ПрограммированиеФорумОбщее

C++. Что это? Баг visual studio? (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
20:13, 5 сен. 2017

amd.fx6100
я бы не мешал в одну кучу printf(), у него свои приколы, и std::cout


#31
4:45, 6 сен. 2017

кстати баг скорее всего в коде а не в студии. потому что в 2017 студии проблема не исчезла.

#32
9:12, 6 сен. 2017

Создал миниатюрный проект с проблемой.

вот ссылка на проект для Visual studio 2015  Mp2015


вот ссылка на проект для Visual studio 2017 mpp2017

Оба проекта одинаковые. Различается только версия Visual studio.
-----------------------------------------
Если в Map.h
вместо void (Map::*__Set)(unsigned int IndexToSet);
сделать вот так
//void (Map::*__Set)(unsigned int IndexToSet);

То проблема исчезает.

---------------------------
Если в Unit.h
вместо  bool (Map::*__GetUsedFunction)(int _X, int _Y);
сделать вот так
//bool (Map::*__GetUsedFunction)(int _X, int _Y);

То проблема исчезает.
если снова сделать так
bool (Map::*__GetUsedFunction)(int _X, int _Y);
то почему-то проблема не появляется.
если сделать Build->Clean Solution. То проблема возвращается.
---------------------------

Если в Units.cpp #include "Map.h" поместить на самом верху то проблема исчезает.
--------------------------

Посмотрите проект и скажите в чем может быть проблема. ? Я что-то не понимаю.

#33
9:18, 6 сен. 2017
большая буква после подчеркивания - UB сразу. Двойное подчеркивание - тоже UB. Но проблема конечно не в них, просто придирка.

В гцц скомпилировалось и выводит 86 четыре раза. Запасся попкорном.
#34
10:50, 6 сен. 2017

amd.fx6100
> __Set
UB

#35
10:56, 6 сен. 2017

amd.fx6100
Да тебе всего лишь нужно поле поднять перед

void (Map::*__Set)(unsigned int IndexToSet);
Вот так:
+ Показать

Если бы поставил уровень предупреждений /Wall, то увидел бы, что компилятору не нравится.
#36
11:03, 6 сен. 2017

Funtik
это решает баг но я что-то сомневаюсь что в этом дело. а если переменных много. Куда я дену void (Map::*__Set)(unsigned int IndexToSet) ?
Немного что-то сдвинешь и программа не будет работать по неизвестной причине.
Все таки это с++ а не ассемблер что так из за того что передвинул переменную на пару строк рухнула программа. не должно быть такого.
слишком бредовый баг.  должно быть какое-то другое разумное обьяснение. 
Может сейчас баг это решит а потом в другом месте он вылезит.
Есть у кого-то другое обьяснение этого бага?  Помоему это баг компилятора. Вон чел в gcc откомпилировал у него не было проблем.

#37
12:42, 6 сен. 2017

StepEver
> amd.fx6100, а у тебя этот тестовый (именно тестовый, а не изначальный) пример
> некорректно работает?
да. эти два проекта что я ссылку оставил здесь. одинаковые для 2015 и 2017 студии оба не работают. точнее работают но не правильно. глючат я как на скринах показывал. так же. 2 раза показывает 86 а дальше уже большое число. а должно 4 раза 86 показать.

И тестовые оба проекта не правильно работают и не тестовый большой проект по этой же причине не работает.
Попробую 2013 студию скачаю.

#38
13:36, 6 сен. 2017

а если в один файл объединить - баг сохраняется? На rextestere было бы интересно воспроизвести, чтоб убедить недоверчивых.
Ну и да, отладчик при порче памяти только запутать может, ориентироваться надо только на вывод cout.

#39
13:47, 6 сен. 2017

запустил в 2013й студии. баг есть.

#40
13:55, 6 сен. 2017

Придется ссылки на функции по другому использовать. Видимо то что есть не подходит для студии.

#41
14:03, 6 сен. 2017

StepEver

pragma pack  можно по разному использовать.
покажи как ты предлагаешь.

#42
14:07, 6 сен. 2017

StepEver
у меня х32

попробовал #pragma pack(8)  и #pragma pack(4)  не помогло

#43
14:09, 6 сен. 2017

kipar
> Ну и да, отладчик при порче памяти только запутать может, ориентироваться надо
> только на вывод cout.
Здесь не порча памяти, а какая-то лютая жесть связанная вот с этим:

class Map
{
public:
  void (Map::*__Set)(unsigned int IndexToSet);//ссылка на функцию
  int QuadsOnScreenX;

  Map();
  ~Map();
};

Если, прости Господи, попытаться прочитать QuadsOnScreenX вот так:

int64_t *gg = reinterpret_cast<int64_t *>(_Map);

std::cout<< std::endl;
std::cout << static_cast<int32_t>((*gg) >> 32);
То будет вам 86. То есть значение QuadsOnScreenX не испорчено, оно сохраняется.

p.s. Компилятор на оригинальный код ругается, и padding якобы добавляет, но всё равно размер класса 8 байт. Имхо выкинуть вот эту срань void (Map::*__Set)(unsigned int IndexToSet) и всё будет норм.

#44
14:13, 6 сен. 2017

Bowman
выкидывать просто так нельзя. это ссылка на функцию.  у меня в большом проекте используются ссылки на функции. надо на аналог заменить.  что-то типа std::function.  но тут надо смотреть, думать, проверять.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.