Массивы

Здесь все вопросы по языку программирования С
Ответить
Аватара пользователя
GhostX
Сообщения: 1103
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Массивы

Сообщение GhostX » 07 фев 2016, 09:22

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

Аватара пользователя
gurvinok
Сообщения: 1468
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Массивы

Сообщение gurvinok » 07 фев 2016, 11:37

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

Аватара пользователя
GhostX
Сообщения: 1103
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Массивы

Сообщение GhostX » 09 янв 2017, 00:26

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. это структура, внимания не нее не обращай.

Аватара пользователя
gurvinok
Сообщения: 1468
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Массивы

Сообщение gurvinok » 09 янв 2017, 11:56

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

Аватара пользователя
GhostX
Сообщения: 1103
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Массивы

Сообщение GhostX » 10 янв 2017, 03:25

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

Аватара пользователя
gurvinok
Сообщения: 1468
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Массивы

Сообщение gurvinok » 10 янв 2017, 07:15

Я писал в сервисе в расстроенных чувствах.
Но это сути не меняет. Лонг, инт один хрен ответ двигается один раз во второй строке. То есть при инт будет 0xBF, а при лонг 0x00BF. Суть одна и таже.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1103
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Массивы

Сообщение GhostX » 10 янв 2017, 11:23

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

Аватара пользователя
gurvinok
Сообщения: 1468
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Массивы

Сообщение gurvinok » 10 янв 2017, 12:01

Блин. Ну не пишу я ведущие нули. )) 0xFF и 0x000000000000FF одно и тоже. Каждый разряд это 4 бита. Ну или вот пример. Что больше 2 или 000000000000000002?
Если долго мучиться, может быть получится.

Ответить