2015-12-04 2 views
0

У меня есть этот алгоритм, который является псевдокодом для алгоритма dijkstra для теории графов. Первое, что происходит, это базовый цикл.Comma Operator с индексированием 2D-массивов

visitedSet[0] = true //visitedSet is a array of bools 
for (int i = 1; i <= numberNodes; ++i) 
{ 
    distanceArray[i] = adjacencyMatrix[0,i]; 
    //distanceArray is 1D with size of fifty 
    //adjacencyMatrix is 2D with size of fifty 
    //Both arrays hold values of unsigned ints 
} 

Вот массив определений

enum GraphLimit300 {MAX_NODES = 50}; 
unsigned int adjacencyMatrix[MAX_NODES][MAX_NODES]; 
unsigned int distanceArray[MAX_NODES]; 

Visual Studio дает мне массив, говоря, что я не могу присвоить массив беззнаковых целых чисел в указатель. Я посмотрел онлайн, что с помощью оператора запятой в основном в этом случае выбрасывает первый случай, 0 и обрабатывает его как distanceArray[i] = adjacencyMatrix[i]; Что не имеет для меня смысла, так как adjacenyMatrix - это 2D-массив. Мне просто интересно, что дает мне эту ошибку компиляции и получает больше информации о том, почему, потому что я в основном просто копирую в именах переменных, где в основном говорит псевдокод.

псевдокоде:

S = { 1 } 
for (index = 2; index <= N; ++ index) 
    D[ index ] = C[ 1, index ] 
for (index = 1; index <= N – 1; ++ index) 
    Choose a vertex v in V – S such that D[ v ] is a minimum 
    Add v to S 
    for each vertex w in V – S do 
     D[ w ] = min(D[ w ], D[ v ] + C[ v, w ]) 

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

+0

Вы не показываете нам объявления 'distanceArray' и' adjacencyMatrix', что делает ваш вопрос неопровержимым. –

+0

Я бросил комментарии в первом блоке кода, буквально говоря, как они объявлены. Теперь я поставлю это в отдельный блок кода. @CareyGregory – DrakeJacks

+0

'[0, i]' <- Я не знаю, почему вы делаете это вообще. Он не служит никакой цели и выглядит так, будто вы просто сделали опечатку, когда вы хотели набрать '[0] [i]'. –

ответ

3

Вы должны просмотреть, как получить доступ к элементам 2D-массива. Кроме того, посмотрите, что делает comma operator. Вы должны использовать [] дважды:

adjacencyMatrix[0][i] 

Следующая:

adjacencyMatrix[0, i] 

эквивалентно:

adjacencyMatrix[i] 

Который будет по-прежнему оставит вас с 1D массив. И, как говорится в сообщении об ошибке:

distanceArray[i] = adjacencyMatrix[i]; 
// ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ 
// unsigned int array of unsigned ints 

Вы не можете ожидать, что это задание произойдет.

+0

И просто избавьтесь от оператора запятой. Он не служит цели, кроме как запутывать код. –

+0

Как я уже сказал, я уже знал, что делает оператор запятой, который в этом выражении 'distanceArray [i]' будет назначен указатель. Который дает мне ошибку компиляции. – DrakeJacks

+0

@DrakeJacks Конечно, это потому, что вы пытаетесь назначить массив (указатель) на 'distanceArray [i]', что просто «unsigned int.' –