Ru-MaNGOS

Вернуться   Ru-MaNGOS > Флуд > Флудильня

Важная информация

Флудильня Разговоры на любые темы.

Мы устаем постоянно работать. Иногда надо где-то немного отдохнуть. Пожалуйста, не надо здесь устраивать бардак.

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.07.2010, 13:39   #1
Дрон01
Гость
 
Сообщений: n/a
По умолчанию memset в скриптах

Часто вижу такой код в скриптах скриптдева
Код:
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Лезу в хидерку смотреть, чего ж это там они за переменные зануляют, и вижу
Код:
uint32 m_auiEncounter[MAX_ENCOUNTER];
В связи с этим вопрос - какого чёрта? Почему разработчики не обнуляют сам массив, но умудряются обнулить адрес первого его элемента?
  Ответить с цитированием
Старый 22.07.2010, 14:08   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Адрес массива = адрес первого элемента.
Но тут похоже и правда ошибка.

Последний раз редактировалось zergtmn; 22.07.2010 в 14:14.
zergtmn вне форума   Ответить с цитированием
Старый 22.07.2010, 14:28   #3
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

Я о чём и говорю! Они в адрес массива записывают ноль! И так во многих-многих скриптах инстов.
  Ответить с цитированием
Старый 22.07.2010, 14:29   #4
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Об этом надо написать на форум СД2.
virusav вне форума   Ответить с цитированием
Старый 22.07.2010, 15:36   #5
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Ну обнуляют, ну и что? Массив-то просто локальная переменная, не поток.
LordJZ вне форума   Ответить с цитированием
Старый 22.07.2010, 15:52   #6
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

Массив локальный, адрес - нет.
  Ответить с цитированием
Старый 22.07.2010, 17:05   #7
Deamon
WowCore Dev
 
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
Deamon Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Дрон01 Посмотреть сообщение
Массив локальный, адрес - нет.
Чо? Переменная m_auiEncounter объявлена как статический массив(не динамический). Поэтому после применения & будет выдан адресс первого элемента массива. Не гоните пургу
Deamon вне форума   Ответить с цитированием
Старый 23.07.2010, 03:34   #8
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

http://msdn.microsoft.com/en-us/libr...8VS.60%29.aspx

Последний раз редактировалось Дрон01; 23.07.2010 в 06:07.
  Ответить с цитированием
Старый 23.07.2010, 09:05   #9
Foks
just a lazy user
 
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
Foks На верном пути
По умолчанию

Уважаемый Дрон01, Вы кажется не поняли, о чем речь идет. Если у нас объявлен статический массив

int a[10];

то выражения a и &a имеют тип int* и оба являются указателем на первый элемент.
ЗЫ: MSDN - бесспорно лучшая документация по WinAPI, но не по C(++)! Смотрите на cplusplus.com и других ресурсах.

Added: А если Вы не верите, скомпилируйте ЭТО и убедитесь, что Вас никто не обманывал:
Код:
#include <cstdio>

using namespace std;

int main()
{
	int a[10];
	if((int*)&a == a)
		printf("We're right!\n");
	else
		printf("Oops, something goes wrong. Maybe 2012 is very soon.\n");
	return 0;
}
__________________
Так как нету кнопки "Фууу", скажу вам прямо... (c)

Последний раз редактировалось Foks; 23.07.2010 в 14:46.
Foks вне форума   Ответить с цитированием
Старый 23.07.2010, 10:17   #10
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

Я никого не оскорблял, а сарказм призван выразить сомнение в чужих способностях. И я не нуждаюсь в двачерских подколках чтоб понять нечто, что вы могли бы сказать в самом начале. Но очевидно же, что операция разыменования тогда совершенно бессмысленна. Зачем засорять код)
Ясно, в любом случае, спасибо за "нормальный" ответ. Двумерные массивы в самом ядре всё равно через мемсет по-идиотски обнуляются, но я уж не буду писать об этом, вдруг это заденет чьи-то чувства.

Последний раз редактировалось Дрон01; 23.07.2010 в 10:40.
  Ответить с цитированием
Старый 23.07.2010, 12:28   #11
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
Двумерные массивы в самом ядре всё равно через мемсет по-идиотски обнуляются, но я уж не буду писать об этом, вдруг это заденет чьи-то чувства.
Ну почему же, всегда приветствуется здоровая критика, главное доводы.
__________________
Konctantin вне форума   Ответить с цитированием
Старый 23.07.2010, 13:16   #12
Forgotten
Новичок
 
Регистрация: 07.04.2010
Сообщений: 25
Сказал(а) спасибо: 1
Поблагодарили 2 раз(а) в 2 сообщениях
Forgotten На верном пути
По умолчанию

вобще через memset некоторые вещи нельзя обнулять, например массивы из float, в котором 0 не на всех платформах равен логическому нулю
Forgotten вне форума   Ответить с цитированием
Старый 23.07.2010, 14:25   #13
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Дрон01 Посмотреть сообщение
...
Двумерные массивы в самом ядре всё равно через мемсет по-идиотски обнуляются, но я уж не буду писать об этом, вдруг это заденет чьи-то чувства.
Ваши предложения как обнулять их?
LordJZ вне форума   Ответить с цитированием
Старый 23.07.2010, 14:26   #14
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

