как записать в массив char элемент размерности short ?
От: HAXT  
Дата: 02.12.15 19:59
Оценка: -1 :)
Помогайте коллеги,

есть массив элементов char

unsigned char data[255]; (255 по 1 байту каждый)

нужно начиная с третьего его элемента записать значение unsigned short (2 байта)

почему-то так не получается
(unsigned short*)(data[2]) = 65535;

пишет expression must be a modifiable lvalue

а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля
Отредактировано 02.12.2015 20:09 HAXT . Предыдущая версия .
Re: как записать в массив char элемент размерности short ?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 02.12.15 20:27
Оценка:
Здравствуйте, HAXT, Вы писали:

HAX>Помогайте коллеги,


HAX>есть массив элементов char


HAX>unsigned char data[255]; (255 по 1 байту каждый)


HAX>нужно начиная с третьего его элемента записать значение unsigned short (2 байта)


HAX>почему-то так не получается

HAX>(unsigned short*)(data[2]) = 65535;

HAX>пишет expression must be a modifiable lvalue


HAX>а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля


Может все-так адрес взять элемента массива?
(unsigned short*)(& data[2]) = 65535;
Aml Pages Home
Отредактировано 02.12.2015 20:28 Carc . Предыдущая версия . Еще …
Отредактировано 02.12.2015 20:28 Carc . Предыдущая версия .
Re[2]: как записать в массив char элемент размерности short
От: watchmaker  
Дата: 02.12.15 20:39
Оценка: 8 (3) +3
Здравствуйте, Carc, Вы писали:

C>Может все-так адрес взять элемента массива?

C>(unsigned short*)(& data[2]) = 65535;

Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;


А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.
Отредактировано 02.12.2015 20:41 watchmaker . Предыдущая версия .
Re[2]: как записать в массив char элемент размерности short
От: HAXT  
Дата: 02.12.15 20:40
Оценка:
C>Может все-так адрес взять элемента массива?
C>(unsigned short*)(& data[2]) = 65535;

(unsigned short*)(&data[2]) = 65535;
результат тот же самый


Error 1 error C2440: '=' : cannot convert from 'int' to 'unsigned short *'
2 IntelliSense: expression must be a modifiable lvalue
Отредактировано 02.12.2015 20:42 HAXT . Предыдущая версия .
Re[3]: как записать в массив char элемент размерности short
От: HAXT  
Дата: 02.12.15 21:29
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Carc, Вы писали:


C>>Может все-так адрес взять элемента массива?

C>>(unsigned short*)(& data[2]) = 65535;

W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;


W>А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.


Спасибо большущее !!!
Re: как записать в массив char элемент размерности short ?
От: · Великобритания  
Дата: 02.12.15 22:59
Оценка: +3
Здравствуйте, HAXT, Вы писали:

HAX> а мне нужно этой операцией перезаписать 2 байта в этом массиве, 2, и 3 по индексу с нуля

А проще нельзя?
data[2] = 255
data[3] = 255
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: как записать в массив char элемент размерности short ?
От: BulatZiganshin  
Дата: 03.12.15 04:38
Оценка: -1 :))) :))) :)))
Здравствуйте, ·, Вы писали:

·>А проще нельзя?

·>data[2] = 255
·>data[3] = 255

но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать...
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: как записать в массив char элемент размерности short
От: _hum_ Беларусь  
Дата: 03.12.15 10:16
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Carc, Вы писали:


C>>Может все-так адрес взять элемента массива?

C>>(unsigned short*)(& data[2]) = 65535;

W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;


W>А также не забыть, что вся эта конструкция легко может навернуться из-за невыровненной записи (в зависимости от архитектуры). И нужно либо самому следить за этим (где, например, alignas в декларации массива?), либо использовать единственный кросплатформенный в C/C++ способ записи в произвольное место в памяти — функцию memcpy.


правильно ли я понимаю, что если char data[10] содержал адрес adress_1 (адрес начала массива), то в общем случае (int*)data может содержать уже другой adress_2 != adress_1? и если так, то что даже reinterpret_cast<int*>(data) не сможет исправить ситуацию?
Re[3]: как записать в массив char элемент размерности short
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.12.15 10:30
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Carc, Вы писали:


C>>Может все-так адрес взять элемента массива?

C>>(unsigned short*)(& data[2]) = 65535;

W>Этого мало — нужно ещё и разыменовать:
*(unsigned short*)(&data[2]) = 65535;

Ну кагбэ само собой. Просто не заметил по стартовой теме, полюбасу (ц) придется сначала адресок взять, а потом танцебубнить с приведением указателя, а не значения. А так я на lvalue сходу замкнулся.

Хотя, конечно, вы правы. По цели задачи придется еще и разыменовать.
Aml Pages Home
Отредактировано 03.12.2015 10:31 Carc . Предыдущая версия .
Re[4]: как записать в массив char элемент размерности short
От: BulatZiganshin  
Дата: 03.12.15 11:49
Оценка:
Здравствуйте, _hum_, Вы писали:

__>правильно ли я понимаю, что если char data[10] содержал адрес adress_1 (адрес начала массива), то в общем случае (int*)data может содержать уже другой adress_2 != adress_1? и если так, то что даже reinterpret_cast<int*>(data) не сможет исправить ситуацию?


блин, читаю этот тред, а в голове всё вертится фраза "москва — город девяти вокзалов"...
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: как записать в массив char элемент размерности short
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.12.15 13:27
Оценка: :)
Здравствуйте, HAXT, Вы писали:


C>>Может все-так адрес взять элемента массива?

C>>(unsigned short*)(& data[2]) = 65535;

HAX>(unsigned short*)(&data[2]) = 65535;

HAX>результат тот же самый


HAX>Error 1 error C2440: '=' : cannot convert from 'int' to 'unsigned short *'

HAX> 2 IntelliSense: expression must be a modifiable lvalue

Ясен перец, потом что rvalue должно быть того же типа, а не int.
(unsigned short*)(&data[2]) =(unsigned short)65535;//к типу то приведи!!!
Aml Pages Home
Отредактировано 03.12.2015 13:27 Carc . Предыдущая версия .
Re[3]: как записать в массив char элемент размерности short ?
От: Erop Россия  
Дата: 03.12.15 16:25
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:


BZ>·>А проще нельзя?

BZ>·>data[2] = 255
BZ>·>data[3] = 255

BZ>но это же займёт целых два такта!

От архитектуры оч. зависит, и от оптимизатора. Но на х86 часто бывает, что смесь 1-но и 2-байтных операций с памятью стоит дорого, так как не парится...

BZ>как можно в форуме C++ такое святотатство предлагать...

И то правда...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: как записать в массив char элемент размерности short ?
От: Mr.Delphist  
Дата: 03.12.15 16:30
Оценка: +2
Здравствуйте, HAXT, Вы писали:

HAX>Помогайте коллеги,


HAX>есть массив элементов char


HAX>unsigned char data[255]; (255 по 1 байту каждый)


HAX>нужно начиная с третьего его элемента записать значение unsigned short (2 байта)


На всякий случай позанудствую про endianness: какой байт надо первым класть, старший или младший?
Re[4]: как записать в массив char элемент размерности short ?
От: BulatZiganshin  
Дата: 03.12.15 16:33
Оценка: -2
Здравствуйте, Erop, Вы писали:

BZ>>но это же займёт целых два такта!

E>От архитектуры оч. зависит, и от оптимизатора.

от оптимизатора — конечно, это как раз тот случай где человек может написать код на 100% эффективней компилятора! а вот от архитектуры — нет
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: как записать в массив char элемент размерности short ?
От: Erop Россия  
Дата: 03.12.15 18:55
Оценка: +1
Здравствуйте, BulatZiganshin, Вы писали:

BZ>а вот от архитектуры — нет


Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам.
А бывали, что и к байтам нет, тока к 48-битным словам и всё, например...

Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: как записать в массив char элемент размерности short ?
От: · Великобритания  
Дата: 03.12.15 19:37
Оценка: +2
Здравствуйте, Erop, Вы писали:

BZ>>а вот от архитектуры — нет


E>Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам.

E>А бывали, что и к байтам нет, тока к 48-битным словам и всё, например...

E>Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...

Только после того, как копистартер покажет результаты профайлера, указывающие на проблемы производительности в этом участке кода — будем думать как писать выгоднее. А пока — пусть пишет как проще и понятнее, фтопку магию преобразований типов ссылок указателей на элементы массива.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: как записать в массив char элемент размерности short ?
От: Erop Россия  
Дата: 03.12.15 19:51
Оценка:
Здравствуйте, ·, Вы писали:

·>Только после того, как копистартер покажет результаты профайлера, указывающие на проблемы производительности в этом участке кода — будем думать как писать выгоднее. А пока — пусть пишет как проще и понятнее, фтопку магию преобразований типов ссылок указателей на элементы массива.


+100500!
Совершенно согласен! Спор чисто теоретический характер носит. Для практических нужд, обычно достаточно просто memcpy использовать и всё...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: как записать в массив char элемент размерности short ?
От: · Великобритания  
Дата: 03.12.15 20:14
Оценка: 3 (1) +1 :)))
Здравствуйте, BulatZiganshin, Вы писали:

BZ>·>А проще нельзя?

BZ>·>data[2] = 255;
BZ>·>data[3] = 255;

BZ>но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать...

Тогда можно переписать как
data[2] = 255; data[3] = 255;
чтобы оно распараллелиось.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: как записать в массив char элемент размерности short ?
От: BulatZiganshin  
Дата: 04.12.15 06:45
Оценка: -1
Здравствуйте, Erop, Вы писали:

BZ>>а вот от архитектуры — нет


E>Прикинь, бывают архитектуры, где быстрого доступа к полуслову вообще нет. Тока к 32 или там 64-битному слову и к байтам.


прочёл я тебя и подумал — как я мог такую глупость сморозить! потом проверил на какое письмо ты отвечал:

BZ>>но это же займёт целых два такта!
E>От архитектуры оч. зависит, и от оптимизатора.
а вот от архитектуры — нет


так что ты просто потерял нить рассуждений

E>А бывали, что и к байтам нет, тока к 48-битным словам и всё, например...

E>Так что от архитектуры по скока зараз писать выгоднее ещё как зависит...

и сейчас такие архитектуры есть, причём прямо у тебя дома штуки 3 устройств как минимум найдётся. более того, если ТС продаст почку, то он сможет купить даже такой компьютер, где упомянутые присваивания займут 1 такт. но ты про них вряд ли слышал
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: как записать в массив char элемент размерности short ?
От: Mr.Delphist  
Дата: 04.12.15 13:37
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, BulatZiganshin, Вы писали:


BZ>>·>А проще нельзя?

BZ>>·>data[2] = 255;
BZ>>·>data[3] = 255;

BZ>>но это же займёт целых два такта! как можно в форуме C++ такое святотатство предлагать...

·>Тогда можно переписать как
·>data[2] = 255; data[3] = 255;
·>чтобы оно распараллелиось.
Вы троллите, или в самом деле полагаете, что работу с двумя соседними байтами планировщик отдаст двум ядрам, а затем доблестно будет бороться с рассинхронизацией ядерных кэшей?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.