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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение размера массива изнутри функции 
:(
    Опции темы
almikhail
Дата 19.12.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как изнутри функции определить размер массива который передан как указатель в аргумент этой функции.
Функция sizeof в данном случае возвращает лишь размер типа.
Спасибо за ответ.
PM MAIL   Вверх
Anikmar
Дата 19.12.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Простыми методами никак.
Думаю теоритически можно узнать размер выделенного блока памяти (delete[] ведь как-то это делает)

Насколько я знаю sizeof вычисляет значение на этапе компиляции - динамический массив им мерить бесполезно

Это сообщение отредактировал(а) Anikmar - 19.12.2006, 11:07
PM MAIL ICQ   Вверх
EvgenZ
Дата 19.12.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



а нельзя размер передать?
 
Код

void func(int*,int);

или vector


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
apook
Дата 19.12.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ведь это совсем не сложно
Код

#include "stdio.h"
#include "conio.h"


int unknown_size( int *Array )
{
int i=0;
for( ; *Array ; Array++, i++ ); //практически вот определение размера
Array=Array-i;

printf( "Sizze of Array =%d\n", i+1 );
getch();

return i;
}


void main()
{
int i=0;
int daytab[14] = { 4, 5, 8, 10, 30, 28, 31, 40, 5, 88, 7, 7, 8 };
i=unknown_size( daytab );
}


Это сообщение отредактировал(а) apook - 19.12.2006, 13:23


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Anikmar
Дата 19.12.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я не понял принцип работы данного кода, если честно
PM MAIL ICQ   Вверх
jonie
Дата 19.12.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



apook не знаю что ты курил когда написал сий код, но вставило конкретно...
передай массивчик вида 
int daytab[14] = { 4, 5, 8, 0, 0, 28, 31, 40, 5, 88, 7, 7, 8 };
и погляди как сработает)
это сработает для NULL-терминированных строк....ну уж никак для рандомного массива. Более того тот код вообще не коорректен и в общем случае вызовет(может вызвать) пробой памяти. Кто вам даст гарантию что в стеке есть NULL ??
-------
зы : в ф-цию передается лишь указатель и никаких данных более. нельзя пологаться на то что массив создан по new (malloc\etc).... передавайте отдельно размер или делайте тип (vector как кто-то уже предложил) что содержит в себе указание на размер...

Это сообщение отредактировал(а) jonie - 19.12.2006, 13:51


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Anikmar
Дата 19.12.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В том-то и дело, что там не NULL ищется
for( ; *Array ; Array++, i++ );
         ^^^^^

Этот каод применим только к строкам с конечным 0.

Простого метода определения нет, и я полностью согласен с jonie.

Проще передать указатель на массив и его размер - так сделано в огромном количестве библиотечных функций.

Теоритически - можно узнать размер блока памяти, выделенного под массив, но это никак не даст нам собственно размер массива - там может быть выравнивание, память могла выделится с запасом и т.п.
PM MAIL ICQ   Вверх
apook
Дата 19.12.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Принцып в том что известен последний символ массива

Цикл for( ; *Array ; Array++, i++ ); будет читать до последнего элемента
для этого его размер на 1 больше а вообще можно явно указать последний
символ например '\0';
int daytab[14] = { 4, 5, 8, 0, 0, 28, 31, 40, 5, 88, 7, 7, '\0' };


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Anikmar
Дата 19.12.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(apook @ 19.12.2006,  13:58)
Принцып в том что известен последний символ массива

Цикл for( ; *Array ; Array++, i++ ); будет читать до последнего элемента
для этого его размер на 1 больше а вообще можно явно указать последний
символ например '\0';
int daytab[14] = { 4, 5, 8, 0, 0, 28, 31, 40, 5, 88, 7, 7, '\0' };

И что этот код выдаст? Неужели размер массива?!  smile 

Конкретно на этом примере он остановится на первом же 0.
Код нерабочий, это и ежу понятно.

Это сообщение отредактировал(а) Anikmar - 19.12.2006, 14:04
PM MAIL ICQ   Вверх
apook
Дата 19.12.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код рабочий! Работает он по тому принципу что имя массива это есть указатель
на его нулевой символ таким образом по массиву можно пройти от начала до
конца не используя индексы а прибавляя к имени единицу это детском саду 
говорили Array++


Вообще конечно такой способ для типа char
ну вот вариант с нагромождениями
Код

#include "stdio.h"
#include "stdlib.h"

class unknown
{
public:
long *Array;
//в любой из указанных здесь функций будет известен размер массива Array
unknown( int size );
void show_size(); // <--например вот
~unknown();

protected:
int array_size;

}

unknown::unknown( int size )
{
array_size=size;
Array =new long[size];

for( int i=0; i <array_size; i++ )
        Array[i] =rand() % 10; //и сразу заполним
}

unknown::~unknown()
{
delete [] Array;
}

void unknown::show_size() // <--
{
printf( "\nSizze of Array = %d\n", array_size );
}


void main()
{
unknown www( 14 );

for( int i=0; i <14; i++ )
    printf( "%d", www.Array[i] );

www.show_size();
return;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
JackYF
Дата 19.12.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(apook @  19.12.2006,  15:16 Найти цитируемый пост)
Код рабочий!

на daytab[3] ( == 0 ) код остановится. Код нерабочий.



Цитата(apook @  19.12.2006,  15:16 Найти цитируемый пост)
для типа char

Для типа char давно написан std::string.

А для других типов - basic_string<T>.



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


Опытный
**


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

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



Вообще то almikhail не указал какого типа массив возможна специфичная ситу
ация когда не следует использовать библиотечные функции. Зачем то же
задан был этот вопрос
Цитата

на daytab[3] ( == 0 ) код остановится. Код нерабочий.

На Борландских компиляторах все прекрасно работает теоритически и практически


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
bsa
Дата 19.12.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(apook @ 19.12.2006,  15:43)
Цитата

на daytab[3] ( == 0 ) код остановится. Код нерабочий.

На Борландских компиляторах все прекрасно работает теоритически и практически

Сказали код не работает. И не будет работать, так как алгоритм заведомо неверный.
Преобразуем исходную программу в эту. Ведь это тоже самое, не так ли?
Код

const int *array = { 1, 2, 3, 0, 5, 6, 7, 0, 9, 10 };
int i = 0;
for(; *array; array++, i++)
  printf("array[%d] = %d\n", i, *array);
printf("end: i = %d\n", i);

результат ее выполнения:
Код
array[0] = 1
array[1] = 2
array[2] = 3
end: i = 3

PM   Вверх
apook
Дата 19.12.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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



    int strlen(char* p)
     {
       int i = 0;
       while (*p++) i++;
       return i;
     }
и не морочте мне голову
 


Это сообщение отредактировал(а) apook - 19.12.2006, 17:18


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
bsa
Дата 19.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это ты морочишь голову. Причем не только себе. Посмотри, что ты здесь написал. Где там char? Там в массиве даже нуля в конце нет.
Кстати, речь идет о массивах вообще, а не о строковых. Если в строковых нулевой символ на конце - норма (для C/C++), то для всех остальных видов массивов - нет.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1230 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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