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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать размер массива в C++ 
:(
    Опции темы
SFY
Дата 29.9.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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

Это сообщение отредактировал(а) SFY - 29.9.2007, 10:52
PM MAIL   Вверх
Damarus
Дата 29.9.2007, 11:06 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Никак.

PS. В данном случае argc - количество элементов argv.
PM MAIL ICQ Jabber   Вверх
JackYF
Дата 29.9.2007, 12:16 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
DigitSphinx
Дата 29.9.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
0lmer
Дата 29.9.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



argc = 1 если параметров не передано
argc = 1 + <кол-во параметров> если есть параметры
первуй(или нулевой в массиве argv) параметр всегда имя программы
PM   Вверх
comcon1
Дата 29.9.2007, 18:20 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



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


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


Новичок



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

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



Спасибо, помогло! smile
PM MAIL   Вверх
UnrealMan
Дата 29.9.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

Это сообщение отредактировал(а) UnrealMan - 29.9.2007, 23:17
PM MAIL   Вверх
Любитель
Дата 29.9.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



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

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


--------------------
PM MAIL ICQ Skype   Вверх
Dov
Дата 30.9.2007, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



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


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
JackYF
Дата 30.9.2007, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 30.9.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

А, ну так можно, да.
PM MAIL   Вверх
Damarus
Дата 30.9.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(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;
}
 

Это сообщение отредактировал(а) Damarus - 30.9.2007, 11:12
PM MAIL ICQ Jabber   Вверх
JackYF
Дата 30.9.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 30.9.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
comcon1
Дата 30.9.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



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


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
0lmer
Дата 30.9.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



кстати тут говорили о занесении NULL в конец массива, по моему лучше уж тогда сохранять длину в первом  элементе массива. так если не ошибаюсь строки в паскале организованы.
PM   Вверх
Damarus
Дата 30.9.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(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).

PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 30.9.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
takedo
Дата 3.10.2007, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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