Добавление указателя - PullRequest
       0

Добавление указателя

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

Я не понимаю, почему не удается добавить указатель.

DWORD *pipebuf=new DWORD[10001];

Command *cr= (Command*)pipebuf;
cr->command=2;
DWORD* rooms=(pipebuf+1); //should work fine..sets the room pointer equal to pipe[2]
*rooms=buff3;  //where buff3=100

Тем не менее, значение pipebuf содержит только значение команды, но не содержит значение buff3.Тем не менее, когда я удаляю новое ключевое слово, оно работает нормально ... Почему?

DWORD = unsigned_int

Команда - это класс с переменной DWORD команды .. что-то вроде этого

Class Command {
DWORD command;
}

Ответы [ 3 ]

2 голосов
/ 19 марта 2011

Добавление перемещает указатель вперед на один, заставляя его указывать на второй DWORD в вашем массиве. *(pipebuf+1) точно соответствует pipebuf[1]; после выполнения кода код *pipebuf aka pipebuf[0] aka cr->command равен 2, а *(pipebuf+1) aka *rooms aka pipebuf[1] равен 100.

Обратите внимание, что приведение типов между типами указателей в C ++ часто считается плохим стилем и во многих случаях может привести к нежелательным результатам. Если вы выделяете массив из Command, используйте new Command[...]; если вы хотите DWORD, то не бросайте в Command*.

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

Кроме того, если вам нужно, вы должны либо использовать static_cast (в подобных случаях) или dynamic_cast (в тех случаях, когда типы связаны наследованием; такое использование в целом гораздо безопаснее).

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

Я бы сделал это комментарием, но я не могу выполнить форматирование кода в них.

Я запустил этот код, и вывод «2 100», как и ожидалось:

#include <iostream>

using namespace std;

typedef unsigned int DWORD;
class Command {
  public:
    DWORD command;
};

int main()
{
    DWORD buff3 = 100;
    DWORD *pipebuf = new DWORD[10001];
    Command *cr = (Command*)pipebuf;
    cr->command = 2;
    DWORD *rooms = (pipebuf+1);
    *rooms = buff3;

    std::cout << pipebuf[0] << " " << pipebuf[1] << endl;
}

AFAICT - это самый простой способ, которым вы могли бы расширить свой вопрос до полной программы.

Не могли бы вы попробовать взять это и добавить больше материала из исходного кода, пока не появится проблема?

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

class Command - это пользовательский тип, а DWORD - примитивный тип данных (unsigned int). В таком случае, зачем делать это -

Command *cr= (Command*)pipebuf;

class Command {
    public :     // Added public keyword
    DWORD command;  // DWORD is a typedef for unsigned int as you mentioned.
};  // class definition should end with a semi-colon

Итак, это способ сделать -

Command *cr = new Command[10001] ;
DWORD *pipebuf=new DWORD[10001];

// After assigining values to DWORD pointed locations. Then you can do this -

cr->command = pipebuf[0] ; // this sets the value of cr[0].command.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...