2013-12-03 5 views
0

Я новичок в C++, и мне нужно создать функцию с этой структурой:Передача LPDWORD как из параметра

BOOL myfunc(LPDWORD myLpdword){ // myLpdword must be an out parameter 

    DWORD myDword = 1; 
    myLpdword = &myDword; 
    return true; 

} 

int main(){ 

    DWORD outDword = 20; 
    myfunc(&outDword); 
    cout << outDword << end1; 
    return 0; 
} 

я ожидал, что значение outDword будет 1 (изменен MyFunc), но myfunc не изменяет значение.
Пожалуйста, вы можете дать мне подсказку, чтобы решить эту проблему?

+4

Это основы, которые преподаются в каждой книге (хотя это скорее больше C, чем C++). Я настоятельно рекомендую по крайней мере изучить основы C++, прежде чем делать Windows API stu сл. – chris

+1

Вы делаете несовершенную попытку вернуть адрес локальной переменной. Это неопределенное поведение, переменная больше не существует после возвращения функции. Не делай этого. –

ответ

2

Как это

BOOL myfunc(LPDWORD myLpdword){ // myLpdword must be an out parameter 
    *myLpdword = 1; 
    return true; 

} 

Out parameter это не то, что означает что-нибудь в C++. MS использует его, но только потому, что использует последовательную терминологию на разных языках.

В терминах на С ++ то, что вы сделали, это передать указатель переменной, которую вы хотите изменить, до myfunc. Что делает вышеприведенный код, это взять указатель и dereference с оператором *, чтобы изменить переменную, которую вы хотели изменить.

Мне нравится, что вы пишете небольшие тестовые программы, чтобы проверить свое понимание C++. Но, как говорили другие, нет реальной замены достойной книги. Любая книга на C++ собирается охватить это.

0

Вы прошли указатель на outDword.

myLpdword теперь является указателем на outDword.

Затем вы изменили myLpdword как указатель на myDword.

Вы ничего не делали с VALUE ofDword.

0

В C++ это называется pass-by-reference. Вы обозначите его амперсанд в сигнатуре функции:

bool myfunc(DWORD &myDword) {… 

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

+2

Одно небольшое изменение: 'LPDWORD' должно быть' DWORD'. 'LP' (в настоящее время) означает указатель. – chris

+0

@chris Исправлено, спасибо. – thesquaregroot

0

Вы назначены указатель на переменную, которая не будет существовать после выхода из тела функции (читать дальше областей в C/C++.

Чтобы решить проблему, присвоить значение переменной разыменованного указателя, как поэтому: *myLpdword = myDword;. Было бы также разумно проверить, что значение указателя не равно null перед разыменованием его следующим образом: if (myLpdword == 0) { return; }. Эта проверка не гарантирует, что указатель безопасен для назначения, но Atleast защищает вас от нулевого указателя

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