Консультация № 55216
12.09.2006, 21:38
0.00 руб.
0 7 4
функция принемает значения:
void input(char *data);

И обрабатывает их внутри, но как узнать размер переданных в нее данных???
Это не строки, это массив данных и нулевых значений в нём много, поэтому strlen(data) непригодна.

Если передавать динамически созданный массив через new то мы конечно можем узнать его размер через msize.
Ну а как быть если помимо динамичесского массива мы принимаем и статические наример обычные строки (но с несколькими нулями например в теле), ну или хотябы туже обычную строку. например input("stroka dannih");

Вот... только один простенький вопрос... как мне узнать размер данных переданых по указателю в функцию. очень нехочется отдельно передовать размер в функцию вместе с данными, темболее что я сам невовсех случаях его знаю.
Очень прошу помочь ;(

Обсуждение

Неизвестный
12.09.2006, 21:54
общий
это ответ
Здравствуйте, DDMZ!

Размер переданных данных по указателю на них Вы не определите ни как, поэтому предлагаю варианты:
1. Передавать размер отдельным параметром (то, чего Вы не хотите).
2. Передавать структуру типа
struct sdata
{
int size;
char* data;
};
3. Использовать шаблон vector<> из STL.
4. Хранить размер в первых нескольких байтах char* data (но такой вариант удобен не всегда).
Неизвестный
12.09.2006, 23:00
общий
это ответ
Здравствуйте, DDMZ!
Просто смотрим в справку по VC++:

// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>

size_t getPtrSize( char *ptr )
{
return sizeof( ptr );
}

using namespace std;
int main()
{
char szHello[] = "Hello, world!";

cout << "The size of a char is: "
<< sizeof( char )
<< "\nThe length of " << szHello << " is: "
<< sizeof szHello
<< "\nThe size of the pointer is "
<< getPtrSize( szHello ) << endl;
}
результат:

The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4

Неизвестный
12.09.2006, 23:53
общий
<b>2Vaga</b>:Читаем тот же раздел MSDN дальше:The sizeof operator cannot be used with the following operands:...- Dynamically allocated arrays. - External arrays. ...Так что Ваш вариант пройдёт далеко не всегда.
Неизвестный
13.09.2006, 06:50
общий
char t1[]="zzzzzzzzzzzz\0x0bbb";char *t2="zzzzzzzzzzzz\0x0bbb";sizeof t1 определит.... 19а sizeof (*t2) и sizeof (t2) непоможет...для t2 и _msize тоже неподойдет(с шибой выпадет)... так-что остется ломать голову. КАК?(Итог:1.для с[] и с[XX] можем определить через sizeof2.для с=new [XX] можем поределить через msize3.для *с="xx" определить неможем.4.Как заранее определить что мы получили? 1 или 2, чтобы зарание применить нужный метод?(
Неизвестный
13.09.2006, 07:03
общий
Не... Vaga , вариант совсем плохой оказывается.Щаз проверил более тщательно.input(t1);на выходе получим то что размер переданного в функцию t1, мы получить неможем!ИТОГ:Внутри функции:1. Определятся перестает. т.к. становится аналогом 3.2. Определяется также через msize3. Как неопределялось так и неопределяется.4. Заранее бестолку определять... все равно размер узнать несможем.Есть у меня другая идея:Как можно определить принадлежность полученного указателя к динамическому массиву?(дело в том что если срузу использовать _msize не для динамически созданного то мы вывалимся! поэтому надо быть увереным)И если массив переданный был создан не! динамически, то возвращать ошибку и чтобы для статически созданых массивов использвали перегруженную аналогичную функцию например input(t1,sizeof (t1))
давно
Академик
20764
1861
13.09.2006, 12:11
общий
это ответ
Здравствуйте, DDMZ!

В общем случае - никак!

Если есть возможность, пусть тот, кто эту функцию вызывает, передает следующим пераметром явно размер данных.

Ну да, если память под переданные данные была получена через malloc или new - там прямо перед данными есть некий заголовок. Можно разобраться в реализации, подвинуть указатель назад и посмотреть на данные этого заголовка, но это совсем грязный способ.
Неизвестный
14.09.2006, 09:10
общий
это ответ
Здравствуйте, DDMZ!
никак.
самый простой вариант это добавить в функцию аргумент говорящий о размере первого.
можно конечно повыпендриваться и сказать что по указателю некая структура первые 4 байта которой есть размер в всё остальное данные но спросите себя вы уверены что потом не запутаетесь?
Форма ответа