HLFX.Ru Forum Страницы (2): « 1 [2]
Показать все 22 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Общие вопросы по кодингу (https://hlfx.ru/forum/showthread.php?threadid=2860)


Отправлено XaeroX 14-07-2011 в 15:13:

Я объясню чуть иначе.
По дефолту числовые константы имеют тип 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);

__________________

xaerox on Vivino


Отправлено Дядя Миша 14-07-2011 в 15:19:

Цитата:
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'


Отправлено underworlddemon 14-07-2011 в 18:59:

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

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


Отправлено KiQ 06-01-2015 в 13:19:

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

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-


Отправлено XaeroX 06-01-2015 в 13:51:

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

__________________

xaerox on Vivino


Отправлено ComradeAndrew 06-01-2015 в 13:51:

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;


Отправлено KiQ 06-01-2015 в 16:52:

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

__________________
-Brain is dead-


Временная зона GMT. Текущее время 12:45. Страницы (2): « 1 [2]
Показать все 22 сообщений этой темы на одной странице

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