Простое объявление массива C / вопрос о присвоении

Проверьте свой math.h файл. Если Вы удачливы, что имеете nextafter и nextafterf функции, определяемые. Они делают точно, что Вы хотите портативным и независимым от платформы способом и являетесь частью стандарта C99.

Другой способ сделать оно (могло быть решение для нейтрализации) должно разложить Ваше плавание на часть экспоненты и мантиссу. Постепенное увеличение легко: Просто добавьте тот к мантиссе. Если Вы получаете переполнение, необходимо обработать это путем постепенного увеличения экспоненты. Постепенное уменьшение работает тот же путь.

РЕДАКТИРОВАНИЕ : Как указано в комментариях достаточно просто увеличить плавание в, он - двоичное представление. Переполнение мантиссы увеличит экспоненту, и это точно, что мы хотим.

Это - вкратце то же самое, которое делает nextafter.

Это не будет абсолютно портативно все же. Необходимо было бы иметь дело с порядком байтов и тем, что не все машины действительно имеют плавания IEEE (хорошо - последняя причина является более академической).

Также обрабатывающий NAN's и большое количество может быть немного хитрым. Вы не можете просто увеличить их, поскольку они - по определению не числа.

7
задан Daniel Wood 17 October 2009 в 13:00
поделиться

6 ответов

вы можете объявить статический массив с данными для инициализации из:

static int initvalues[3] = {1,2,3};
…
if(1)
    memmove(values,initvalues,sizeof(values));
2
ответ дан 6 December 2019 в 07:06
поделиться

Вы можете выполнять множественное присвоение только массива, когда вы объявляете массив:

int values[3] = {1,2,3};

После объявления вам нужно будет присвоить каждое значение индивидуально, т.е.

if (1) 
{
  values[0] = 1;
  values[1] = 2;
  values[2] = 3;
}

Или вы можете использовать цикл, в зависимости от того, какие значения вы хотите использовать.

if (1)
{
  for (i = 0 ; i < 3 ; i++)
  { 
    values[i] = i+1;
  }
}
12
ответ дан 6 December 2019 в 07:06
поделиться
 //compile time initialization
 int values[3] = {1,2,3};

//run time assignment
 value[0] = 1;
 value[1] = 2;
 value[2] = 3;
4
ответ дан 6 December 2019 в 07:06
поделиться

В C99, используя ] составных литералов , вы можете:

memcpy(values, (int[3]){1, 2, 3}, sizeof(int[3]));

или

int* values = (int[3]){1, 2, 3};
7
ответ дан 6 December 2019 в 07:06
поделиться

Также возможно скрыть memcpy, используя блочную копию структур компилятора. Это делает код некрасивым из-за всех .i и i :, но, возможно, это решает вашу конкретную проблему.

typedef struct {
    int i[3];
} inta;

int main()
{
    inta d = {i:{1, 2, 3}};

    if (1)
        d = (inta){i:{4, 5, 6}};

    printf("%d %d %d\n", d.i[0], d.i[1], d.i[2]);

    return 0;
}
0
ответ дан 6 December 2019 в 07:06
поделиться

Это работает и оптимизируется лучше под gcc с -O3 (компилятор полностью удаляет код), тогда как memcpy заставляет копировать память во всех случаях.

template <typename Array>
struct inner
{
    Array x;
};


template <typename Array>
void assign(Array& lhs, const Array& rhs)
{
    inner<Array>& l( (inner<Array>&)(lhs));
    const inner<Array>& r( (inner<Array>&)(rhs));
    l = r;
}

int main()
{
    int x[100];
    int y[100];

    assign(x, y);
}
-1
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: