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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
d13mon
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 11
#1

Размер внешнего глобального массива - C++

29.03.2012, 13:23. Просмотров 728. Ответов 8
Метки нет (Все метки)

У меня возник такой вопрос :

Есть глобальный массив в одном файле:
C++
1
2
//1.cpp
int arr[] = {4,6,0,1,2};
Есть код в другом файле, его использующий:
C++
1
2
3
4
5
6
7
8
9
10
//2.cpp
#include <iostream>
using namespace std;
 
extern int arr[];
 
int main(){
    cout << arr[0] << sizeof(arr) << endl;
    return 0;
}
Выдает ошибку компиляции:
error C2070: 'int []': illegal sizeof operand

Мне нужен размер этого массива через sizeof. Торможу, не могу понять, как это сделать в данном случае.

Массив должен оставаться во внешнем файле. Явно задавать ему размерность нельзя. И вообще этот файл (1.cpp) трогать нельзя.

Буду благодарен за любую помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 13:23     Размер внешнего глобального массива
Посмотрите здесь:

Хранение глобального массива с объектами - C++
Добрый день всем. У меня есть vector с объектами. И надо чтобы он был доступен по всех классах.( отдельных файлах ). Чтобы я мог...

Объявление и определение глобального массива структуры - C++
Есть структура struct DatSob { int year; // Год события int month; // Месяц события int day; // день события...

Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? - C++
Начать с массивов, допустим То есть ситуация такая: пусть имеется два потока и глобальный массив элементов int из двух элементов, один...

Перегрузка глобального оператора delete с параметрами - C++
Столкнулся с проблемой при перегрузке оператора delete с параметрами: почему-то всегда вызывается не мой оператор, а стандартный. Вот...

Размер массива - C++
Можно ли изменить размер обычного массива?

Размер массива - C++
Почему это работает? И как это понимать? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; template &lt;size_t Len&gt; ...

Размер массива - C++
Нужно создать массив для хранения различных символов (буквы и различные знаки) Необходимо узнать его размер. Как это сделать? В массиве...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6280 / 5883 / 1904
Регистрация: 18.12.2011
Сообщений: 15,092
Завершенные тесты: 1
29.03.2012, 13:29     Размер внешнего глобального массива #2
Может быть в массиве можно хранить какую-либо метку в конце,
например, -1.
тогда длину массива можно вычислить кодом
C++
1
int size=0;for(;arr[size]!=-1;size++);
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
29.03.2012, 15:05     Размер внешнего глобального массива #3
Цитата Сообщение от d13mon Посмотреть сообщение
Мне нужен размер этого массива через sizeof. Торможу, не могу понять, как это сделать в данном случае.
Никак!
d13mon
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 11
29.03.2012, 16:08  [ТС]     Размер внешнего глобального массива #4
Цитата Сообщение от Байт Посмотреть сообщение
Никак!
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
И если бы определение такого же массива находилось в файле 2.cpp, то размер бы прекрасно вычислялся.

Добавлено через 4 минуты
Цитата Сообщение от zss Посмотреть сообщение
Может быть в массиве можно хранить какую-либо метку в конце,
например, -1.
тогда длину массива можно вычислить кодом
C++
1
int size=0;for(;arr[size]!=-1;size++);
Не ну пересчитать элементы в цикле всегда можно) А если в реальном массиве у меня больше миллиона элементов?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
29.03.2012, 16:10     Размер внешнего глобального массива #5
используй вектор. либо держи размер рядом. Но лучше вектор.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
29.03.2012, 16:14     Размер внешнего глобального массива #6
Цитата Сообщение от d13mon Посмотреть сообщение
По идее реальный размер внешнего массива будет известен на этапе компиляции.
он будет известен на этапе компиляции в _другой_ единице трансляции.

Представь, компилятор транслирует файл 1.cpp (все проходит прекрасно), потом он переходит к другой единице трансляции, и тут ему нужно узнать о массиве, который находится непонятно где. И это при том, что до стадии линковки компилятору вообще не нужно ничего знать о других единицах трансляции
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
29.03.2012, 16:42     Размер внешнего глобального массива #7
Цитата Сообщение от d13mon Посмотреть сообщение
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
Совершенно верно. Но компиляция проходит отдельно для каждого модуля. Можно решить проблему другими путями. Через #define, const и тд. Но через sizeof - не получится. Можно, конечно, в 2.cpp написать extern int arr[5], но тогда тебе самому за этой пятеркой придется следить.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
29.03.2012, 16:44     Размер внешнего глобального массива #8
Цитата Сообщение от d13mon Посмотреть сообщение
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
И если бы определение такого же массива находилось в файле 2.cpp, то размер бы прекрасно вычислялся.
Никак. представь, что компилятор компилирует 2.cpp
Если бы там просто использовался этот массив как например arr[1]=1;
проблем бы не было. компилятор хоть и не знает, где этот массив, но подставляет вместо него адрес, который даже не будет относится к этому массиву, но в последствии будет связан линковщиком с реальным массивом. Заглядывать в файл 1.срр ему не обязательно.
А вот для того чтобы использовать в функции конкретный размер массива он не может. То же самое произошло бы, если б ты объявил структуру. Ты мог бы пользоваться указателями на неё, но её реальный размер не узнал бы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2012, 23:56     Размер внешнего глобального массива
Еще ссылки по теме:

Размер массива - C++
Здрасте. Такой вопрос.Можно ли каким то образом вывести число элементов массива,то есть его размер? Допустим int arr; Программа...

Бесконечный вызов дестркутора для глобального объекта - C++
Наткнулся в книге на такую задачу - &quot;деструктор класса содержит ф-цию exit(), создайте глобальный объект класса и посмотрите, что...

Размер массива по указателю - C++
Не уверен, что всё правильно понимаю... Про &quot;new&quot; пишут, что оно выделяет необходимое количество памяти и возвращает указатель на начало...

Размер символьного массива - C++
Всех приветствую! Прошу простить, что тревожу столь банальными вопросами, но сам додумать не могу... Задан массив: char *a =...

Отрицательный размер массива - C++
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;russian&quot;); int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
d13mon
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 11
29.03.2012, 23:56  [ТС]     Размер внешнего глобального массива #9
Цитата Сообщение от Байт Посмотреть сообщение
Совершенно верно. Но компиляция проходит отдельно для каждого модуля. Можно решить проблему другими путями. Через #define, const и тд. Но через sizeof - не получится. Можно, конечно, в 2.cpp написать extern int arr[5], но тогда тебе самому за этой пятеркой придется следить.
Да, указывать размер в 2.cpp я пробовал, компилировал, но это не вариант, так как в реальной задаче я не знаю размера массива из 1.cpp.

Добавлено через 1 минуту
В общем, всё ясно - раздельная компиляция С++.

Всем спасибо.
Yandex
Объявления
29.03.2012, 23:56     Размер внешнего глобального массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru