как устранить: [Предупреждение] преобразование в `int’ из `double’

#c #arrays #warnings #structure

#c #массивы #предупреждения #структура

Вопрос:

У меня есть следующий код со структурным массивом с данными для выполнения некоторых вычислений. Когда я компилирую код, я получаю сообщение [Warning] converting to 'int' from 'double' . Я хотел бы исправить эту проблему с помощью кода, но я не уверен, в чем проблема. Я не уверен, что это предупреждение слишком серьезное, но я думаю, что это преобразование также может вызвать некоторые расхождения в моих расчетах.

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{ 

int i,aplha[90],beta[90];
double gamma[90],delta[90],epsilon[90],zeta[90];

  struct wmm
       {
        int   alpha;
        int   beta;
        double gamma;
        double delta;
        double epsilon;
        double zeta;
       }book[]={
  {1, 0, -29496.6,        0.0,      11.6,       0.0},
  {1, 1,  -1586.3,     4944.4,      16.5,     -25.9},
  {2, 0,  -2396.6,        0.0,     -12.1,       0.0},
  {2, 1,   3026.1,    -2707.7,      -4.4,     -22.5},
  {2, 2,   1668.6,     -576.1,       1.9,     -11.8},
  {3, 0,   1340.1,        0.0,       0.4,       0.0},
  {3, 1,  -2326.2,     -160.2,      -4.1,       7.3},
  {3, 2,   1231.9,      251.9,      -2.9,      -3.9},
  {3, 3,    634.0,     -536.6,      -7.7,      -2.6},
  {4, 0,    912.6,        0.0,      -1.8,       0.0},
  {4, 1,    808.9,      286.4,       2.3,       1.1},
  {4, 2,    166.7,     -211.2,      -8.7,       2.7},
  {4, 3,   -357.1,      164.3,       4.6,       3.9},
  {4, 4,     89.4,     -309.1,      -2.1,      -0.8},
  {5, 0,   -230.9,        0.0,      -1.0,       0.0},
  {5, 1,    357.2,       44.6,       0.6,       0.4},
  {5, 2,    200.3,      188.9,      -1.8,       1.8},
  {5, 3,   -141.1,     -118.2,      -1.0,       1.2},
  {5, 4,   -163.0,        0.0,       0.9,       4.0},
  {5, 5,     -7.8,      100.9,       1.0,      -0.6},
  {6, 0,     72.8,        0.0,      -0.2,       0.0},
  {6, 1,     68.6,      -20.8,      -0.2,      -0.2},
  {6, 2,     76.0,       44.1,      -0.1,      -2.1},
  {6, 3,   -141.4,      61.5 ,       2.0,      -0.4},
  {6, 4,    -22.8,      -66.3,      -1.7,      -0.6},
  {6, 5,     13.2,        3.1,      -0.3,       0.5},
  {6, 6,    -77.9,       55.0,       1.7,       0.9},
  {7,  0,    80.5,       0.0,        0.1,        0.0},
  {7,  1,   -75.1,     -57.9,       -0.1,        0.7},
  {7,  2     -4.7,     -21.1,       -0.6,        0.3},
  {7,  3,    45.3,       6.5,        1.3,       -0.1},
  {7,  4,    13.9,      24.9,        0.4,       -0.1},
  {7,  5,    10.4,       7.0,        0.3,       -0.8},
  {7,  6,     1.7,     -27.7,       -0.7,       -0.3},
  {7,  7,     4.9,      -3.3,        0.6,        0.3},
  {8,  0,    24.4,       0.0,       -0.1,        0.0},
  {8,  1,     8.1,      11.0,        0.1,       -0.1},
  {8,  2,   -14.5,     -20.0,       -0.6,        0.2},
  {8,  3,    -5.6,      11.9,        0.2,        0.4},
  {8,  4,   -19.3,     -17.4,       -0.2,        0.4},
  {8,  5,    11.5,      16.7,        0.3,        0.1},
  {8,  6,    10.9,       7.0,        0.3,       -0.1},
  {8,  7,   -14.1,     -10.8,       -0.6,        0.4},
  {8,  8,    -3.7,       1.7,        0.2,        0.3},
  {9,  0,     5.4,       0.0,        0.0,        0.0},
  {9,  1,     9.4,     -20.5,       -0.1,        0.0},
  {9,  2,     3.4,      11.5,        0.0,       -0.2},
  {9,  3,    -5.2,      12.8,        0.3,        0.0},
  {9,  4,     3.1,      -7.2,       -0.4,       -0.1},
  {9,  5,   -12.4,      -7.4,       -0.3,        0.1},
  {9,  6,    -0.7,       8.0,        0.1,        0.0},
  {9,  7,     8.4,       2.1,       -0.1,       -0.2},
  {9,  8,    -8.5,      -6.1,       -0.4,        0.3},
  {9,  9,   -10.1,       7.0,       -0.2,        0.2},
 {10,  0,    -2.0,       0.0,        0.0,        0.0},
 {10,  1,    -6.3,       2.8,        0.0,        0.1},
 {10,  2,     0.9,      -0.1,       -0.1,       -0.1},
 {10,  3,    -1.1,       4.7,        0.2,        0.0},
 {10,  4,    -0.2,       4.4,        0.0,       -0.1},
 {10,  5,     2.5,      -7.2,       -0.1,       -0.1},
 {10,  6,    -0.3,      -1.0,       -0.2,        0.0},
 {10,  7,     2.2,      -3.9,        0.0,       -0.1},
 {10,  8,     3.1,      -2.0,       -0.1,       -0.2},
 {10,  9,    -1.0,      -2.0,       -0.2,        0.0},
 {10, 10,    -2.8,      -8.3,       -0.2,       -0.1},
 {11,  0,     3.0,       0.0,        0.0,        0.0},
 {11,  1,    -1.5,       0.2,        0.0,        0.0},
 {11,  2,    -2.1,       1.7,        0.0,        0.1},
 {11,  3,     1.7,      -0.6,        0.1,        0.0},
 {11,  4,    -0.5,      -1.8,        0.0,        0.1},
 {11,  5,     0.5,       0.9,        0.0,        0.0},
 {11,  6,    -0.8,      -0.4,        0.0,        0.1},
 {11,  7,     0.4,      -2.5,        0.0,        0.0},
 {11,  8,     1.8,      -1.3,        0.0,       -0.1},
 {11,  9,     0.1,      -2.1,        0.0,       -0.1},
 {11, 10,     0.7,      -1.9,       -0.1,        0.0},
 {11, 11,     3.8,      -1.8,        0.0,       -0.1},
 {12,  0,    -2.2,       0.0,        0.0,        0.0},
 {12,  1,    -0.2,      -0.9,        0.0,        0.0},
 {12,  2,     0.3,       0.3,        0.1,        0.0},
 {12,  3,     1.0,       2.1,        0.1,        0.0},
 {12,  4,    -0.6,      -2.5,       -0.1,        0.0},
 {12,  5,     0.9,       0.5,        0.0,        0.0},
 {12,  6,    -0.1,       0.6,        0.0,        0.1},
 {12,  7,     0.5,       0.0,        0.0,        0.0},
 {12,  8,    -0.4,       0.1,        0.0,        0.0},
 {12,  9,    -0.4,       0.3,        0.0,        0.0},
 {12, 10,     0.2,      -0.9,        0.0,        0.0},
 {12, 11,    -0.8,      -0.2,       -0.1,        0.0},
 {12, 12,     0.0,       0.9,        0.1,        0.0}};


}
  

