Форум программистов, компьютерный форум CyberForum.ru

Указатель void на структуру - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 20:16     Указатель void на структуру #1
Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на void. Как преобразовать структуру в указатель типа void? Если попробовать (void *)pParams пишет:
error C2440: приведение типов: невозможно преобразовать 'action' в 'void *'
pParams - переменная типа action.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 20:31     Указатель void на структуру #2
Bazan, структуру размести в динамической памяти и преобразуй указатель.
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 20:46  [ТС]     Указатель void на структуру #3
Проблема исчерпана - надо было всего-лишь обьявить pParams как указатель. Но теперь возникла новая проблема -на строчке:
C++
1
pParams->fNum=Num;
Вылезает необратотанное исключение в "0x...", нарушение прав доступа при записи в "0x...".

На эту-же строчку выдает предупреждение
"warning C4700: использована неинициализированная локальная переменная "pParams"",
не смотря на то, что pParams инициализирована одной строчкой выше. Вопрос -почему?

Структура выглядит так:
C++
1
2
3
4
5
struct action
{
        FP fNum,sNum,rNum;
        int i;
};
pParams инициализирована так:
C++
1
action *pParams;
FP - мой класс. Num - переменная типа FP.
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:19     Указатель void на структуру #4
покажи весь код ничего ведь не понять
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:26  [ТС]     Указатель void на структуру #5
Цитата Сообщение от лендер Посмотреть сообщение
покажи весь код ничего ведь не понять
Весь? 768 строчек класса и 120 строчек функции main? Оно тебе надо?
Будем считать, что код таков(Он принципиально такой-же. Правда ошибка другая вылазит - "Run-Time Check Failure #3 - The variable 'pParams' is being used without being initialized."):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
struct action
{
                int fNum;
};
 
int main()
{
    action *pParams;
    int Num=1;
    pParams->fNum=Num;
    return 0;
}
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:36     Указатель void на структуру #6
в єтом коде нет ошибок, она где-то спряталась

Добавлено через 1 минуту
_beginthread покажи хоть єту функцию
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:39  [ТС]     Указатель void на структуру #7
Цитата Сообщение от лендер Посмотреть сообщение
в єтом коде нет ошибок, она где-то спряталась
В этом коде нет ошибок? Ты скомпилируй сначала.
Показать _beginthread? Вот её вызов: _beginthread( Thread, 0, (void *)pParams );
А сама функция где-то в <process.h>
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:41     Указатель void на структуру #8
компилируется в борланд 3.1
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:44  [ТС]     Указатель void на структуру #9
Цитата Сообщение от лендер Посмотреть сообщение
компилируется в борланд 3.1
А запустить? В Microsoft Visual Studio 2008 вылазит окно с "Run-Time Check Failure #3 - The variable 'Num' is being used without being initialized."
И еще при компиляции появляются варнинги на 12 строчку
warning C4700: использована неинициализированная локальная переменная "Num"
warning C4700: использована неинициализированная локальная переменная "pParams"
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 22:06     Указатель void на структуру #10
Bazan, память под pParams не выделена, осюда и ошибка:
C++
1
2
3
4
5
6
7
8
action *pParams = new action;
 
int Num=1;
pParams->fNum=Num;
 
delete pParams;
 
return 0;
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 22:47  [ТС]     Указатель void на структуру #11
Новая ошибка: "error C2100: недопустимое косвенное обращение", повторяется трижды, ругается на эту строчку:
C++
1
*tParams->rNum->Num[*tParams->i+1]=*tParams->fNum->Num[*tParams->i+1]+*tParams->sNum->Num[*tParams->i+1];
В каком именно месте там косвенное обращение?
"Весь" код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <process.h>
struct action
{
                FP *fNum,*sNum,*rNum;
                int *i;
};
void ThreadPlus( void* pParams )
{ 
    action *tParams;
    tParams=(action*)pParams;
 
    while(*tParams->i<PND)
        *tParams->rNum->Num[*tParams->i+1]=*tParams->fNum->Num[*tParams->i+1]+*tParams->sNum->Num[*tParams->i+1];
 
    _endthread();
}
void main()
{   FP fNum,sNum,rNum;//и присвоены какие-то значения, для простоты считаем, что FP это класс, содержащий массив Num из PND элементов типа int
    int i;//и присвоено какое-то значение.
    action *pParams = new action;
 
    pParams->fNum=&fNum;
    pParams->sNum=&sNum;
    pParams->rNum=&rNum;
    pParams->i=&i;
 
        
    _beginthread( ThreadPlus, 0, (void *)pParams );
    for(i=0;i<PND;i+=2)
            rNum.Num[i]=fNum.Num[i]+sNum.Num[i];
    delete pParams;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 22:53     Указатель void на структуру #12
Bazan, давайте договоримся так, если вы задаете вопрос, предоставте всю необходимую информацию для ответа. Так будет проще и вам и отвечающим.
Цитата Сообщение от Bazan Посмотреть сообщение
FP
Что это за класс? Перегружен ли оператор []?
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 22:59  [ТС]     Указатель void на структуру #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Bazan, давайте договоримся так, если вы задаете вопрос, предоставте всю необходимую информацию для ответа. Так будет проще и вам и отвечающим.

Что это за класс? Перегружен ли оператор []?
Я же в комментарии к строке 19 написал "для простоты считаем, что FP это класс, содержащий массив Num из PND элементов типа int". Зачем перегружать оператор []?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 23:09     Указатель void на структуру #14
Поле Num класса FP какой тип имеет?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.07.2010, 05:35     Указатель void на структуру #15
Цитата Сообщение от Bazan
В каком именно месте там косвенное обращение?
C++
1
2
3
4
    while (*tParams->i < PND)
        *tParams->rNum->Num[*tParams->i + 1] =
        *tParams->fNum->Num[*tParams->i + 1] +
        *tParams->sNum->Num[*tParams->i + 1];
переноси на другие строки, чтобы определить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2010, 01:07     Указатель void на структуру
Еще ссылки по теме:

Указатель на void C++
Арифметика указателей (указатель на void*) C++
C++ Как узнать тип, переданный через указатель на void?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6a6kin
 Аватар для 6a6kin
232 / 102 / 2
Регистрация: 18.04.2010
Сообщений: 295
26.07.2010, 01:07     Указатель void на структуру #16
Операция доступа к членам класса (->) и есть косвенное обращение.
Имеет самый высокий приоритет и левую ассоциативность. По сути, ты умножаешь на два значение элемента Num массива, rNum объекта. Надо бы на класс взглянуть.
ИМХО, так проще:
C++
1
*tParams->rNum->Num[*tParams->i + 1] *= 2;
Yandex
Объявления
26.07.2010, 01:07     Указатель void на структуру
Ответ Создать тему
Опции темы

Текущее время: 04:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru