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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
#1

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

24.07.2010, 20:16. Просмотров 2719. Ответов 15
Метки нет (Все метки)

Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на void. Как преобразовать структуру в указатель типа void? Если попробовать (void *)pParams пишет:
error C2440: приведение типов: невозможно преобразовать 'action' в 'void *'
pParams - переменная типа action.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2010, 20:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель void на структуру (C++):

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Ввод данных в структуру через указатель на структуру - C++
#include "stdafx.h" #include "ctime" #include "iostream" #pragma warning(disable : 4996) using namespace std; class...

Указатель на void - C++
Как можно сделать универсальную функцию, которая принимает указатель на неопределенный тип, увеличивает значение на которое указывает этот...

Указатель типа void c++ - C++
Haпример указатель типа void*ptr char *p void *ptr="abs"; p=((char *)ptr);Так указатель неопределённого типа, присваивается к...

Указатель типа void - C++
Добрый день. enum Type { Double, Int, Float }; void func(int k,enum Type t,...) { void *pv; pv = (...); ... }

Обобщенный указатель типа void - C++
В приложенной картинке рассказывается о динамическом распределении памяти в С. Сказано, что функция malloc() возвращает указатель типа...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 20:31 #2
Bazan, структуру размести в динамической памяти и преобразуй указатель.
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 20:46  [ТС] #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.
0
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:19 #4
покажи весь код ничего ведь не понять
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:26  [ТС] #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;
}
0
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:36 #6
в єтом коде нет ошибок, она где-то спряталась

Добавлено через 1 минуту
_beginthread покажи хоть єту функцию
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:39  [ТС] #7
Цитата Сообщение от лендер Посмотреть сообщение
в єтом коде нет ошибок, она где-то спряталась
В этом коде нет ошибок? Ты скомпилируй сначала.
Показать _beginthread? Вот её вызов: _beginthread( Thread, 0, (void *)pParams );
А сама функция где-то в <process.h>
0
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
24.07.2010, 21:41 #8
компилируется в борланд 3.1
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 21:44  [ТС] #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"
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 22:06 #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;
1
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 22:47  [ТС] #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;
}
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 22:53 #12
Bazan, давайте договоримся так, если вы задаете вопрос, предоставте всю необходимую информацию для ответа. Так будет проще и вам и отвечающим.
Цитата Сообщение от Bazan Посмотреть сообщение
FP
Что это за класс? Перегружен ли оператор []?
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
24.07.2010, 22:59  [ТС] #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Bazan, давайте договоримся так, если вы задаете вопрос, предоставте всю необходимую информацию для ответа. Так будет проще и вам и отвечающим.

Что это за класс? Перегружен ли оператор []?
Я же в комментарии к строке 19 написал "для простоты считаем, что FP это класс, содержащий массив Num из PND элементов типа int". Зачем перегружать оператор []?
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.07.2010, 23:09 #14
Поле Num класса FP какой тип имеет?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.07.2010, 05:35 #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];
переноси на другие строки, чтобы определить
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2010, 05:35
Привет! Вот еще темы с ответами:

Арифметика указателей (указатель на void*) - C++
У меня есть указатель на void*, который я получил с помощью void *beginPointer = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);Мне...

Чем плохой указатель на void? - C++
Здравствуйте! Недавно прочитал статью на хабре http://habrahabr.ru/post/102930/ Сабж - архитектура игрового двигла, а именно менеджер...

Привести указатель на класс к указателю на void - C++
Хай #pragma once #include &quot;list.h&quot;; #include &quot;Print.h&quot;; class Robot { public:

Преобразование void* в структуру - C++
Как преобразовать HANDLE в структуру? В C# возможно написание следующего кода: public static extern IntPtr OpenFileMapping(int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.07.2010, 05:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru