Получить строку через void*
От: Ушаков Николай Россия  
Дата: 13.10.04 11:58
Оценка:
Здравствуйте!

Подскажите, как вытащить из фунции строку через указатель типа void*?

Нужно передавать значения разных типов, все вроде получается, только вот
со строкой что-то не получается.
Re: Получить строку через void*
От: korzhik Россия  
Дата: 13.10.04 12:00
Оценка:
Здравствуйте, Ушаков Николай, Вы писали:

УН>Здравствуйте!


УН>Подскажите, как вытащить из фунции строку через указатель типа void*?


УН>Нужно передавать значения разных типов, все вроде получается, только вот

УН>со строкой что-то не получается.

ну привёл бы код, в котором не получается, для начала
Re[2]: Получить строку через void*
От: NikUsv Россия  
Дата: 13.10.04 12:07
Оценка: :)
Здравствуйте, korzhik, Вы писали:

K>ну привёл бы код, в котором не получается, для начала


Код вот такой
int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val)
{
    POSITION pos = NULL;
    pos = Find(listName, propName);
    CPropStruct* pr = m_propList.GetAt(pos);
    switch(pr->vt)
    {
        case STRNG:

            *(CString*)Val = CString(*pr->pszVal); // Здесь ошибка
            break;
        case BINARY:
            *(BOOL*)Val = pr->bVal;
            break;
        case INTG:
            *(int*)Val = pr->iVal;
            break;
        case DBLW:
            *(DWORD*)Val = pr->dwVal;
            break;
    }
    return 0;
}

а структура такая
struct CPropStruct
{
    int propListIndx;
    int vt;
    CString szName;
    union{
        CString*    pszVal;
        BOOL        bVal;
        int        iVal;
        DWORD        dwVal;
        void*           pvdVal;
    };
};

Исправлено форматирование. -- ПК
Re[3]: Получить строку через void*
От: Вадим Никулин Россия Здесь
Дата: 13.10.04 13:05
Оценка:
Здравствуйте, NikUsv, Вы писали:

NU>Здравствуйте, korzhik, Вы писали:


K>>ну привёл бы код, в котором не получается, для начала


NU>Код вот такой


NU>int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val)
NU>{
NU>            *(CString*)Val = CString(*pr->pszVal); // Здесь ошибка


ok, теперь напиши, как вызываешь
Re[3]: Получить строку через void*
От: greenya Украина  
Дата: 13.10.04 13:10
Оценка:
насчет ошибки:
*(CString*)Val = CString(*pr->pszVal); // Здесь ошибка

я думаю нада так, но я не уверен (так как тоже тока учусь):
*(CString*)Val = *(pr->pszVal);

причем, вызывающий должен зделать так:
CString *p = new CString;
GetPropValue(параметр_1,параметр_2,(void*)p);
delete p;

или так:
CString p;
GetPropValue(параметр_1,параметр_2,(void*)&p);

----------------
и еще. у вас так:
POSITION pos = NULL;
pos = Find(listName, propName);
CPropStruct* pr = m_propList.GetAt(pos);

у меня вопрос, а почему не так ?:
POSITION pos = Find(listName, propName);
CPropStruct* pr = m_propList.GetAt(pos);

или так:
CPropStruct* pr = m_propList.GetAt(Find(listName, propName));

вы всеравно не проверяете что возвращает Find(), а сразу его передаете в CPropStruct::GetAt().
Re[4]: Получить строку через void*
От: NikUsv Россия  
Дата: 13.10.04 13:56
Оценка:
Здравствуйте, greenya, Вы писали:


G>насчет ошибки:

G>*(CString*)Val = CString(*pr->pszVal); // Здесь ошибка

G>я думаю нада так, но я не уверен (так как тоже тока учусь):

G>*(CString*)Val = *(pr->pszVal);

Точно
Re[3]: Обработчик падения программы
От: BacCM Россия  
Дата: 13.10.04 14:17
Оценка:
Здравствуйте, 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;
. . .
} // А здесь он уже мертвый, хотя указатель в списте
Re[3]: Получить строку через void*
От: ScorpZ Украина  
Дата: 13.10.04 16:02
Оценка:
Здравствуйте, 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 не могут быть изменены , что ты и пытаешься сделать ....
Re[3]: Получить строку через void*
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 14.10.04 07:27
Оценка:
Здравствуйте, NikUsv, Вы писали:

NU>Здравствуйте, korzhik, Вы писали:


K>>ну привёл бы код, в котором не получается, для начала


NU>Код вот такой

NU>
NU>int CProperties::GetPropValue(LPCTSTR listName, LPCTSTR propName, const void* Val)
NU>{
NU>...
NU>};
NU>


Я конечно извиняюсь, но большего ужаса я ещё не видел .
Поехали по пунктам:
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, в данном случае это будет самое простое и быстрое решение.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[4]: Получить строку через void*
От: sc Россия  
Дата: 14.10.04 08:04
Оценка:
MN>А теперь совет, измени сигнатуру метода следующим образом:
MN>GetPropValue(LPCTSTR listName, LPCTSTR propName, VARIANT *Val)
MN>и посмотри, как использовать тип VARIANT, в данном случае это будет самое простое и быстрое решение.

А может проще передавать ссылку?
VARIANT &Val
Если нет, то почему?
Re[5]: Получить строку через void*
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 14.10.04 08:33
Оценка:
Здравствуйте, sc, Вы писали:

MN>>А теперь совет, измени сигнатуру метода следующим образом:

MN>>GetPropValue(LPCTSTR listName, LPCTSTR propName, VARIANT *Val)
MN>>и посмотри, как использовать тип VARIANT, в данном случае это будет самое простое и быстрое решение.

sc>А может проще передавать ссылку?

sc>VARIANT &Val
sc>Если нет, то почему?

Это уже дело вкуса... Просто если использовать ссылку, то по записе:
GetPropValue("", "", myVal)
не видно, что myVal может быть изменён...
GetPropValue("", "", &myVal) — так нагляднее...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.