Вот тот, который наверняка будет забавным для кого-то.Итак, у меня есть массив объектов (в моем тестовом / демонстрационном коде я просто делаю их удвоенными для простоты), а затем я создаю массив указателей на эти объекты.
Причина, по которой я это делаю, заключается в том, что я собираюсь поменять объекты, а поменять сами объекты - это дорого, а поменять их указатели (во вторичном массиве) - дешево.
У меня есть несколько субиндексов в типе данных моего ящика.По сути, моя цель состоит в том, чтобы иметь возможность поддерживать непрерывные участки указателей на объекты, которыми «владеет» ящик.Для этого, когда я перехожу из одного блока в другой, мне нужно выполнить несколько перестановок в массиве мастер-указателей.Я делаю это, используя субиндекс внутри моей структуры блока, и именно там происходит ошибка ... см. Закомментированную строку для ошибки.
#include <iostream>
typedef struct box_s {
double * TestArrayPointer;
} box_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]);
}
for (unsigned int Counter = 0; Counter<100; Counter++)
std::cout << "P: " << TestPointerArray[Counter] << " V: "
<< *(TestPointerArray[Counter]) << std::endl;
box_t Boxes[10];
for (unsigned int Counter = 0; Counter<10; Counter++)
Boxes[Counter].TestArrayPointer = TestPointerArray[Counter*10];
for (unsigned int Counter = 0; Counter<10; Counter++)
std::cout << "P: " << Boxes[Counter].TestArrayPointer << " V: "
<< *(Boxes[Counter].TestArrayPointer)
<< " P+1: " << (Boxes[Counter].TestArrayPointer)+1 << " V+1: "
<< *((Boxes[Counter].TestArrayPointer)+1)
<< " P: " << Boxes[Counter].TestArrayPointer <<std::endl;
for (unsigned int Counter = 0; Counter<10; Counter++)
std::cout << "P: " << &(Boxes[0].TestArrayPointer[Counter]) << " V: "
<< Boxes[0].TestArrayPointer[Counter] << std::endl;
unsigned int ExitBox = 1;
unsigned int EntranceBox=9;
unsigned int OldIndex = 12;
double * TempPtr = TestPointerArray[OldIndex];
if (ExitBox < EntranceBox)
{
//Swap final element of this box into old position
TestPointerArray[OldIndex] = Boxes[ExitBox+1].TestArrayPointer-1;
//Keep swapping start for end
for(unsigned int BoxNum = ExitBox+1; BoxNum<EntranceBox &&
BoxNum+1<=9;BoxNum++)
{
//Fill in new first with last element of old array.
(Boxes[BoxNum-1].TestArrayPointer-1)=
Boxes[BoxNum+1].TestArrayPointer-1; //darn l-value error!
//Change array head pointer to match.
Boxes[BoxNum].TestArrayPointer=Boxes[BoxNum-1].TestArrayPointer-1;
}
Boxes[EntranceBox].TestArrayPointer = TempPtr;
}
for (unsigned int Counter = 0; Counter<100; Counter++)
std::cout << "P: " << TestPointerArray[Counter] << " V: "
<< *(TestPointerArray[Counter]) << std::endl;
}
Я думаю, что это из-за "-1", ноЯ не уверен, почему это не правильно, когда я делаю подобные вещи с "+1" в циклах выше.
PS Это НАСТОЯЩИЙ тестовый код.Я компилирую с
g ++ main.cpp
.Я не обращал пристального внимания на комментарии и оболочку, просто пытался придерживаться предложенной схемы оболочки MSDN, так что не судите ... это всего лишь быстрый и грязный тест !!
РЕДАКТИРОВАТЬ 1
Вот рабочий код для тех, кто заботится ... PMG Я изменил это на c++
, учитывая использование new
.И Хит, я отдаю вам должное, хотя ваш ответ не решил основную проблему.
Вот решение real :
#include <iostream>
typedef struct box_s {
double ** TestArrayPointer;
unsigned int NumberPoints;
} box_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]);
}
for (unsigned int Counter = 0; Counter<100; Counter++)
std::cout << "P: " << TestPointerArray[Counter] << " V: "
<< *(TestPointerArray[Counter]) << std::endl;
box_t Boxes[10];
for (unsigned int Counter = 0; Counter<10; Counter++)
{
Boxes[Counter].TestArrayPointer = TestPointerArray+Counter*10;
Boxes[Counter].NumberPoints=10;
}
for (unsigned int Counter = 0; Counter<10; Counter++)
std::cout << "P: " << Boxes[Counter].TestArrayPointer << " V: "
<< *(Boxes[Counter].TestArrayPointer)
<< " P+1: " << (Boxes[Counter].TestArrayPointer)+1 << " V+1: "
<< *((Boxes[Counter].TestArrayPointer)+1)
<< " P: " << Boxes[Counter].TestArrayPointer <<std::endl;
for (unsigned int Counter = 0; Counter<10; Counter++)
std::cout << "P: " << &(Boxes[0].TestArrayPointer[Counter]) << " V: "
<< Boxes[0].TestArrayPointer[Counter] << std::endl;
unsigned int ExitBox = 1;
unsigned int EntranceBox=9;
unsigned int OldIndex = 12;
double * TempPtr = TestPointerArray[OldIndex];
if (ExitBox < EntranceBox)
{
Boxes[ExitBox].NumberPoints--;
Boxes[EntranceBox].NumberPoints++;
//Swap final element of this box into old position
TestPointerArray[OldIndex] = *(Boxes[ExitBox+1].TestArrayPointer-1);
//Keep swapping start for end
for(unsigned int BoxNum = ExitBox+1; BoxNum<EntranceBox &&
BoxNum+1<=9;BoxNum++)
{
Boxes[BoxNum].TestArrayPointer=
Boxes[BoxNum].TestArrayPointer-1;
//Fill in new first with last element of old array.
*(Boxes[BoxNum].TestArrayPointer)=
*(Boxes[BoxNum+1].TestArrayPointer)-1;
std::cout <<"---------------------" << std::endl;
for (unsigned int Counter = 0; Counter<100; Counter++)
std::cout << "P: " << TestPointerArray[Counter] << " V: "
<< *(TestPointerArray[Counter]) << std::endl;
}
Boxes[EntranceBox].TestArrayPointer=
Boxes[EntranceBox].TestArrayPointer-1;
*(Boxes[EntranceBox].TestArrayPointer) = TempPtr;
}
for(unsigned int BoxNum = 0; BoxNum<=9;BoxNum++)
{
std::cout <<"---------------------" << std::endl;
for(unsigned int Counter = 0; Counter<Boxes[BoxNum].NumberPoints;
Counter++)
std::cout << "P: " <<Boxes[BoxNum].TestArrayPointer[Counter]
<< " V: "
<< *(Boxes[BoxNum].TestArrayPointer[Counter])
<< std::endl;
}
}
Обратите внимание на правильную замену !!