Комментарии:

1. Используя gcc, я не могу выдать предупреждение, о котором вы сообщаете. Если я добавлю options -Wall -Wextra, я увижу только предупреждения о неиспользуемых переменных и «предупреждение: отсутствует инициализатор для элемента main()::wmm:: zeta».

2. Не удается воспроизвести это предупреждение (GCC 4.3.4, -Wall -Wextra ).

3. Я собираюсь предложить, чтобы то, что вы хотите сделать, это идентифицировать и понять предупреждение, а не подавлять его, если вы считаете, что это потенциально влияет на ваши вычисления.

4. @DevSolar: вау, я получаю ошибку с GCC 4.6 (mingw-w64, -std=c 0x -pedantic -Wextra -Wall -Wconversion -Weffc -Wmissing-include-dirs -Wstrict-aliasing ): narrowing conversion of '-2.70000000000000017763568394002504646778106689453e 0' from 'double' to 'int' inside { } [-fpermissive] Что странно, потому что нет -2.7 . Хммм…

5. @Greg это то, что я хотел бы сделать, однако я нигде не могу найти, что я перепутал свои целые числа и дубли

Ответ №1:

 {7,  2    -4.7,     -21.1,       -0.6,        0.3},
  

вместо

 {7,  2,    -4.7,     -21.1,       -0.6,        0.3},
  

(отсутствует кома) Строка 50.

Комментарии:

1. Не приведет ли это также к сбою присваивания?

2. Вот и все. Теперь возникает следующий вопрос — почему GCC не улавливает это?

3. @DevSolar, gcc предупредил меня об отсутствующем инициализаторе в этой строке с помощью -Wall -Wextra и о преобразовании из double в int с помощью -Wconversion.

4. @greg, правила C допускают пропуск инициализаторов, которые заполняются нулями.

5. @AProgrammer: Вы правы, конечно. Я просто искал предупреждение о преобразовании (которое я не видел, потому что я не устанавливал -Wconversion ).