LINUX.ORG.RU

А в gcc случайно нету атрибута умеющего фортраноское "-finit-real=xxx" но на отдельных обьектах.

 , , nan


0

2

Хотелось бы инициализировать ячейки по-умолчанию в большом многомерном массиве во чтото типа NaN и при этом не похоронить читабельность.

Гугль не помог.

★★★★★

Последнее исправление: cvv (всего исправлений: 2)

Ну так и инициализируй nan. 90 фортран позволяет инициализировать массивы целиком, без циклов.

unanimous ★★★★★
()

в большом многомерном массиве

только вот дин.линкер (да я ядро в принципе тож) не в курсе, что некий кусок памяти надо инициализовать по 8 байт 1.32E+12. Поэтому опаньки - или этот ваш массив будет статично определяться при компиляции что вздует размер бинарника, или пишите конструктор. Жестоко, но зато работает :-)

imho только вариант double arr[100500]={0}; не раздует бинарь. Надо-бы проверить, но лень :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Вопрос с раздутием бинарника - не актуален. Текущая ситуация из тех когда железо подганяют под задачу а не наоборот.

Поэтому опаньки - или этот ваш массив будет статично определяться при компиляции

Хотелось бы увидеть как бы вы это сделали.

или пишите конструктор.

А про конструкторы то я и подзыбыл :-(((

imho только вариант double arr[100500]={0}; не раздует бинарь. Надо-бы проверить, но лень :-)

Это определяется конкретной аппаратной поддержкой плавающей точки. На х86 проедет. Но точно есть платформы - на которых непроканает. Пару лет назад ктото приводил здесь пример

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от mix_mix

Хм. Немного не то но благодарю что напомнили. Мне бы сильно хотелось уйти от индексов для ячеек устанавливаемых в дефолтное значение.

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)

Я думаю, что самый разумный вариант - это неинициализированный массив (таким образом он будет помещён в .bss, который не занимает места в бинарнике) и заполнение его руками в функции, помеченной __attribute__((constructor)).

Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)

struct Void
{
};

Void init_x(double** arr, int sz_x, int sz_y, int value)
{
  for(int i = 0; i<sz_x; i++) for(int j = 0; j<sz_y; j++)
    arr[i][j] = value;
  return Void();
}

double array[SZ_X][SZ_Y];
Void skip = init_x(array, SZ_X, SZ_Y, NAN); 

Вместо Void можно использовать любой тип, кроме void. Код пригоден для глобальных и локальных областей видимости и для динамических массивов.

anonymous
()
Ответ на: комментарий от anonymous

int value

очепятка: double value, конечно же. но, в плюсах, а не чистом С лучше темплайтную ф-цию использовать, в любом случае.

anonymous
()
Ответ на: комментарий от cvv

Вопрос с раздутием бинарника - не актуален. Текущая ситуация из тех когда железо подганяют под задачу а не наоборот.

А написать скрипт который генерит varName[X][Y][Z] в стиле:

> genMatix double varName 100 500 800 = NaN

double varName[100][500][800]={ { { NaN,..,NaN }, {...} ... };

чтобы подсовывать ЭТО в Makefile ?

ps/ далее по идее можно вместо NaN совать любую формулу от X,Y,Z; Может кто даже и спасибо скажет за такой скрипт

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ну если бы мне это подходило то я это уже сделал бы при помощи cog. Хотя возможно над этим нужно еще раз подумать.

Кстати - не совсем понятна реплика о мейкфайле.

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от cvv

Кстати - не совсем понятна реплика о мейкфайле.

foo.o : 
    genMatrix double fooVar ... | gcc -c -o foo.o - 

или своим скриптом сразу делать нужный образ памяти (чтобы немучить компилер понапрасну) и далее objcopy. Но это всё равно в правилах сборки.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.