Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

29.03.2012, 13:23. Просмотров 753. Ответов 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) трогать нельзя.

Буду благодарен за любую помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 13:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размер внешнего глобального массива (C++):

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

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

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

Ввести размер массива с клавиатуры и передать этот размер в конструктор - C++
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Функция с применением динамического массива, чтобы размер массива увеличивался по мере необходимости - C++
Ребята, подскажите, кто может, каким образом создать функцию с применением динамического массива, но так, чтобы размер массива увеличивался...

Функция, которая удаляет из целочисленного одномерного массива все, и возвращает новый размер массива - C++
Разработать и испытать функцию, которая удаляет из целочисленного одномерного массива все, и возвращает новый размер массива. #include...

8
zss
Модератор
Эксперт С++
6575 / 6137 / 2021
Регистрация: 18.12.2011
Сообщений: 15,992
Завершенные тесты: 1
29.03.2012, 13:29 #2
Может быть в массиве можно хранить какую-либо метку в конце,
например, -1.
тогда длину массива можно вычислить кодом
C++
1
int size=0;for(;arr[size]!=-1;size++);
0
Байт
Нарушитель
Эксперт C
16672 / 10933 / 1674
Регистрация: 24.12.2010
Сообщений: 21,305
29.03.2012, 15:05 #3
Цитата Сообщение от d13mon Посмотреть сообщение
Мне нужен размер этого массива через sizeof. Торможу, не могу понять, как это сделать в данном случае.
Никак!
0
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++);
Не ну пересчитать элементы в цикле всегда можно) А если в реальном массиве у меня больше миллиона элементов?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
29.03.2012, 16:10 #5
используй вектор. либо держи размер рядом. Но лучше вектор.
1
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
29.03.2012, 16:14 #6
Цитата Сообщение от d13mon Посмотреть сообщение
По идее реальный размер внешнего массива будет известен на этапе компиляции.
он будет известен на этапе компиляции в _другой_ единице трансляции.

Представь, компилятор транслирует файл 1.cpp (все проходит прекрасно), потом он переходит к другой единице трансляции, и тут ему нужно узнать о массиве, который находится непонятно где. И это при том, что до стадии линковки компилятору вообще не нужно ничего знать о других единицах трансляции
1
Байт
Нарушитель
Эксперт C
16672 / 10933 / 1674
Регистрация: 24.12.2010
Сообщений: 21,305
29.03.2012, 16:42 #7
Цитата Сообщение от d13mon Посмотреть сообщение
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
Совершенно верно. Но компиляция проходит отдельно для каждого модуля. Можно решить проблему другими путями. Через #define, const и тд. Но через sizeof - не получится. Можно, конечно, в 2.cpp написать extern int arr[5], но тогда тебе самому за этой пятеркой придется следить.
1
Kuzia domovenok
2041 / 1886 / 172
Регистрация: 25.03.2012
Сообщений: 6,499
Записей в блоге: 1
29.03.2012, 16:44 #8
Цитата Сообщение от d13mon Посмотреть сообщение
Почему? Объясните. По идее реальный размер внешнего массива будет известен на этапе компиляции.
И если бы определение такого же массива находилось в файле 2.cpp, то размер бы прекрасно вычислялся.
Никак. представь, что компилятор компилирует 2.cpp
Если бы там просто использовался этот массив как например arr[1]=1;
проблем бы не было. компилятор хоть и не знает, где этот массив, но подставляет вместо него адрес, который даже не будет относится к этому массиву, но в последствии будет связан линковщиком с реальным массивом. Заглядывать в файл 1.срр ему не обязательно.
А вот для того чтобы использовать в функции конкретный размер массива он не может. То же самое произошло бы, если б ты объявил структуру. Ты мог бы пользоваться указателями на неё, но её реальный размер не узнал бы.
1
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 минуту
В общем, всё ясно - раздельная компиляция С++.

Всем спасибо.
0
29.03.2012, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2012, 23:56
Привет! Вот еще темы с ответами:

Удалить из массива все элементы встречающиеся менее 3-х раз и вывести размер полученного массива и его содержимое. - C++
Помогите пожалуйста решить задачу!!!!!! Дан целочисленный массив размера n. Удалить из массива все элементы встречающиеся менее 3-х...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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