Форум программистов, компьютерный форум CyberForum.ru

Почему нельзя так объявить двумерный массив? - C++

Восстановить пароль Регистрация
 
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
12.04.2013, 01:57     Почему нельзя так объявить двумерный массив? #1
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает функция. Если массив не инициализировать(или использовать при обьявлении цифру вместо переменной) то ошибки нету.

Bash
1
2
3
~$ g++ main.cpp
main.cpp: В функции «void bucketSort(unsigned int*, int)»:
main.cpp:49:39: ошибка: инициализация объекта «tempArray» переменного размера недопустима
Непонятно какой смысл этой ошибки, и от чего хочет уберечь компилятор?...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using std::cout;
using std::endl;
 
void bucketSort(int[], const int);
 
int main(void)
{
   const int size=9;
   int array[size]={13, 2, 10, 4, 5, 6, 110, 8, 999};
 
   bucketSort(array, size);
 
   return 0;
}
 
void bucketSort(int startArray[], const int size)
{
   int tempArray[10][size]={0};                      //тут ошибка!!!
   
  // ...
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.04.2013, 02:08     Почему нельзя так объявить двумерный массив? #2
потому что размер должен быть известным на этапе компиляции
кое-что про const
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.04.2013, 09:49     Почему нельзя так объявить двумерный массив? #3
вообще-то gcc без ключей такие вещи компилирует, это gnu extension.
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 52
12.04.2013, 11:05  [ТС]     Почему нельзя так объявить двумерный массив? #4
Jupiter, т.е. получается что функция bucketSort выполняется раньше чем main?
A почему тогда вариант без инициализации работает?

C++
1
int tempArray[10][size];
ведь размер массива тоже неизвестен заранее.

Kastaneda, не совсем понял о чём вы...

Добавлено через 4 минуты
Отбой, я уже наверное понял....
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2013, 11:12     Почему нельзя так объявить двумерный массив? #5
Цитата Сообщение от Simpson_ Посмотреть сообщение
Непонятно какой смысл этой ошибки, и от чего хочет уберечь компилятор?...
#include <iostream>
using std::cout;
using std::endl;
void bucketSort(int[], const int);
int main(void)
{
* *const int size=9;
* *int array[size]={13, 2, 10, 4, 5, 6, 110, 8, 999};
Этот массив автоматический, он расоложен в стеке, если ты попытаешься увеличить size, то массив вырастет на соседний элемент стека, возможно на локальное данное другой функции, или на адрес возврата. Переменный размер может быть только у динамического массива, располагаемого в куче.

Добавлено через 3 минуты
Цитата Сообщение от Simpson_ Посмотреть сообщение
Jupiter, т.е. получается что функция bucketSort выполняется раньше чем main?
A почему тогда вариант без инициализации работает?
Код C++
1
int tempArray[10][size];
Присваивание работает на этапе исполнения, но правый его операнд формируется на этапе написания текста и транслируется на этапе компиляции. В результате, когда компилятор разбирал твою инициализацию, он ещё не знал, что в этом массиве 9 элементов, он ведь не умеет привлекать к анализу программы разум.
Yandex
Объявления
12.04.2013, 11:12     Почему нельзя так объявить двумерный массив?
Ответ Создать тему
Опции темы

Текущее время: 22:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru