2017-01-05 3 views
1

Я хочу реализовать инициализацию массива чисел с плавающей запятой. Использование предварительно просчитанных шестнадцатеричных значений. В результате аналогично этому:Как инициализировать двойной массив с предварительно рассчитанными шестнадцатеричными значениями?

double arr[3]; 
memcpy(&arr[0], "\xe3\x3b\xef\xf6\xc1\x78\xc6\x3f\xf9\x37\x5a\x8d\xfd\xae\x75\x3f\x62\xe9\x58\x48\x4f\x49\xc6\x3f",24); 

И я хочу, чтобы такая инициализация выполнялась в одной строке. Например, как в этом примере (но для чисел с плавающей запятой в моем случае):

const char s[] = "\x48\x69\x21"; 

Синтаксически ли это возможно?

+3

Нет, нет синтаксиса для инициализации объектного представления объекта в точке определения. –

+0

@KerrekSB: Разве это не слишком общее? – alk

+0

@ Jarod42 - Не в C это не будет. Это может быть значение ловушки или определенная реализация, но не UB. – StoryTeller

ответ

1

Что было бы ближе было бы к союзу. Проблема заключается в том, что строка litteral имеет нуль в его последнем символ, но это должно работать:

union { 
    char chr[3 * sizeof(double) + 1]; 
    double arr[3]; 
} val = { "\xe3\x3b\xef\xf6\xc1\x78\xc6\x3f\xf9\x37\x5a" 
    "\x8d\xfd\xae\x75\x3f\x62\xe9\x58\x48\x4f\x49\xc6\x3f" }; 

Просто, как он использует дополнительные байты там будет потрачена впустую часть памяти (обычно 4 байта на 32 битную машине)


Ссылки на стандарт:

в с а (не обязательное) примечание говорит, что она должна работать в 6.5.2.3 Структура и члены профсоюза

Если элемент, используемый для доступа к содержимому объекта объединения, не совпадает с элементом, который последний раз использовался для , сохраните значение в объекте, соответствующая часть представления объекта значения переинтерпретируется в качестве представления объекта в новый тип, как описано в 6.2.6 (процесс иногда называют «типа каламбурным»)

Я не смог найти какие-либо ссылок на C++ говорит ли это разрешено или нет, но все общих компиляторы принимают его. Чем больше отношение я мог бы найти в

9,5 Союзы [class.union]

В союзе, в лучшем случае один из не-статические данные могут быть активны в любое время, то есть, значение из большинство из нестатических элементов данных могут быть сохранены в объединении в любое время ... Все нестатические члены данных объединенного объекта имеют одинаковый адрес.

, который объясняет, почему она могла бы работать

и:

3,10 Lvalues ​​и rvalues ​​[basic.lval]

§10 Если программа пытается получить доступ к хранимой стоимости объект через значение gl, отличное от одного из следующих типов, поведение не определено ... [союзный доступ не указан]

, в котором четко сказано, что это приводит к неопределенному поведению. Проблема в том, что тот же абзац (известный как строгий псевдоним) также существует в выражениях C 6.5 §7 ...

TL/DR: Союзный путь явно действителен в C и, вероятно, UB в C++, поэтому мой совет должен был помещать его в блок компиляции C, связанный с программой на C++.

+0

Вопрос о C++, а не C. И AFAIK в C++ тип-punning через 'union' не допускается. – Olaf

+1

@ Олаф: Это разрешено в некоторых случаях. Другие виды использования нестандартны и в конечном итоге с UB, но на самом деле, вероятно, будут работать, как ожидалось. – AndyG

+0

@ Олаф, читающий комментарии к вопросу, я предполагаю, что вопрос был первоначально помечен как C, так и C++, поэтому ответ, относящийся только к C, был бы уместным. –

Смежные вопросы