2013-12-05 3 views
0

У меня есть 8-членный массив, который должен быть определен условно. т.е. для каждого условия значения элементов массива будут разными.инициализация массива - условно

Однако для каждого условия я бы не стал определять элементы один за другим. Есть ли способ, где я могу определить все элементы массива вместе, как это:

double c[8]; 
if (a == p){ 
    c[]={values} ; 
} else if (a == q) { 
     c[]={values} ; 
} else if (..){ 
     ...... 
} 

вместо

double c[8]; 
if (a == p){ 
    c[0]= .. ; 
    c[1]= .. ; 
    ... 
    c[7] = ..; 
} else if (a == q) { 
    c[0]= .. ; 
    c[1]= .. ; 
    ... 
    c[7] = ..; 
} else if (...) { 
    .... 
} 

PS: Есть 7, если условия.

+1

Возможно, зная, 'values' бы помочь в решении этой. – Novak

+0

- значения двойной точности, изменяющиеся от 1 до -1. например, {0.458401,0.0,0.0206768, -0.0118135,0.115635, -0.0842532, -0.00355449,0.0412016} для одного из случаев. –

+0

В этом случае предопределенные массивы значений - моя рекомендация. – Novak

ответ

2

Предполагая, что значения в каждой ветви условия не меняются:

Несколько значений массивов значений [NumConditions] [8] и делает с указателем. Тогда:

switch(a) { 
    case First: c = values[0]; break; 
    case ... 
} 
1

Если values определены во время компиляции, вы можете использовать, например, std::copy.

std::copy(std::begin(values), std::end(values), std::begin(c)); 
0

Гораздо чище подход .use Переключитесь случай, чтобы избежать ненужных сравнений

switch(a) 
{ 
case p: 
     c[]={value1,valu2,...} ; 

} 

Это просто демонстрация, как использовать:

INT основной() {

int choice = 1; 

    switch(choice) 
    { 
     case 1: double c[8] = {0.123,32.33,33.02,66.44,0.11,45.08,44.9,0.0412}; 
     break;  
    } 

    return 0; 

}

+0

Это не работает.Дает предупреждения: расширенные списки инициализатора доступны только с -std = C++ 0x или -std = Gnu ++ 0x [по умолчанию включено] ошибки: назначение на массив из списка инициализаторов –

+0

Int основных() { int choice = 1; переключатель (выбор) { case 1: double c [8] = {0.123,32.33,33.02,66.44,0.11,45.08,44.9,0.0412}; break; } возвращение 0; } –

+0

@BirajBorah Я думаю, что вы можете получить эту ошибку, если вы определяете массив отдельно для его инициализации. т. е. у вас есть 'double c [8];' самостоятельно. В этом случае вам нужно будет использовать закругленные скобки, а не фигурные скобки, чтобы инициализировать массив: 'c [8] = (0.123,32.33,33.02,66.44,0.11,45.08,44.9,0.0412);'. –

1

Подготовьте 7 массивов (или просто двухмерных), которые будут инициализированы во время компиляции. Затем объявите указатель c. Затем используйте switch для выбора нужного массива (то есть c = valuesList[2]). Если вам нужно написать на этом массиве, скопируйте его содержимое за пределами switch.

0

Если все инициализаторы для данного условия одинаковы, вы можете использовать класс std :: array вместо массива. Например

std::array<double, 8> c; 

if (a == p){ 
    c.fill(0); 
} else if (a == q) { 
     c.fill(1) ; 
} else if (..){ 
     ...... 
} 
+0

Все инициализаторы различны. –

0

IMHO создать восемь функций, которые вы можете дать осмысленные имена, которые говорят на следующий программист (или самостоятельно в течение одного года), что различные восемь конфигураций означают.

Я признаю, что это немного многословный, но что более важно, это делает код более понятным

if (a == p) 
{ 
    setConfigValuesForProducingPannkakes(c); 
} 
else if (a == q) 
{ 
    setConfigValuesForProducingWaffles(c); 
} 
... 
+0

Я делаю это в коде. Но когда я пытаюсь опубликовать некоторые вопросы, я пытаюсь выразить это в общих чертах. –

0
std::array<double, 8> c; 
if (a == p) { 
    c = {values}; 
} else if (a == q) { 
    c = {values}; 
} else if (...) { 
    ... 
} 
Смежные вопросы