Больше ошибок LValue - PullRequest
       31

Больше ошибок LValue

0 голосов
/ 24 марта 2011

Ниже приведена схема тройного вложенного индексирования. Мой указатель на массив указателей разыменовывается в закомментированной строке ... теоретически это должно дать мне указатель. Я вычитаю один из него, а затем ссылаюсь на него и переназначаю его моему указателю на массив указателей. Но эта строка выдает ошибку lvalue для операнда "&".

Позвольте мне быть совершенно ясно. Я хочу знать, почему здесь происходит ошибка И получить метод, который работает для назначения адреса предыдущего элемента в массиве указателей для моего двойного указателя кадра.

Я принимаю только полные решения, которые удовлетворяют обоим критериям ....

#include <iostream>

typedef struct frame_s {
  double ** TestArrayPointer;
} frame_t;

main () {

  double * TestArray;
  double ** TestPointerArray;
  TestArray = new double [100];

  TestPointerArray = new double * [100];

  for (unsigned int Counter = 0; Counter<100; Counter++)
  {
     TestArray[Counter]=Counter;
     TestPointerArray[Counter]=&(TestArray[Counter]);
  }

  frame_t Frames[10];
  for (unsigned int Counter = 0; Counter<10; Counter++)
    Frames[Counter].TestArrayPointer = &(TestPointerArray[Counter*10]);

  //Move pointer to point at array position one back.
  Frames[2].TestArrayPointer=
      &(*(Frames[2].TestArrayPointer)-1); //error! here <--

  //OUTPUT Values...
  for (unsigned int Counter = 0; Counter<100; Counter++)
    std::cout << "P: " << TestPointerArray[Counter] << " V: " 
          << *(TestPointerArray[Counter]) << std::endl;

}

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Вы получаете ошибку, потому что -1 применяется после *. Вы не можете взять адрес результата оператора вычитания - например, rvalue , а не lvalue (lvalue обозначает реальный объект - rvalue является просто эфемерным значение).

Изначально Frames[2].TestArrayPointer указывает на третий double * в массиве, на который указывает TestPointerArray. Предположительно, вы хотите изменить его так, чтобы он указывал на второй double * в этом массиве. Если это так, вы можете просто изменить эту строку на:

Frames[2].TestArrayPointer = Frames[2].TestArrayPointer - 1;
1 голос
/ 24 марта 2011
Frames[2].TestArrayPointer=
  &(*(Frames[2].TestArrayPointer)-1);

Здесь как разыменование, так и возврат адреса не нужны. Вы можете напрямую сделать -

Frames[2].TestArrayPointer = (Frames[2].TestArrayPointer)-1) ;

Но у этого есть потенциальные проблемы.

  • Что если индекс равен 0? Ошибка выполнения.
  • Что если индекс является последним индексом? Утечка памяти.
0 голосов
/ 24 марта 2011

Frames[2].TestArrayPointer имеет тип double**

*(Frames[2].TestArrayPointer) имеет тип double*

Итак, *(Frames[2].TestArrayPointer) - 1 - это временный тип double*. Временное значение - это значение, вы не можете взять его адрес.

Я думаю, что вы хотите:

&(*((Frames[2].TestArrayPointer)-1))

, который также является double*, но он предшествует Frames[2].TestArrayPointer, а не временному.

И если мы избавимся от «отменяющих» операторов и лишних паренов:

Frames[2].TestArrayPointer - 1
...