|
Флудильня Разговоры на любые темы. Мы устаем постоянно работать. Иногда надо где-то немного отдохнуть. Пожалуйста, не надо здесь устраивать бардак. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
22.07.2010, 13:39 | #1 |
Гость
Сообщений: n/a
|
memset в скриптах
Часто вижу такой код в скриптах скриптдева
Код:
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); Код:
uint32 m_auiEncounter[MAX_ENCOUNTER]; |
22.07.2010, 14:08 | #2 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Адрес массива = адрес первого элемента.
Но тут похоже и правда ошибка. Последний раз редактировалось zergtmn; 22.07.2010 в 14:14. |
22.07.2010, 14:28 | #3 |
Гость
Сообщений: n/a
|
Я о чём и говорю! Они в адрес массива записывают ноль! И так во многих-многих скриптах инстов.
|
22.07.2010, 14:29 | #4 |
Администратор
|
Об этом надо написать на форум СД2.
|
22.07.2010, 15:36 | #5 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Ну обнуляют, ну и что? Массив-то просто локальная переменная, не поток.
|
22.07.2010, 15:52 | #6 |
Гость
Сообщений: n/a
|
Массив локальный, адрес - нет.
|
22.07.2010, 17:05 | #7 |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
|
23.07.2010, 03:34 | #8 |
Гость
Сообщений: n/a
|
Последний раз редактировалось Дрон01; 23.07.2010 в 06:07. |
23.07.2010, 09:05 | #9 |
just a lazy user
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
|
Уважаемый Дрон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. |
23.07.2010, 10:17 | #10 |
Гость
Сообщений: n/a
|
Я никого не оскорблял, а сарказм призван выразить сомнение в чужих способностях. И я не нуждаюсь в двачерских подколках чтоб понять нечто, что вы могли бы сказать в самом начале. Но очевидно же, что операция разыменования тогда совершенно бессмысленна. Зачем засорять код)
Ясно, в любом случае, спасибо за "нормальный" ответ. Двумерные массивы в самом ядре всё равно через мемсет по-идиотски обнуляются, но я уж не буду писать об этом, вдруг это заденет чьи-то чувства. Последний раз редактировалось Дрон01; 23.07.2010 в 10:40. |
23.07.2010, 12:28 | #11 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
|
|
23.07.2010, 13:16 | #12 |
Новичок
Регистрация: 07.04.2010
Сообщений: 25
Сказал(а) спасибо: 1
Поблагодарили 2 раз(а) в 2 сообщениях
|
вобще через memset некоторые вещи нельзя обнулять, например массивы из float, в котором 0 не на всех платформах равен логическому нулю
|
23.07.2010, 14:25 | #13 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
23.07.2010, 14:26 | #14 | ||
Гость
Сообщений: 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)); Цитата:
Код:
//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)); Цитата:
Последний раз редактировалось Дрон01; 23.07.2010 в 14:33. |
||
23.07.2010, 14:57 | #15 |
just a lazy user
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
|
Двумерные массивы у нас опять же(!) статические! Если у нас есть массив
int a[5][10]; То компилятор наш выделяет под него 50(!) элементов типа int, а не 5 10-элементных массивов + массив адресов. Поэтому никакого обнуления адресов не произойдет и не может произойти.
__________________
Так как нету кнопки "Фууу", скажу вам прямо... (c) Последний раз редактировалось Foks; 23.07.2010 в 15:50. |
23.07.2010, 15:03 | #16 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Двумерные — да, но с одномерными вы так делать ведь не будете, верно?
|
23.07.2010, 15:06 | #17 |
Гость
Сообщений: n/a
|
Мне думалось, с одномерным массивом и мемсетом мы уже разобрались, не? Я готов признать, та ошибка не столь критична. Хотя так и не понятно зачем в скриптах разыменовывают массив снова Сам обнуляю через "memset(m_auiEncounter, 0, sizeof(m_auiEncounter));"
Мой пост выше - в основном ответ на пост №11, о двумерных массивах в чистом ядре. |
23.07.2010, 15:35 | #18 | ||
just a lazy user
Регистрация: 07.03.2010
Адрес: Киев
Сообщений: 31
Сказал(а) спасибо: 48
Поблагодарили 31 раз(а) в 11 сообщениях
|
Цитата:
ЗЫ: Deamon, зачем сообщение удалил? Ведь прав более чем полностью Цитата:
__________________
Так как нету кнопки "Фууу", скажу вам прямо... (c) Последний раз редактировалось Foks; 23.07.2010 в 15:50. |
||
23.07.2010, 16:13 | #19 |
Гость
Сообщений: n/a
|
Вопрос снят! Но в куче я всё равно так буду обнулять. |
23.07.2010, 16:39 | #20 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Я бы даже сказал что memset вообще не стоит использовать, так как если он подходит то обычный цикл с обнулением будет им заменен gcc например самостоятельно. Вообщем не стоит лезть руками туда где и компилятор достаточно умен...
Для обнуления куска raw-памяти его конечно естетсвеено использовать - так как для этого и предназначен
__________________
Так как устал объяснять знайте ICQ не пользуюсь Последний раз редактировалось Vladimir; 23.07.2010 в 16:43. |