HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Общие вопросы по кодингу
Страницы (2): « 1 [2]   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35062
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


Я объясню чуть иначе.
По дефолту числовые константы имеют тип int. Поэтому сравнение

C++ Source Code:
if (str[0] == 0)

это неявное приведение типа.
Конечно, умный компилятор легко оптимизирует сравнение с нулем. Если мы пишем
C++ Source Code:
if (str[0] == '\0')

то сравниваем байт с байтом.
В данном случае тип роли не играет, и оба выражения имеют одинаковый смысл. Но так бывает далеко не всегда!
Пример:
C++ Source Code:
unsigned __int64 test = (1 << 40);

Как думаете, что будет в переменной test? 64-битное число (1<<40)? А вот не тут-то было! И 1, и 40 имеют тип int, а значит, операция сдвига имеет также тип int. Но это число превышает размер 32-битного числа, поэтому в итоге получается 0. Он-то радостно и присваивается 64-битному test-у.
А правильный код выглядит так:
C++ Source Code:
unsigned __int64 test = ((unsigned __int64)1 << 40);

__________________

Сообщить модератору | IP: Записан
Сообщение: 80191

Старое сообщение 14-07-2011 15:13
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33064
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
А правильный код выглядит так:

следует понимать, что работа с 64-разрядными переменными, вообще имеет массу тонкостей.
То что обязательно для них, вовсе необязательно для 32-битных.
Также приведение типов играет важную роль при русификации и передаче данных по сети.
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | IP: Записан
Сообщение: 80192

Старое сообщение 14-07-2011 15:19
-
underworlddemon
Житель форума
Девойс

Дата регистрации: Jun 2011
Проживает: Россия/Москва
Сообщений: 469
Возраст: 38

Рейтинг



Цитата:
Дядя Миша писал:
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.

это ещё не худший вариант
в НСке при печати Я вылет в винду или зависон компа... как повезёт...

Сообщить модератору | IP: Записан
Сообщение: 80193

Старое сообщение 14-07-2011 18:59
- За что?
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2090

Рейтинг



Сорри за некропостинг, но более подходящей темы не нашел. В общем суть такова:
У нас есть некая структура

C++ Source Code:
1
typedef struct
2
{
3
  thing_t *something;
4
} somestruct_t;
5
 
6
static somestruct_t somestruct;


где thing_t в свою очередь выражен
C++ Source Code:
1
typedef struct thing_t thing_s;
2
 
3
struct thing_s
4
{
5
  struct other_s *other;
6
};


а в структура other_s в свою очередь:
C++ Source Code:
1
typedef struct other_s
2
{
3
  int number;
4
} other_t;


Вопрос - как получить доступ к переменной number, начиная с somestruct? Я пробовал разные варианты, все они ссылаются на C2228. Последний вариант, который выдает всего одну ошибку:
C++ Source Code:
somestruct.something->other.number;

Ошибка error C2228: left of '.number' must have class/struct/union type

Я в общем запарился уже, вроде простая задача

__________________
-Brain is dead-

Сообщить модератору | IP: Записан
Сообщение: 142815

Старое сообщение 06-01-2015 13:19
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35062
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


C++ Source Code:
somestruct.something->other->number;

__________________

Сообщить модератору | IP: Записан
Сообщение: 142816

Старое сообщение 06-01-2015 13:51
-
ComradeAndrew
Житель форума

Дата регистрации: Aug 2014
Проживает: Дубай
Сообщений: 510
Возраст: 28

Рейтинг



KiQ
other в структуре thing_s является указателем.

C++ Source Code:
somestruct.something->other->number;


Цитата:
C++ Source Code:
typedef struct thing_t thing_s;

Разве не наоборот надо?
C++ Source Code:
typedef struct thing_s thing_t;

Сообщить модератору | IP: Записан
Сообщение: 142817

Старое сообщение 06-01-2015 13:51
- За что?
KiQ
Житель форума

Дата регистрации: Aug 2010
Проживает: Смоленск, Москва
Сообщений: 2090

Рейтинг



Все, спасибо, там оказывается еще дело было в том, что other не был определен, то есть когда он передавался как параметр, все было нормально, а попытка обратиться к его членам выдавала C2027. Подключил нужный инклюд и все заработало

__________________
-Brain is dead-

Сообщить модератору | IP: Записан
Сообщение: 142818

Старое сообщение 06-01-2015 16:52
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 02:15. Новая тема    Ответить
Страницы (2): « 1 [2]   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Общие вопросы по кодингу
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024