Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать размер динамического массива 
:(
    Опции темы
TheDestroyer
Дата 2.4.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Возможно ли узнать размер динамического массива?
Код

int *ar;    // указатель на элемент массива
int size=100;

ar=new int[size];        //Выделение памяти
memset(ar,0,size);    //Инициализация
size = sizeof(ar); // выдает 4

delete[] ar;            //Удаление


Похоже, что размер динамического массива узнать в C++, (у меня Borland C++) невозможно, и надо каждый раз передавать его размер как параметр. Это так?
Спасибо
PM MAIL   Вверх
Alca
Дата 2.4.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

невозможно

Возможно если массив это сишная строка
Код

strlen(size);


Добавлено через 34 секунды
В других случаях надо передавать размер массива.

Добавлено через 1 минуту и 5 секунд
Цитата

Код

size = sizeof(ar); // выдает 4


Это размер указателя


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 2.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(TheDestroyer @  2.4.2009,  13:04 Найти цитируемый пост)
 и надо каждый раз передавать его размер как параметр

один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. 

Это сообщение отредактировал(а) zim22 - 2.4.2009, 13:20


--------------------
PM MAIL   Вверх
Dmi3ev
Дата 2.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

size = sizeof(ar);

когда ты так пишешь ты должен понимать, что ar - это не массив, это всего лишь указатель... и размер массива массива ( 1 или 1000 элементов) никак не касается указателя...
а если ты хочешь узнать объем в байтах, то можно просто после выделения памяти посчитать
Код

int *ar;    // указатель на элемент массива
int size=100;
ar=new int[size];        //Выделение памяти
memset(ar,0,size);    //Инициализация
int size1=sizeof(int)*size;
delete[] ar;  


Это сообщение отредактировал(а) Dmi3ev - 2.4.2009, 13:14


--------------------

PM MAIL   Вверх
Alca
Дата 2.4.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



заверни свои данные в структуру и передавай ее в функцию

Это сообщение отредактировал(а) Alca - 2.4.2009, 13:22


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 2.4.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Dmi3ev @  2.4.2009,  13:14 Найти цитируемый пост)
int size1=sizeof(int)*size;

Гугл рекомендует не использовать sizeof от типа.
лучше написать 
Код

int size1=sizeof(size)*size;

Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно.


--------------------
PM MAIL   Вверх
mes
Дата 2.4.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  2.4.2009,  12:14 Найти цитируемый пост)
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. 

еще один : использовать std::vector и отградить себя от рутинной работы по контролю за динамическим массивом. smile


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 2.4.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. 

а может лучше в первом байте хранить размер и не считать в таком случае smile
Код

template <class T>
T* newArray(size_t count) {
    T* r = new T[count + 1];
    r[0] = count;
    return ++r;
}

template <class T>
void deleteArray(T* p) {
    delete [] --p;
}

template <class T>
int sizeofArray(T* p) {
    return *(p - 1);
}

что-то вроде этого

PM   Вверх
mrbrooks
Дата 2.4.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



TheDestroyer, используй std::vector и не ломай мозг.
PM MAIL   Вверх
mrbrooks
Дата 2.4.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



mes, припозднился  smile 
PM MAIL   Вверх
azesmcar
Дата 2.4.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



по любому у этих методов полно недостатков, лучше передавать..либо в структуре, либо просто так..без разницы

Добавлено через 2 минуты и 3 секунды
а еще лучше - как сказали 
mrbrooks
mes используй вектор
PM   Вверх
Anikmar
Дата 2.4.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mes @  2.4.2009,  13:37 Найти цитируемый пост)
еще один : использовать std::vector и отградить себя от рутинной работы по контролю за динамическим массивом.

Если это массив собственных классов - попутно наградить себя определением соответствующих конструкторов и операторов smile 
PM MAIL ICQ   Вверх
zim22
Дата 2.4.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(TheDestroyer @  2.4.2009,  13:04 Найти цитируемый пост)
Возможно ли узнать размер динамического массива?

размер статических массивов неявно передаётся в функцию в качестве параметра
Код
template <typename T, size_t size>
size_t get_size(const T (&arr)[size]) {
  return size;
}
int _tmain(int argc, _TCHAR* argv[])
{
  int arr[25];
  size_t size = get_size(arr);
    return 0;
}







--------------------
PM MAIL   Вверх
ISergeyN
Дата 2.4.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: 2
Всего: 2



А если так 
Код

#include <iostream>
using namespace std;

template<typename T> 
inline int arrlen(T *arr)
{
    return static_cast<int>(_msize(arr)/sizeof(T));
}

int main()
{
    int *arr = new int[100];

    cout<<arrlen(arr)<<endl;

    delete[] arr;

    return 0;
}

PM MAIL Skype   Вверх
Dmi3ev
Дата 2.4.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно. 

а зачем size другого типа, если я пишу:
Код

ar=new int[size]; 
 
хотя согласен, он может быть и беззнаковый и тд...
но size в данном случае не влияет на размер одного элемента, влияние оказывает new int, соответственно как раз так писать
Цитата

int size1=sizeof(size)*size;

ненадежно!
потому как, size - это количество элементов, и эта переменная будет неизменна, независимо от того какого типа будет массив и тд...

zim22, ты в этот раз не прав...



--------------------

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1860 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.