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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить размер массива? странное значение получаю..) 
:(
    Опции темы
mes
Дата 18.7.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Dem_max @  18.7.2010,  09:07 Найти цитируемый пост)
аналог массива в паскале

аналог строки, насколько мне известно, но никак не массива..



--------------------
PM MAIL WWW   Вверх
bsa
Дата 18.7.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dem_max @  18.7.2010,  11:07 Найти цитируемый пост)
в 0 байте храни размер массива, с 1 по 255 байты храни сами данные

... и добро пожаловать в каменный век! Далеко не все массивы имеют размер в 255 элементов. Очень часто встречаются и более большие. Да и не всегда массивы хранят целые числа, еще бывает структуры, классы, указатели...
Короче, твой совет из разряда медвежьих услуг.
PM   Вверх
Abyx
Дата 19.7.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dem_max, в паскале у массивов длина хранится в int (int16 в 16-разрядном турбопаскале, int32 в 32-разрядной делфе) и находится не в начале массива, а перед ним.
PM MAIL   Вверх
Chiren
Дата 21.7.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Т.е. выхода иного получается нет, кроме как таскать за собой это число в переменной?

"Таскать" одну переменную не так уж тяжело smile. Но выход есть.
Можно ввести символ конца массива: например, последний элемент равен нулю. И по такому признаку узнавать длину массива smile. Но выяснение этой длины будет занимать время. Если не жалко быстродействия ради экономии одной переменной, то почему нет? 

Информацию об объёме выделенной памяти хранит ОС где-то в своих таблицах о свободной памяти. Но программисту эта информация не доступна.
PM MAIL   Вверх
mes
Дата 21.7.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Chiren @  21.7.2010,  14:01 Найти цитируемый пост)
Но выяснение этой длины будет занимать время. 

а также программист лишен одного варианта, того кто будет терминатором..

и еще раз : не надо путать строку ( как терминированную последовательность )  и массив




--------------------
PM MAIL WWW   Вверх
djamshud
Дата 21.7.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>Но выход есть.

Среди извращений есть более простой и надежный вариант - выделять памяти на четыре (например) байта больше, чем нужно
Код

void *buf=malloc(sizeof(struct mystruct)*N+4);

в начало буфера записывать длину:
Код

memcpy(buf,&N,4);

и отдавать массив в пользование:
Код

struct mystruct *array=buf+4;

Освобождать память из-под него так:
Код

free(((void*)array)-4);



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 21.7.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(djamshud @  21.7.2010,  14:26 Найти цитируемый пост)
Среди извращений есть более простой и надежный вариант 

smile, а стоит ли даже задумываться об этом, если есть нормальные неизвращенные варианты ?!   


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 21.7.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



mes, таким извращением удобно пользоваться например для передачи буферов данных по сети и обработки их без дополнительных промежуточных преобразований. Но вообще лучше конечно без них, хотя извращенцы всегда найдутся, и от этого никуда не уйти. Так сделаем их жизнь прекрасней!

:)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 21.7.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(djamshud @  21.7.2010,  15:10 Найти цитируемый пост)
таким извращением удобно пользоваться например для передачи буферов данных по сети и обработки их без дополнительных промежуточных преобразований.

ну да пакет, массив  и буффер одно и то же.. 


Цитата(djamshud @  21.7.2010,  15:10 Найти цитируемый пост)
хотя извращенцы всегда найдутся, 

одного из них я уже знаю "в лицо".. но не буду показывать пальцем.. smile 

Это сообщение отредактировал(а) mes - 21.7.2010, 16:42


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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