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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация массива char d конструкторе 
:(
    Опции темы
arfaa
Дата 28.10.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос такой. Есть класс simple, в классе есть поле char in[105]. Естественно хочу инициализировать это поле в конструкторе. in[105]={0}, инициализировать соответственно нулем, но что-то не так, что не так?
PM MAIL   Вверх
McMan
Дата 28.10.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 массив хотите инициализировать нулем или нулями?
memset(in, 0, sizeof(in));
как то так

in[105]={0}  конечно что-то не так



Это сообщение отредактировал(а) McMan - 28.10.2012, 18:57
PM MAIL   Вверх
NoviceF
Дата 28.10.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(arfaa @ 28.10.2012,  19:13)
Вопрос такой. Есть класс simple, в классе есть поле char in[105]. Естественно хочу инициализировать это поле в конструкторе. in[105]={0}, инициализировать соответственно нулем, но что-то не так, что не так?

Если нулём, можно:

Код

in[0]='\0';


если нулями, то

Код

in[105] = { '\0' };


(заполняет нулями весь массив).

Рекомендуют 2й вариант, но и 1й допустим.
PM MAIL   Вверх
borisbn
Дата 29.10.2012, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



arfaa, индексы в массивах в Си/Си++ начинаются от 0 и идут до размера массива минус один. Понятно, в чём у тебя ошибка ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Dem_max
Дата 29.10.2012, 09:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 4
Всего: 39



только через memset и ему подобные.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
baldina
Дата 29.10.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. инициализация типа x={y} в конструкторе невозможна, это только для статических данных (размещаемых во время компиляции).
2. in[105] это за пределами массива, последний элемент in[104]
3. если этот массив - строка, достаточно обнулить первый элемент, in[0] = 0. в противном случае - memset()

Добавлено через 4 минуты и 43 секунды
но вообще говоря, c++ style это использование для строк std::string, а заполнение массивов - при помощи std::fill (она сама вызовет memset)

Добавлено через 11 минут и 5 секунд
можно и дальше пойти: массивы почти всегда могут быть заменены на std::vector, а у него имеется конструктор, позволяющий инициализировать все элементы определенным значением.

PM MAIL   Вверх
NoviceF
Дата 29.10.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ответьте тогда, пожалуйста, и на мой вопрос.

Забивает ли данная конструкция 

Код

in[105] = { '\0' };


массив терминальными нулями?

Если да, то чем она плоха для инициализации символьных массивов (в частности, чем она хуже использования memset)?
PM MAIL   Вверх
azesmcar
Дата 29.10.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(NoviceF @  29.10.2012,  14:19 Найти цитируемый пост)
Если да, то чем она плоха для инициализации символьных массивов (в частности, чем она хуже использования memset)? 

Да ничем собственно, это тоже самое

Код

char in[105] = { '\0' };


Код

00CB14D8  mov         byte ptr [ebp-74h],0  
00CB14DC  push        68h  
00CB14DE  push        0  
00CB14E0  lea         eax,[ebp-73h]  
00CB14E3  push        eax  
00CB14E4  call        @ILT+135(_memset) (0CB108Ch)  
00CB14E9  add         esp,0Ch  

PM   Вверх
feodorv
Дата 29.10.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(NoviceF @  29.10.2012,  15:19 Найти цитируемый пост)
Забивает ли данная конструкция 


in[105] = { '\0' };

массив терминальными нулями?

А это вообще компилится?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
NoviceF
Дата 29.10.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @ 29.10.2012,  15:29)
Цитата(NoviceF @  29.10.2012,  15:19 Найти цитируемый пост)
Забивает ли данная конструкция 


in[105] = { '\0' };

массив терминальными нулями?

А это вообще компилится?

ессно smile

http://liveworkspace.org/code/1fb4ef57bae1...05abe2e286a52c2

Добавлено через 4 минуты и 4 секунды
Цитата(azesmcar @  29.10.2012,  15:29 Найти цитируемый пост)
Да ничем собственно, это тоже самое


Спасибо smile Как доберусь до ассемблера, вернусь к этой теме и буду вникать.. smile
PM MAIL   Вверх
borisbn
Дата 29.10.2012, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(feodorv @  29.10.2012,  14:29 Найти цитируемый пост)
А это вообще компилится? 

Цитата(NoviceF @  29.10.2012,  14:43 Найти цитируемый пост)
ессно


NoviceF, лукавишь... на самом деле у тебя там не присвоение какому-то элементу, а инициализация массива. Это - разные вещи.
1)
Код
char array[ 20 ] = { 0 }; // или { '\0' }

2)
Код
char array[ 20 ];
array[ 19 ] = { 0 }; // <--- не должно компилироваться


Добавлено через 3 минуты и 46 секунд
Цитата(borisbn @  29.10.2012,  15:05 Найти цитируемый пост)
<--- не должно компилироваться

хммм. компилится, но это - запись нуля ТОЛЬКО в один элемент, а при инициализации массива записываются все элементы.
Причём, если указать не 0, а, например, 'q', то в первый элемент попадёт 'q', а во все остальные - нули. По-моему это по стандарту.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 29.10.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(borisbn @  29.10.2012,  16:05 Найти цитируемый пост)
хммм. компилится, но это - запись нуля ТОЛЬКО в один элемент, а при инициализации массива записываются все элементы.
Причём, если указать не 0, а, например, 'q', то в первый элемент попадёт 'q', а во все остальные - нули. По-моему это по стандарту.

Интересно smile 

А если так
Код

char array[ 20 ];
array[ 20 ] = { 0 };

Что будет с массивом?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
NoviceF
Дата 29.10.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(borisbn @  29.10.2012,  16:05 Найти цитируемый пост)
на самом деле у тебя там не присвоение какому-то элементу, а инициализация массива. Это - разные вещи.


ну я инициализацию и имел ввиду с самого начала smile
PM MAIL   Вверх
baldina
Дата 29.10.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



NoviceF, конструкция
Код

T x = {0};

инициализирует нулями: список инициализации может быть не полным; если он не полный, остальное инициализируется нулями. это касается структур и массивов.
Код

int a[4] = { 1, 2 }; // значения в массиве {1,2,0,0}
struct { int x; float y; char z[5]; } foo = {1}; // значения в структуре {1,0f,{0,0,0,0,0}}

PM MAIL   Вверх
borisbn
Дата 29.10.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(feodorv @  29.10.2012,  15:41 Найти цитируемый пост)
А если так
Код
char array[ 20 ];
array[ 20 ] = { 0 };

Что будет с массивом? 

думаю, пропись по памяти


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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