Новая темаОтветить Страница 1 из 1   [ Сообщений: 8 ]
Автор Сообщение
 Заголовок сообщения: Массивы
СообщениеДобавлено: 07 фев 2016, 09:22 
Аватара пользователя

Зарегистрирован: 07 дек 2015, 14:40
Сообщения: 1102
Откуда: Рязань
По какому принципу подбирается размер массива?
Много встречал, когда размер массива превышает объем данных.
Такое ощущение, что пишут размер массива на бум. Главное, чтоб не меньше чем объем данных и всё, дальше хоть трава не расти.
Нужно пояснение такому явлению. :)
Или тут какая то другая хитрость?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 07 фев 2016, 11:37 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1462
Откуда: Москва
Размер массива подбирают из 4 вариантов.
1. Когда известна длинна данных и она не измена, то длинна массива равна длине данных. Например пакетная передача данных в протоколе.
2. Когда длинна передаваемых данных не известно, но известно максимальное количество одного пакета. Тогда создают массив длинной равной по длине максимального пакета.
3. Если длинна передаваемых данных очень большая и неизвестно, то используют динамический массив. Это часто используют при чтении файлов. Ведь никогда не известно какая длинна записанных данных.
4. Если программист не знает о существовании динамических массивов, а работает с файлами, то он создает массив с максимально возможной длинной данных файла. Зачастую может достигать нескольких килобайт)))

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 09 янв 2017, 00:26 
Аватара пользователя

Зарегистрирован: 07 дек 2015, 14:40
Сообщения: 1102
Откуда: Рязань
gurvinok Вопрос детский наверное.))
Почему вот так
Код:
long Otvet = 0;
Otvet = ((((came.data[0] << 8) | came.data[1]) << 8) | came.data[2]) & 0xFFFFFF;

выход с ошибкой в 1 бит, конкретно в data[0] лежит 0xBF, а все вместе склеивается, получается 0xFF, в остальных ячейках правильно.
А вот так
Код:
long Otvet = 0;
Otvet = ((came.data[0] << 8) | came.data[1]);
Otvet = ((Otvet << 8) | came.data[2]) & 0xFFFFFF;

Получается все как надо. Вроде же, это одно и тоже... нет?
или я где то ошибку не вижу?
came. это структура, внимания не нее не обращай.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 09 янв 2017, 11:56 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1462
Откуда: Москва
Блин, лобуху разбил. :(
Смотри, массив дата однобайтный, значит все сдвиги типа (дата << 8) тоже самое что и дата=0. Отсюда вытекает в первом варианте (0 | 0 | дата[2]) & 0хФФФФ.
Второй вариант (0 | дата[1]) это просто дата[1] так как ИЛИ с А будет А. С учетом того что после логического сложения данный байт положили в ответ, а данная пременная уже 16 битная, то сдвиг влево на 8 просто загоняет данные младшего байта в старший. Далее происходит логическое сложение с дата[2] а потом умножение на 0хФФФФ. По сути на выходе в ответе будет всегда в старшем байте дата[1], а в младшем дата[2].

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 10 янв 2017, 03:25 
Аватара пользователя

Зарегистрирован: 07 дек 2015, 14:40
Сообщения: 1102
Откуда: Рязань
Лобавуху, жалко. Сильно?
Я перед новым годом, тоже себе на лобавухе скол сделал... Починили, видно конечно, но поползти не должно.
Походу ты снова не внимательно смотришь...
Откуда взялась 16 битная переменная?
Число 24 бит, long, это 32.
И последнее решение, читает код правильно!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 10 янв 2017, 07:15 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1462
Откуда: Москва
Я писал в сервисе в расстроенных чувствах.
Но это сути не меняет. Лонг, инт один хрен ответ двигается один раз во второй строке. То есть при инт будет 0xBF, а при лонг 0x00BF. Суть одна и таже.

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 10 янв 2017, 11:23 
Аватара пользователя

Зарегистрирован: 07 дек 2015, 14:40
Сообщения: 1102
Откуда: Рязань
Цитата:
а при лонг 0x00BF
А почему у меня математика не выходит?
long = 32 бита = -2147483648 до 2147483647 = 0xFFFFFFFF
int = 16 бит ... 0xFFFF
char = 8 бит ... 0xFF
Походу стекло в дребезги и было оно с подогревом... Китайских, Российских нет, только оригинал. За штуку зелени... Да?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы
СообщениеДобавлено: 10 янв 2017, 12:01 
Аватара пользователя

Зарегистрирован: 02 мар 2013, 09:18
Сообщения: 1462
Откуда: Москва
Блин. Ну не пишу я ведущие нули. )) 0xFF и 0x000000000000FF одно и тоже. Каждый разряд это 4 бита. Ну или вот пример. Что больше 2 или 000000000000000002?

_________________
Если долго мучиться, может быть получится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Новая темаОтветить Страница 1 из 1   [ Сообщений: 8 ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
     Рейтинг@Mail.ru           Яндекс.Метрика