Здравствуйте, Ушаков Николай, Вы писали:
УН>Здравствуйте!
УН>Подскажите, как вытащить из фунции строку через указатель типа void*?
УН>Нужно передавать значения разных типов, все вроде получается, только вот УН>со строкой что-то не получается.
ну привёл бы код, в котором не получается, для начала
G>насчет ошибки: G>*(CString*)Val = CString(*pr->pszVal); // Здесь ошибка
G>я думаю нада так, но я не уверен (так как тоже тока учусь): G>*(CString*)Val = *(pr->pszVal);
Здравствуйте, NikUsv, Вы писали:
NU>Здравствуйте, korzhik, Вы писали:
K>>ну привёл бы код, в котором не получается, для начала
NU>Код вот такой
NU>int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val) NU>{ NU> POSITION pos = NULL; NU> pos = Find(listName, propName); NU> CPropStruct* pr = m_propList.GetAt(pos); NU> switch(pr->vt) NU> { NU> case STRNG:
NU> *(CString*)Val = CString(*pr->pszVal); // Здесь ошибка NU> break; NU> case BINARY: NU> *(BOOL*)Val = pr->bVal; NU> break; NU> case INTG: NU> *(int*)Val = pr->iVal; NU> break; NU> case DBLW: NU> *(DWORD*)Val = pr->dwVal; NU> break; NU> } NU> return 0; NU>}
NU>а структура такая
NU>struct CPropStruct NU>{ NU> int propListIndx; NU> int vt; NU> CString szName; NU> union{ NU> CString* pszVal; NU> BOOL bVal; NU> int iVal; NU> DWORD dwVal; NU> void* pvdVal; NU> }; NU>};
Посмотри место где заполняешь структуру и список вполне возможно код выглядит так:
void Initialize()
{
. . .
CPropStruct* pPS=new CPropStruct;
. . .
CString csAnyString="bla bla bla"; //Здесь объект CString создается pPS->pszVal=&csAnyString;
. . .
} // А здесь он уже мертвый, хотя указатель в списте
Здравствуйте, NikUsv, Вы писали:
NU>Здравствуйте, korzhik, Вы писали:
K>>ну привёл бы код, в котором не получается, для начала
NU>Код вот такой
NU>int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val) NU>{ NU> POSITION pos = NULL; NU> pos = Find(listName, propName); NU> CPropStruct* pr = m_propList.GetAt(pos); NU> switch(pr->vt) NU> { NU> case STRNG:
NU> *(CString*)Val = CString(*pr->pszVal); // Здесь ошибка NU> break; NU> case BINARY: NU> *(BOOL*)Val = pr->bVal; NU> break; NU> case INTG: NU> *(int*)Val = pr->iVal; NU> break; NU> case DBLW: NU> *(DWORD*)Val = pr->dwVal; NU> break; NU> } NU> return 0; NU>}
NU>а структура такая
NU>struct CPropStruct NU>{ NU> int propListIndx; NU> int vt; NU> CString szName; NU> union{ NU> CString* pszVal; NU> BOOL bVal; NU> int iVal; NU> DWORD dwVal; NU> void* pvdVal; NU> }; NU>};
Слушай ...
int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val)
..........................
*(CString*)Val = CString(*pr->pszVal); // Здесь ошибка
Val — у тебя указывает на константные данные , естественно , что данные которые расположены по адресу , на который указывает Val не могут быть изменены , что ты и пытаешься сделать ....
Я конечно извиняюсь, но большего ужаса я ещё не видел .
Поехали по пунктам:
1) где гарантия, что пользователь в качестве Val передаст вам указатель на буфер нужной длины?
2) с какой стати вообще пользователь должен ожидать, что вы что-то запишете в Val — это же указатель на константный буфер, а если пользователь вызовет функцию так: GetPropValue("", "", static_cast<void*>("здравствуй #опа — Новый год!"))... и он будет прав, потому что с точки зрения синтаксиса языка нет никаких противоречий против этого;
3) прежде чем снимать константность, перечитай внимательно пункт 2, а если всё таки хочешь это сделать, то делать это надо с помощью const_cast... я однажды встал на граблю, когда один компилятор (толи VC 6.0, толи CodeWarrior 8.0) неправильно обрабатывал снятие константности с помощью преобразования типа в стиле pure C — при оптимизации константная переменная, для которой снималась константность, всё равно заменялась на явную константу, при замене на const_cast всё работало как надо.
А теперь совет, измени сигнатуру метода следующим образом:
GetPropValue(LPCTSTR listName, LPCTSTR propName, VARIANT *Val)
и посмотри, как использовать тип VARIANT, в данном случае это будет самое простое и быстрое решение.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
MN>А теперь совет, измени сигнатуру метода следующим образом: MN>GetPropValue(LPCTSTR listName, LPCTSTR propName, VARIANT *Val) MN>и посмотри, как использовать тип VARIANT, в данном случае это будет самое простое и быстрое решение.
А может проще передавать ссылку?
VARIANT &Val
Если нет, то почему?
Здравствуйте, sc, Вы писали:
MN>>А теперь совет, измени сигнатуру метода следующим образом: MN>>GetPropValue(LPCTSTR listName, LPCTSTR propName, VARIANT *Val) MN>>и посмотри, как использовать тип VARIANT, в данном случае это будет самое простое и быстрое решение.
sc>А может проще передавать ссылку? sc>VARIANT &Val sc>Если нет, то почему?
Это уже дело вкуса... Просто если использовать ссылку, то по записе:
GetPropValue("", "", myVal)
не видно, что myVal может быть изменён...
GetPropValue("", "", &myVal) — так нагляднее...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.