проблема в передаче параметров в c ++ (указатели смутили меня) - PullRequest
1 голос
/ 06 января 2010

Я написал процедуру, которая будет хранить некоторые данные внутри структуры, и я передам структуру другой процедуре, как показано ниже

slotUpdate(Datas);

тогда как я определил структуру как:

someNameSpace::stuData Datas;

после повторной передачи структуры в slotUpdate я передам ее другой процедуре, но на этот раз в качестве параметра и в виде (void *), как показано ниже:

updateDB(void * parameter){
anotherNameSpace::someFucntion((stuData *) parameter);
}

примечание: я передаю данные в updateDb, например: updateDB (& Datas);

и в someFunction, когда я пытаюсь получить данные из этой структуры, я не успешен, и я получу неправильные данные, что-то вроде мусора: -?

В чем моя проблема?

Ответы [ 3 ]

5 голосов
/ 06 января 2010

При вызове slotUpdate вы передаете «Данные», а не «& Данные». Вы не дали нам объявление slotUpdate, но оно может быть объявлено одним из двух способов:

void slotUpdate(stuData& Data);
void slotUpdate(stuData Data);

Если функция определена первым способом, то я не понимаю. Второй способ, однако, - это передача по значению semantic: - slotUpdate будет записывать в локальную копию структуры Data, эта переданная в struct не будет обновлена ​​и, следовательно, будет содержать тот же мусор, с которого она началась когда slotUpdate возвращается. Который вы потом передадите другим функциям.

Измените ваше определение slotUpdate на одно из следующих: -

void slotUpdate(stuData* pData);
void slotUpdate(stuData& Data);

Я предпочитаю первую форму, потому что она явно указывает, что вы передаете указатель на структуру, которую вы хотите изменить. 2-я форма затрудняет понимание - как видно из вашего поста - используется ли семантика передачи по значению или передачи по ссылке.

1 голос
/ 06 января 2010

Возможно ли, что у вас есть два разных StudData в обоих пространствах имен, и вы используете неправильный, когда используете его?

Еще один момент, только для улучшения: в C ++ не рекомендуется использовать приведения в стиле C (например, (data *)), лучше использовать static_cast / dynamic_cast и т. Д., Где это уместно Таким образом, вы можете использовать static_cast () в вашем примере.

Кроме того, приведение к void * и backward было приемлемо в C, поскольку именно это позволило абстрактное / универсальное программирование, но в C ++ есть другие, более совершенные механизмы для этого.

1 голос
/ 06 января 2010

Я не могу сказать из того, что вы написали, что происходит и в каком порядке. Происходит ли сбой внутри someFucntion ()?

Предполагается, что структура заполняется slotUpdate (), и если да, вы определили slotUpdate () для приема ссылочного параметра (например, void slotUpdate(someNameSpace::stuData &Datas);?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...