Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Путаница с массивом констант в С++  (Прочитано 1326 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Excalibur

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Только начал изучать С++ и наткнулся на две нелогичные вещи. Объясните если не трудно:
1. Почему такой код:
const double a[9]={1,2,3,4,5,6,7,8,9,10};Вызывает ошибку: "избыточные элементы в инициализаторе для «const double [9]"
Я понимаю что можно записать вот так:
const double a[]={1,2,3,4,5,6,7,8,9,10};и проблем не будет. Но и первый вариант должен быть верным.
2. Почему на массив int а[9] - sizeof(a) выдаёт только 36? Массив int на 10 элементов весит 40 байт, как ни крути. Предполагаю, что sizeof() находит адрес последнего элемента массива и вычитает его из первого - и получается 36. Но почему он не прибавляет оставшиеся 4 байта?

Думаю, по ходу изучения, я наткнусь ещё не на одну неточность.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Путаница с массивом констант в С++
« Ответ #1 : 26 Июня 2012, 19:48:48 »
>>Вызывает ошибку: "избыточные элементы в инициализаторе для «const double [9]"

Думаю не ошибку, а предупреждение. Компилятор сам вычислит размер массива.
При добавлении элементов в {...} вам придется отслеживать [значение],
лучше не задавать его явно.

Оффлайн Excalibur

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Путаница с массивом констант в С++
« Ответ #2 : 26 Июня 2012, 20:14:29 »
Т.е. если отключить предупреждения, то программа откомпилируется и будет работать как надо?
И всё равно - это предупреждение в корне неверное. Ну да ладно, не буду обращать внимания.

Пользователь решил продолжить мысль 26 Июня 2012, 21:31:46:
Вопрос номер 3. Вот такой вот код:
#include <iostream>
using namespace std;

int main(){
  double a[9];
  for(int i=0;i<10;i++){
    a[i]=1;
    cout<<a[i]<<endl;
  }
}
Выдаёт девять единиц и - "Ошибка шины"!
ЧЯДНТ?
« Последнее редактирование: 26 Июня 2012, 21:31:46 от Excalibur »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Путаница с массивом констант в С++
« Ответ #3 : 26 Июня 2012, 22:49:24 »
И всё равно - это предупреждение в корне неверное.
Да нет, это у вас в корне неверные представления ;).

Только начал изучать С++ и наткнулся на две нелогичные вещи.
... и лучше с самого начала изучения усвоить ... одну логичную вещь ;): компьютер/компилятор - всегда прав, а если неправ, то это вы чего-то не понимаете.

Вопрос номер 3. Вот такой вот код:
#include <iostream>
using namespace std;

int main(){
  double a[9];
  for(int i=0;i<10;i++){
    a[i]=1;
    cout<<a[i]<<endl;
  }
}
Выдаёт девять единиц и - "Ошибка шины"!
ЧЯДНТ?
Всё то же самое, что и в предыдущих 2-х вопросах:
- вы объявляете массив на 9 элементов (последовательно расположенных) - индекс от 0 до 10 ... просчитайте на пальцах ;)
- а пишете 10 элементов последовательно
- 10-й у вас за пределами массива
- и вы имеете ошибку "нарушение дотупа к памяти".
Ок? ;)


Пользователь решил продолжить мысль 26 Июня 2012, 22:55:25:
Думаю не ошибку, а предупреждение. Компилятор сам вычислит размер массива.
При добавлении элементов в {...} вам придется отслеживать [значение],
лучше не задавать его явно.
Не предупредение, а именно ошибку, и ошибку грубую:
- при явном указании размера массива компилятор ничего не вычисляет - размещается строго указанные 9 элементов (былоб указано 2 - было бы 2);
- в инициализаторе описаны 10 элементов, которые нужно размещать, 10-й за пределами выделенного массива.
Вот если бы было:
int X[ 10 ] = { 1, 2, 3 };
- вот тогда бы было нормально ... но трудно предсказуемо (что содержится в элементах x[3] и далее).
« Последнее редактирование: 26 Июня 2012, 22:55:25 от Olej »

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Путаница с массивом констант в С++
« Ответ #4 : 26 Июня 2012, 22:59:01 »
#include <iostream>
using namespace std;

int main(){
  double a[10]; // индексы массива находятся в диапазоне от 0 до 9
  for(int i=0;i<10;i++){
    a[i]= i;      // почувствуйте разницу
    cout<<a[i]<<endl;
  }
}

Рекомендую сначала в обычном С руку набить, потом только на С++ переходить.
Вот лучший в мире учебник по С http://lib.ru/CTOTOR/kernigan.txt
« Последнее редактирование: 26 Июня 2012, 23:01:21 от Señor_Gaga »

Оффлайн Excalibur

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Путаница с массивом констант в С++
« Ответ #5 : 26 Июня 2012, 23:12:51 »
Теперь всё понятно. Изначально неправильно понял тему с массивами и зашёл в тупик. Я думал, что если обьявляешь массив a[10], то создаётся массив от 0 до 10 (т.е. 11 элементов в общем). Но оказывается создаётся массив на 10 элементов с индексами от 0 до 9 (т.е. 'a' с индексом 10 в нём на самом деле нету).

Olej, большое спасибо за разъяснения!

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.