2014-12-12 6 views
0

В этом коде (C++), я пытаюсь переместить указатель, который указывает на одну «строку» 2D-массива, на следующую строку, вице-верку со следующей строкой. поэтому я попробовал этот код:выражение должно быть модифицируемым значением l 2D с массивами 2D

void bubleSort(char mat[][WORDS]) { 
    for (int i = LETTERS; i >= 0; i--) { 
     int position = 0;           //This variable is used to move forward in case of same previous letters 
     for (int j = 1; j < i; j++) { 
      if (mat[j][position] < mat[j - 1][position]) {   //If the words are not sorted according to alphabetic order, 
       mat[j]--;           //swap the poniters of the rows of their letters positions, 
       mat[j - 1]++; 
       position = 0;          //and initilize 'position' for the next words check. 
      } 
      else if (mat[j][position] == mat[j - 1][position]) { //If current position of letter have the same letters, 
       position++;           //jump to next position, 
       j = ((position < LETTERS - 1) ? j - 1 : i);   //and move 'j' back to recheck the words. 
      } 
      else position = 0;          //if thoose words stay in their place, initilize 'position' for next checking 
     } 
    } 
} 

Тогда говорит составитель «выражение должно быть изменяемой именующим» об этих строках:

mat[j]--;           //swap the poniters of the rows of their letters positions, 
mat[j - 1]++; 

Как мне это исправить?

спасибо.

+1

Вы не можете увеличивать массивы, потому что массивы не указатели. – fredoverflow

+0

С 'std :: vector v;' вы можете просто выполнить 'std :: sort (v.begin(), v.end());'. – Jarod42

+0

Кстати, вы можете использовать 'std :: swap (mat [j], mat [j - 1])'. – Jarod42

ответ

1

Синтаксис char array[][N] означает, что вы используете плоский 2D-массив, все данные прокладываются последовательно в одном месте. Вторая строка находится сразу после первого в памяти, и индекс фактически вычисляется как x * N + y (для массива [x] [y]). Поэтому для каждой строки нет указателя. Вам нужно определить массив указателей и заполнить его, если вы хотите напрямую сменить строки вместо их копирования.

Кроме того, приращение «строки», вероятно, никогда не будет таким, каким вы хотите, потому что указатель просто укажет на следующий элемент в той же строке. Вам нужно поменять указатели (вы можете использовать std::swap), чтобы обменять строки.

Смежные вопросы