Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Узнать размер массива в C++


Автор: SFY 29.9.2007, 10:52
Как узнать размер массива в C++? Не пойму...
Приведу пример:

Консольное приложение

int _tmain(int argc, _TCHAR* argv[])
{
   return 0;
}

Допустим, передаю приложению 2 параметра, они заносятся в массив argv[]. Необходимо определить, что в этот массив было действительно передано 2 параметра, не больше и не меньше.
Пытаюсь определить проверкой на размер массива но не пойму как это сделать  smile 

P.S. В MSDN не отправлять. Хочу пример!

Автор: Damarus 29.9.2007, 11:06
Никак.

PS. В данном случае argc - количество элементов argv.

Автор: JackYF 29.9.2007, 12:16
И вообще принято при передаче таких чистых массивов в функцию в одном из параметров передавать и размер массива.
main() не исключение smile

Автор: DigitSphinx 29.9.2007, 16:24
Как написал Damarus   “argc” и есть кол-во переданных параметров.
Или я вопроса не понял ?!

Автор: 0lmer 29.9.2007, 16:53
argc = 1 если параметров не передано
argc = 1 + <кол-во параметров> если есть параметры
первуй(или нулевой в массиве argv) параметр всегда имя программы

Автор: comcon1 29.9.2007, 18:20
можно как вариант, когда создаешь массив char* сам, последнему элементу всегда писать NULL. и проверять,  где NULL, там конец. но это не выгодно по времени исполнения.

Автор: SFY 29.9.2007, 22:53
Спасибо, помогло! smile

Автор: UnrealMan 29.9.2007, 23:16
Цитата(comcon1 @  29.9.2007,  19:20 Найти цитируемый пост)
можно как вариант, когда создаешь массив char* сам, последнему элементу всегда писать NULL. и проверять,  где NULL, там конец.

Во-первых, почему NULL? (NULL, вроде как, для обозначения нулевого указателя применяется, но никак не для символа). Во-вторых, это плохой вариант, если 0 может быть посередине массива (а речь-то идёт о массиве в общем случае, а не о строке).

Автор: Любитель 29.9.2007, 23:50
Цитата(UnrealMan @  29.9.2007,  23:16 Найти цитируемый пост)
NULL, вроде как, для обозначения нулевого указателя применяется, но никак не для символа

Чтоб людей запутать! Всё равно под плюсами NULL развернётся в простой 0, зато враги код не прочтут! + лучше заносить не ноль, а скажем 24. Правда, появятся проблемы с массивами, содержащими 24... Это можно почти пофиксить, используя в качестве "метки", например, три элемента массива. Скажем 24, 37, 92. Вероятность сбоя значительно падает!

Автор: Dov 30.9.2007, 00:34
comcon1 имел ввиду не строку символов, а массив указателей, последнему элементу которого присвоено значение NULL.  Я так думаю...  smile 

Автор: JackYF 30.9.2007, 00:56
Цитата(Dov @  30.9.2007,  00:34 Найти цитируемый пост)
Я так думаю... 

я тоже так думаю smile однако, это, имхо, плохой выход smile

Автор: UnrealMan 30.9.2007, 09:08
Цитата(Dov @  30.9.2007,  01:34 Найти цитируемый пост)
comcon1 имел ввиду не строку символов, а массив указателей, последнему элементу которого присвоено значение NULL. 

А, ну так можно, да.

Автор: Damarus 30.9.2007, 11:03
Цитата(Dov @  30.9.2007,  01:34 Найти цитируемый пост)
comcon1 имел ввиду не строку символов, а массив указателей, последнему элементу которого присвоено значение NULL.  Я так думаю...  smile  

Кстати, в "расширенной" версии main так и есть:
Код

#include <iostream>

int main(int argc, char *argv[], char *envp[])
{
    while (*envp)
        std::cout << *envp++ << std::endl;
}
 

Автор: JackYF 30.9.2007, 12:04
Цитата(Damarus @  30.9.2007,  11:03 Найти цитируемый пост)
Кстати, в "расширенной" версии main

Это что еще за расширенная версия? и чем она лучше обычной? что-то в стандарте я ее не видал...

Автор: MAKCim 30.9.2007, 12:31
JackYF, 
расширенная версия не может быть хуже или лучше, она просто предоставляет больше информации

Автор: comcon1 30.9.2007, 12:48
да, я имел ввиду массив строк, последний NULL. Кстати какой-то линуховой функции, кажется вызова программы execv, можно как раз передавать массив строк, заканчивающийся NULL. Так что эта идея юзается на высших уровнях. И еще, конечно же, эта идея юзается в самом char*. Конец строки там, где символ \0.

Автор: JackYF 30.9.2007, 13:37
Цитата(MAKCim @  30.9.2007,  12:31 Найти цитируемый пост)
больше информации 

envp - это список переменных окружения, что ли? и под какими ОС оно предоставляется?

Автор: 0lmer 30.9.2007, 13:43
кстати тут говорили о занесении NULL в конец массива, по моему лучше уж тогда сохранять длину в первом  элементе массива. так если не ошибаюсь строки в паскале организованы.

Автор: Damarus 30.9.2007, 14:54
Цитата(JackYF @  30.9.2007,  13:04 Найти цитируемый пост)
Это что еще за расширенная версия? и чем она лучше обычной? что-то в стандарте я ее не видал... 

Это расширение:
Цитата

J.5.1 Environment arguments
In a hosted environment, the main function receives a third argument, char *envp[],
that points to a null-terminated array of pointers to char, each of which points to a string
that provides information about the environment for this execution of the program
(5.1.2.2.1).

Автор: MAKCim 30.9.2007, 14:56
Цитата(JackYF @  30.9.2007,  13:37 Найти цитируемый пост)
envp - это список переменных окружения, что ли? и под какими ОС оно предоставляется? 

под всеми, где есть С-компилятор

Автор: takedo 3.10.2007, 05:45
Любитель, 
Цитата
24, 37, 92. Вероятность сбоя значительно падает! 
 - я под столом smile.
Конечно лучше и удобнее всего хранить длину в первых двух, трех, четырех байтах. Однако, можно сделать и по другому.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)