Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить количество элементов в массиве имея указатель  (Прочитано 21443 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AZtpaRU
Гость
« : 21-06-2005 11:00 » 

Добрый день.

Как подсчитать количество элементов в массиве имя его указатель, например
wchar_t **ppWchar = new wchar_t*[100];

unsigned int nSize = sizeof(ppWchar)/sizeof(ppWchar[0]);
дает 1;

nSize = sizeof((wchar_t*[])ppWchar)/sizeof(ppWchar[0]);
дает ошибку компиляции:
error C2440: 'type cast' : cannot convert from 'unsigned short ** ' to 'unsigned short *[]'

Как сделать правильно?

AZtpaRU,
Спасибо.


« Последнее редактирование: 19-12-2007 19:29 от Алексей1153++ » Записан
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-06-2005 11:40 » 

никак, указатель ссылылается только на первый элемент, а сколько их там он не знает.
Записан

Fatal error C1: Brain expected
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-06-2005 16:35 » 

AZtpaRU, к сведению: sizeof() не ф-ия, а оператор и вычисляется на этапе компиляции. В качестве параметра принимает имя типа или переменной, возвращает, соотвт., размер занимаемой типом или данной переменной памяти с учетом выравнивания. Задав в качестве параметра указатель (неважно на какой тип) ты получишь всегда один и тот же результат - размер самого указателя. Для x86 это будет 4.

Нужно создать еще одну переменную, в которую поместить размер массива. Создаешь массив - тут же заносить размер в переменную.

Если размер задается статически, но может меняться вручную в исходниках, то лучше задать макро и подставлять его везде, где нужно знать размер массива (в том же new).
« Последнее редактирование: 21-06-2005 16:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 21-06-2005 17:07 » 

вообще, если взять частный случай, что массив - это null-terminated строка, то строка, скорее всего, закончится символом нуля.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
AZtpaRU
Гость
« Ответ #4 : 21-06-2005 17:58 » 

Добрый вечер RXL.

Все верно в отношении указателей, выравнивания и макро. Но если размер неизвестен изначально и задается системой на входе, например:

int __cdecl main(int argc, char *argv[],char *envp[]){
  return 0;
}

Так вот как узнать размерность массива envp[] ?;

AZtpaRU.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 21-06-2005 18:10 » 

Давай по порядку.
Шас я сделал пробный проект в VC и он дал мне
Код:
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
Там все таки два параметра идут, а не три. Первый параметр argc и есть количество данных в массиве.
Со строками чуть легче и сложнее. Последний символ у нуль терминальной строки всегда должен быть 0. Иначе возможны глюки программы. Сложнее, если ты не знаеш истинную длину строки, то нарашивать строку чревато последствиями.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 21-06-2005 18:13 » 

Как правило. Вместе с массивом функцию передается переменная, обозначаюшая его длину.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-06-2005 22:04 » 

Finch, есть несколько прототипов main(), с колличесвом аргуметнов 0, 2 и 3.

AZtpaRU, в случае argv и envp принято такое соглашение: аоследний элемент массив равен 0.

char ** arg;
for ( arg = argv; *arg; arg++ ) ....;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Pu
Большой босс

ru
Offline Offline
78


« Ответ #8 : 04-07-2005 10:07 » 

AZtpaRU, проще всего использовать STL массивы(тот же vector, например). ПРоблемы с определением размера нет.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
EvilsInterrupt
Гость
« Ответ #9 : 09-07-2005 19:21 » new

Там все таки два параметра идут, а не три

не как раз таки 3! еще указатель на массив переменных среды!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines