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

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

Восстановить пароль Регистрация
 
d13mon
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 11
29.03.2012, 13:23     Размер внешнего глобального массива #1
У меня возник такой вопрос :

Есть глобальный массив в одном файле:
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++ Удалить из массива все элементы встречающиеся менее 3-х раз и вывести размер полученного массива и его содержимое.
C++ Размер массива
Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? C++
C++ Хранение глобального массива с объектами
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
29.03.2012, 13:29     Размер внешнего глобального массива #2
Может быть в массиве можно хранить какую-либо метку в конце,
например, -1.
тогда длину массива можно вычислить кодом
C++
1
int size=0;for(;arr[size]!=-1;size++);
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
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
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
29.03.2012, 16:14     Размер внешнего глобального массива #6
Цитата Сообщение от d13mon Посмотреть сообщение
По идее реальный размер внешнего массива будет известен на этапе компиляции.
он будет известен на этапе компиляции в _другой_ единице трансляции.

Представь, компилятор транслирует файл 1.cpp (все проходит прекрасно), потом он переходит к другой единице трансляции, и тут ему нужно узнать о массиве, который находится непонятно где. И это при том, что до стадии линковки компилятору вообще не нужно ничего знать о других единицах трансляции
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
29.03.2012, 16:42     Размер внешнего глобального массива #7
Цитата Сообщение от d13mon Посмотреть сообщение
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
Совершенно верно. Но компиляция проходит отдельно для каждого модуля. Можно решить проблему другими путями. Через #define, const и тд. Но через sizeof - не получится. Можно, конечно, в 2.cpp написать extern int arr[5], но тогда тебе самому за этой пятеркой придется следить.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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++ Размер массива
Размер массива C++
Функция с применением динамического массива, чтобы размер массива увеличивался по мере необходимости C++

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

Или воспользуйтесь поиском по форуму:
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     Размер внешнего глобального массива
Ответ Создать тему
Опции темы

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