Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 12.08.2014
Сообщений: 65
1

Неправильное приведение void* к *float а далее к float

14.12.2016, 08:46. Показов 593. Ответов 1
Метки нет (Все метки)

Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают нормально, когда делаю те же операции но с void* на float* то происходят ошибки точнее выводятся не те данные что я ввел, (данные разыменовываю в соответствии с тем типом, который я туда записал)

Вот код:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
 
class MyData{
public:
    MyData(){}
 
    enum tType{
        FLOAT,
        INT
    };
 
    void operator=(int obj){
        data = static_cast<void*>(&obj);
        type = INT;
    }
 
    void operator=(float obj){
        data = static_cast<void*>(&obj);
        type = FLOAT;
    }
 
    float as_float(){
        if (type == INT){
            int *fff = static_cast<int*>(data);
            return static_cast<float>( *fff );
        }
 
        float *fff = static_cast<float*>(data);
        return *fff;
    }
 
    int as_int(){
        if (type == FLOAT){
            float *fff = static_cast<float*>(data);
            return static_cast<int>( *fff );
        }
 
        int *fff = static_cast<int*>(data);
        return *fff;
    }
private:
    tType           type;
    void*           data;
};
 
 
class typeTest{
public:
    MyData& getData(){
        return dat;
    }
 
private:
    MyData dat;
};
 
int main(){
    typeTest ttt;
 
    ttt.getData() = static_cast<float>(123);
    cout << ttt.getData().as_float() << endl;
 
    return 0;
}
Добавлено через 14 минут
уже разобрался, конечно глупо получилось, проблема была скорее всего в том что данные затирались, с выделением памяти под этот указатель все заработало
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
 
class MyData{
public:
    MyData(){
        data = nullptr;
    }
 
 
    enum tType{
        FLOAT,
        INT
    };
 
    ~MyData(){
        delData();
    }
 
    void operator=(int obj){
        if (data != nullptr){
            delData();
        }
        int *temp = new int(obj);
        data = static_cast<void*>(temp);
        type = INT;
    }
 
    void operator=(float obj){
        if (data != nullptr){
            delData();
        }
        float *temp = new float(obj);
        data = static_cast<void*>(temp);
        type = FLOAT;
    }
 
    float as_float(){
        if (type == INT){
            int *fff = static_cast<int*>(data);
            return static_cast<float>( *fff );
        }
 
        float *fff = static_cast<float*>(data);
        return *fff;
    }
 
    int as_int(){
        if (type == FLOAT){
            float *fff = static_cast<float*>(data);
            return static_cast<int>( *fff );
        }
 
        int *fff = static_cast<int*>(data);
        return *fff;
    }
private:
    tType           type;
    void*           data;
 
    void delData(){
        switch (type) {
            case FLOAT:
                delete static_cast<float*>(data);
                data = nullptr;
            break;
            case INT:
                delete static_cast<int*>(data);
                data = nullptr;
            break;
        }
    }
};
 
 
class typeTest{
public:
    MyData& getData(){
        return dat;
    }
 
private:
    MyData dat;
};
 
int main(){
    typeTest ttt;
 
    ttt.getData() = static_cast<int>(123);
    cout << ttt.getData().as_float() << endl;
 
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2016, 08:46
Ответы с готовыми решениями:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ ...

ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int)
Какая то проблема с указателями,незнаю,не хочет щитать суму парних чисел в второй...

Void* не дружу с float, double
Почему если в качестве значение параметра функции типа void*, передавать...

Чем отличаются float преобразования (float)var от float(var)
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

1
Форумчанин
Эксперт CЭксперт С++
8167 / 5015 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
14.12.2016, 11:20 2
На какой только изврат люди не пойдут лишь бы не пользоваться шаблонами
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2016, 11:20

Помощь в написании контрольных, курсовых и дипломных работ здесь.

cannot convert `float' to `float*. Почему так происходит?
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже ...

invalid types `float[float]' for array subscript
void SEARCH(float vol, float price, int i) { if (i&gt;N) { if(price&gt;maxprice) ...

Ошибка cannot convert 'float' to 'float*'
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int...

ошибка "invalid operands to binary expression ('float*' and 'float')"
начала писать программу и запоролась на первой же функции double atmosphere(double h_geo) { ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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