Сохранение значения массива в двойную переменную - PullRequest
0 голосов
/ 23 февраля 2009

Приветствую всех. Возникла проблема при компиляции моего скрипта, содержащего следующую функцию. Возникают три ошибки, все в одной строке, где я устанавливаю расстояние + = к расстояниям [] []:

ошибка C2108: индекс не является целочисленным ошибка C2108: индекс не является целочисленным ошибка C2297: '+ =': недопустимый, правый операнд имеет тип 'double (*) [15]'

Помощь будет очень ценной.

double S_initial;

double distances [15][15]; 
double order [15];
void Initialize() 
{
    double x, y ,z;

    double distance = 0;

    for (int i = 0; i <= 14; i++)
    {
        x =  order [i];
        y =  order [i + 1];

        distance += distances [x][y];
    }

    S_initial = distance;
}

Ответы [ 4 ]

3 голосов
/ 23 февраля 2009

Ну, индексы массива x и y не имеют целочисленный тип, такой как int, а имеют тип double:

double x, y, z;
...
distance += distances[x][y];

И что-то вроде 1.46534-го элемента массива не имеет смысла, поэтому компилятор жалуется.

2 голосов
/ 23 февраля 2009

x и y не являются целыми числами ... Вы должны передавать целые числа как индексы массива.

1 голос
/ 23 февраля 2009

Прекратите использовать double и используйте вместо него int.

Или, если вам нужно использовать double в массиве order, вам нужно решить, как округлить любое нецелое значение, которое может быть найдено, до целого. Math.Floor, Math.Ceiling и т. Д.

0 голосов
/ 23 февраля 2009

Вы не можете использовать числа с плавающей запятой для индексации массивов. Используйте int или даже лучше size_t.

 for (int i = 0; i <= 14; i++)
{
    x =  order [i];
    y =  order [i + 1]; /* when i = 14, you invoke UB */

    distance += distances [x][y];
}

На второй части:

double order [15];

неинициализирован и, следовательно, вызывает UB, когда используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...