Код:
    int inv_slot_items[INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START];
    int inv_bags[INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START][MAX_BAG_SIZE];
    int inv_keys[KEYRING_SLOT_END-KEYRING_SLOT_START];
    int inv_tokens[CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START];

    memset(inv_slot_items,0,sizeof(int)*(INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START));
    memset(inv_bags,0,sizeof(int)* MAX_BAG_SIZE*([INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START));
    memset(inv_keys,0,sizeof(int)*(KEYRING_SLOT_END-KEYRING_SLOT_START));
    memset(inv_tokens,0,sizeof(int)*(CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START));
Как пример. Прошу заметить, inv_bags - двумерный массив, в первичном массиве хранятся лишь указатели на адреса одномерных вложенных массивов. Такое обнуление мемсетом режет их на корню.
Цитата:
Ваши предложения как обнулять их?
Почему бы и не (другой пример)
Код:
    //smwhr in MapInstanced.h
    uint16 GridMapReference[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS];
    //smwhr in MapInstanced.cpp
    for(int i = 0; i < MAX_NUMBER_OF_GRIDS; ++i)
        memset(GridMapReference[i], 0, MAX_NUMBER_OF_GRIDS*sizeof(uint16));
Как-то так?

Цитата:
вобще через memset некоторые вещи нельзя обнулять, например массивы из float, в котором 0 не на всех платформах равен логическому нулю
Согласен. Более того, режим _debug на многих платформах предварительно зануляет выделяемую память, что приводит к невозможности отследить ошибки неинициализации переменных в режиме _release

Последний раз редактировалось Дрон01; 23.07.2010 в 14:33.
  Ответить с цитированием
Старый 23.07.2010, 14:57   #15
Foks
just a lazy user
 
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
Foks На верном пути
По умолчанию

Двумерные массивы у нас опять же(!) статические! Если у нас есть массив
int a[5][10];
То компилятор наш выделяет под него 50(!) элементов типа int, а не 5 10-элементных массивов + массив адресов. Поэтому никакого обнуления адресов не произойдет и не может произойти.
__________________
Так как нету кнопки "Фууу", скажу вам прямо... (c)

Последний раз редактировалось Foks; 23.07.2010 в 15:50.
Foks вне форума   Ответить с цитированием
Старый 23.07.2010, 15:03   #16
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Дрон01 Посмотреть сообщение
... //smwhr in MapInstanced.h
uint16 GridMapReference[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS];
//smwhr in MapInstanced.cpp
for(int i = 0; i < MAX_NUMBER_OF_GRIDS; ++i)
memset(GridMapReference[i], 0, MAX_NUMBER_OF_GRIDS*sizeof(uint16));
[/CODE]
Как-то так?
...
Двумерные — да, но с одномерными вы так делать ведь не будете, верно?
LordJZ вне форума   Ответить с цитированием
Старый 23.07.2010, 15:06   #17
Дрон01
Гость
 
Сообщений: n/a
По умолчанию

Мне думалось, с одномерным массивом и мемсетом мы уже разобрались, не? Я готов признать, та ошибка не столь критична. Хотя так и не понятно зачем в скриптах разыменовывают массив снова Сам обнуляю через "memset(m_auiEncounter, 0, sizeof(m_auiEncounter));"

Мой пост выше - в основном ответ на пост №11, о двумерных массивах в чистом ядре.
  Ответить с цитированием
Старый 23.07.2010, 15:35   #18
Foks
just a lazy user
 
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
Foks На верном пути
По умолчанию

Цитата:
Сообщение от Foks
Двумерные массивы у нас опять же(!) статические! Если у нас есть массив
int a[5][10];
То компилятор наш выделяет под него 50(!) элементов типа int, а не 5 10-элементных массивов + массив адресов. Поэтому никакого обнуления адресов не произойдет и не может произойти.
Вот вам двумерные массивы. Капитан очевидность подсказывает.

ЗЫ: Deamon, зачем сообщение удалил? Ведь прав более чем полностью

Цитата:
Сообщение от Дрон01
Мне думалось, с одномерным массивом и мемсетом мы уже разобрались, не? Я готов признать, та ошибка не столь критична. Хотя так и не понятно зачем в скриптах разыменовывают массив снова Сам обнуляю через "memset(m_auiEncounter, 0, sizeof(m_auiEncounter));"
Стиль программирования - дело индивидуальное.
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 428
Размер:	84.2 Кб
ID:	543  
__________________
Так как нету кнопки "Фууу", скажу вам прямо... (c)

Последний раз редактировалось Foks; 23.07.2010 в 15:50.
Foks вне форума   Ответить с цитированием
Старый 23.07.2010, 16:13   #19
Дрон01
Гость
 
Сообщений: n/a
По умолчанию



Вопрос снят! Но в куче я всё равно так буду обнулять.
  Ответить с цитированием
Старый 23.07.2010, 16:39   #20
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Я бы даже сказал что memset вообще не стоит использовать, так как если он подходит то обычный цикл с обнулением будет им заменен gcc например самостоятельно. Вообщем не стоит лезть руками туда где и компилятор достаточно умен...

Для обнуления куска raw-памяти его конечно естетсвеено использовать - так как для этого и предназначен
__________________
Так как устал объяснять знайте ICQ не пользуюсь

Последний раз редактировалось Vladimir; 23.07.2010 в 16:43.
Vladimir вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 20:19. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot