Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BYTE pBuff[128] = {0xFF}; что же это значит? 
:(
    Опции темы
bel_nikita
Дата 13.10.2005, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Что-то я не пойму. Вот, есть такой код:
Код
BYTE pBuff[128] = {0xFF};

Это же, вроде, означает, что при создании массива он заполняется значениями 0хFF, но у меня только pBuff[0] = 0xFF, остальные 0.
В чем дело? smile Или я торможу с утра?



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
chaos
Дата 13.10.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



вроде тормозишь smile
воспользуйся лутше memset'ом smile
PM WWW   Вверх
Mayk
Дата 13.10.2005, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(bel_nikita @ 13.10.2005, 13:30)
Это же, вроде, означает, что при создании массива он заполняется значениями 0хFF, но у меня только pBuff[0] = 0xFF, остальные 0.

Ну да. Можешь Сделать pBuff[128]={0xFF, 0xFF, /*вырезано*/ 0xFF}; массив будет заполнен 0xFF
(кстати это не так тяжело как кажется - всего 7 selectов,cut,paste'ов, в vim'е такое вообще в шестьь клавиш делается -
dd 128p) smile

Хотя memset бесспорно рулит smile

Это сообщение отредактировал(а) Mayk - 13.10.2005, 09:50


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 13.10.2005, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Пол жизни обнулял массивы:
Код
BYTE pBuff[128] = {0};
А тут понадобилось заполнить 0xFF и такие вот, непонятки начались smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
chaos
Дата 13.10.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



ну "обнулить" так можно только строку smile
хотя по моему гдето я тоже видел такую запись как у тебя
но я предпочитаю пользоваться мемсетом
PM WWW   Вверх
srd
Дата 13.10.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



int a[2] = {1,1};
Массив из двух элементов, оба элемента равны 1.

int b[2] = {1};
Массив из двух элементов. Для первого элемента указано инициализируещее значение, а для второго нет. Компилятор подставляет для второго элемента 0. Т.е. эта строчка эквивалентна
int c[2] = {1, 0};

Другими словами, если указаны инициализируещие значения не для всех элеметов массива (или структуры), то для первых элементов массива (или полей структуры) используются указанные инициализирующие значения, а остальные заполняются нулями.

Потому и в твоей строке значение 0xff получает только первый элемент в строке.

// Здесь мы явно указали инициализирующее значение только для ПЕРВОГО элемента, а не для всех.
BYTE str[256] = {0};

Это сообщение отредактировал(а) srd - 13.10.2005, 10:17


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
bel_nikita
Дата 13.10.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



srd
Цитата
// Здесь мы явно указали инициализирующее значение только для ПЕРВОГО элемента, а не для всех.
BYTE str[256] = {0};
Произойдет инициализация всего массива нулями


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
srd
Дата 13.10.2005, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(bel_nikita @ 13.10.2005, 18:44)

Цитата

// Здесь мы явно указали инициализирующее значение только для ПЕРВОГО элемента, а не для всех.
BYTE str[256] = {0};

Произойдет инициализация всего массива нулями

Верно, потому-что для первого элемента инициализатор указан явно, а для остальных элементов используется в качестве инициализатора ноль. Собственно, это я и объяснял выше.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
bel_nikita
Дата 13.10.2005, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



srd
Цитата
Верно, потому-что для первого элемента инициализатор указан явно, а для остальных элементов используется в качестве инициализатора ноль.
Почему в таком случае для остальных элементов используется в качестве инициализатора ноль?
Если сделаю просто BYTE str[256];, то в дебаг режиме будет все 0хСС, а если BYTE str[256] = {0}; то нули


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
srd
Дата 13.10.2005, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



BYTE str[256];
Здесь вообще не указано инициализаторов и элементы массива никак не инициализируется, заполняются мусором. Значение 0xCC - это просто особенность MSVC++ при компиляции отладочной версии приложения и ни о чём не говорит.

BYTE str[256]= {0};
Здесь указан инициализатор для первого элемента. Фича языка Си/Си++ - если указан хотя бы один инициализатор, то проинициализированы должны быть все элементы массива или все поля структуры. Но так как у нас инициализаторов меньше количества элементов (в примере - только один), то для оставшихся элементов в качестве инициализирующего значения используется ноль.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
bel_nikita
Дата 13.10.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Фича языка Си/Си++ - если указан хотя бы один инициализатор, то проинициализированы должны быть все элементы массива или все поля структуры. Но так как у нас инициализаторов меньше количества элементов (в примере - только один), то для оставшихся элементов в качестве инициализирующего значения используется ноль.
Ничего не понял smile
Но вот, BYTE str[256]= {0хFF}; вышесказанное не будет работать


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 13.10.2005, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



А почему стандарт не читаете?


Это сообщение отредактировал(а) SergeCpp - 16.1.2007, 17:23
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 13.10.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



SergeCpp
Покажи мне компилятор 100% соответвующий стандарту smile
Ну, так это, объясни пожалуйста, мне темному, что по этому поводу говорит стандарт? smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Neitron
Дата 13.10.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



bel_nikita
..........................


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Дрон
Дата 13.10.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



bel_nikita
Я стандарт не читал и на С++ давно не пишу, но мне кажется srd всё нормально объяснил.

Повторю: При наличии хотя бы одного инициализатора массив инициализируется сначала инициализаторами, насколько их хватит, а оставшееся место добивается нулями.

Но чтобы не надеятся, я всегда делал memset.


--------------------
Да. Именно так.
PM   Вверх
srd
Дата 13.10.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Кто-нибудь, пристрелите меня... smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Дрон
Дата 13.10.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



http://msdn.microsoft.com/library/default....tm/decla_30.asp

Цитата
Initializing Aggregate Types

An aggregate type is a structure, union, or array type. If an aggregate type contains members of aggregate types, the initialization rules apply recursively.

....

If initializer-list has fewer values than an aggregate type, the remaining members or elements of the aggregate type are initialized to 0. The initial value of an automatic identifier not explicitly initialized is undefined. If initializer-list has more values than an aggregate type, an error results. These rules apply to each embedded initializer list, as well as to the aggregate as a whole.

...


Обратите внимание на первое предложение последнего абзаца.
Добавлено @ 13:34
До кучи http://www.informit.com/guides/content.asp...plus&seqNum=171

Цитата
If you provide fewer initializers than the number of elements that an array has, all remaining elements will be default-initialized. For example, in the following expression the array set has five elements but only the first three have explicit initializers:

Код

int set[5]={0,1,2};


The elements set[4] and set[5] are implicitly initialized to 0 in this case. Therefore, if you wish to zero-initialize a large array, simply provide a single initializer and let the compiler take care of the rest:

Код

double scores[500]={0.0}; //remaining 499 elements
      //are initialized to 0.0 as well


Это сообщение отредактировал(а) Дрон - 13.10.2005, 13:32


--------------------
Да. Именно так.
PM   Вверх
bel_nikita
Дата 13.10.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Дрон
Цитата
Повторю: При наличии хотя бы одного инициализатора массив инициализируется сначала инициализаторами, насколько их хватит, а оставшееся место добивается нулями.
А вот, теперь дошло smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 13.10.2005, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



bel_nikita]
... переработал ? smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.