Ошибка c2440 инициализация невозможно преобразовать

Столкнулся с ошибкой при выделении памяти под структуру в Си. Вот строчка, на которую указывает ошибка компиляции:

RGBTRIPLE* StringPixels = malloc((abs(biCopy.biWidth) * sizeof(RGBTRIPLE)));

RGBTRIPLE это структура для пикселей:

typedef struct
{
    BYTE rgbtBlue;
    BYTE rgbtGreen;
    BYTE rgbtRed;
} RGBTRIPLE;

Если кому не понятно, могу кинуть полный код. Сам код пробую скомпилировать на VS 2012.

αλεχολυτ's user avatar

αλεχολυτ

28.3k10 золотых знаков57 серебряных знаков118 бронзовых знаков

задан 31 июл 2016 в 17:36

Max_Advanced's user avatar

Max_AdvancedMax_Advanced

3111 золотой знак3 серебряных знака12 бронзовых знаков

malloc возвращает указатель типа void * для последующего использования его необходимо явно привести в нужный тип, например так:

RGBTRIPLE* StringPixels = (RGBTRIPLE*) malloc((abs(biCopy.biWidth) * sizeof(RGBTRIPLE)));

ответ дан 31 июл 2016 в 17:37

pavel's user avatar

1

Ваша проблема в том, что Вы компилируете сишный код компилятором c++. В c допускается неявное преобразование void* (который возвращает malloc) в T*, а вот в c++ это уже запрещено.

Поэтому, если код именно сишный, нужно и исходник компилировать как сишный. Для Visual Studio для этого обычно достаточно изменить расширение файла на .c.

Если же требуется обеспечить сборку в режиме c++, то требуется явное приведение типов, о котором уже сказано в другом ответе.

ответ дан 31 июл 2016 в 17:52

αλεχολυτ's user avatar

αλεχολυταλεχολυτ

28.3k10 золотых знаков57 серебряных знаков118 бронзовых знаков

Вот тут
Ошибка error C2440: инициализация: невозможно преобразовать «void *» в «char *»
//char *mem = malloc(strlen(str) + 1);

static inline char * strdup(const char *str)
{
	char *mem = malloc(strlen(str) + 1);
	strcpy(mem, str);

	return mem;
}

А вот тут
Ошибка error C2440: инициализация: невозможно преобразовать «void *» в «node_t *»
//node_t *node = malloc(sizeof(node_t));

void push(stack_t **top, const char *str)
{
	node_t *node = malloc(sizeof(node_t));

	node->str = strdup(str);
	node->next = NULL;

	if (!empty(top))
	{
		node->next = *top;
	}

	*top = node;
}

Аццкий Прогер

21 / 10 / 5

Регистрация: 07.01.2013

Сообщений: 222

1

16.07.2013, 20:55. Показов 5876. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Задание, сделать класс динамического массива шаблонным. Вот, вроде бы сделал, но наткнулся на ошибку, что не так?
Код:

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
#include<iostream>
#include<conio.h>
using namespace std;
 
 
template <class T>
class Dynamic_array
{
private:
    T iSize, iStep, iCurInd;
    T * pArray;
    void Add_Mem(); 
public:
    Dynamic_array() : iSize(2), iStep(2), iCurInd(0), pArray( new T * [iSize] )
    {
        for( T i=0; i<iSize; ++i )
            pArray[i] = NULL;
    }
    
    ~Dynamic_array()
    {
        for( T i=0; i<iSize+1; ++i )
            delete pArray[i];
        delete pArray;
    }
    void Add();
    void Show();
};
 
template <class T>
void Dynamic_array <T> :: Add_Mem()
{
    cout << "nAdding memory..." << endl;
    T * pTemp = new T * [iSize+iStep];
    for( T i=0; i<(iSize+iStep); ++i )
        pTemp[i] = NULL;
    for( T i=0; i<iSize; ++i )
        pTemp[i] = pArray[i];
    delete [] ppAr;
    pArray = pTemp;
    iSize += iStep;
}
template <class T>
void Dynamic_array <T> :: Add()
{
    if( iCurInd==iSize )
        Add_Mem();
    pArray[iCurInd++] = new T;  
}
 
template <class T>
void Dynamic_array <T> :: Show()
{
    if (Add())
        cout<<"Add successful"<<endl;
}
 
 
int main()
{
    Dynamic_array<int> d;
    d.Add();
    d.Show();   
 
    if (_CrtDumpMemoryLeaks() != 0)
        cout<< "Oops!" << endl; 
 
    _getch();
    cout << endl;
    return 0;
}



0



:)

Эксперт С++

4773 / 3267 / 497

Регистрация: 19.02.2013

Сообщений: 9,046

16.07.2013, 22:08

2

Аццкий Прогер, судя по названию класса, должен быть динамический массив. Но, судя по коду, например, деструктора, складывается впечатление, что это какая-то матрица.
1. Почему iSize, iStep, iCurInd имеют тип T? Должен быть обычный интегральный тип (int или size_t например).
2. В инициализаторе конструктора тип поля pArray не соответствует инициализируемому значению. Лишняя *.
3. Деструктор не понятный для массива.
4. Метод Add(), скорее всего, должен принимать аргумент, которым будет инициализировано добавляемое значение.
5. И т.д….



0



21 / 10 / 5

Регистрация: 07.01.2013

Сообщений: 222

16.07.2013, 22:54

 [ТС]

3

Цитата
Сообщение от Tulosba
Посмотреть сообщение

Аццкий Прогер, судя по названию класса, должен быть динамический массив. Но, судя по коду, например, деструктора, складывается впечатление, что это какая-то матрица.
1. Почему iSize, iStep, iCurInd имеют тип T? Должен быть обычный интегральный тип (int или size_t например).
2. В инициализаторе конструктора тип поля pArray не соответствует инициализируемому значению. Лишняя *.
3. Деструктор не понятный для массива.
4. Метод Add(), скорее всего, должен принимать аргумент, которым будет инициализировано добавляемое значение.
5. И т.д….

1. согласен, тут вполне и инта хватит.
2. Тоже так подумал, но потом компилятор выдал другую ошибку: C2440: инициализация: невозможно преобразовать «int *» в «int» — вот такую.
3. что именно там не понятно? объясни свою мысль пожалуйста.
4. В обычной ситуации, так оно и было бы, но функция адд нужна, чтобы был своеобразный доступ к скрытой в привате функции адд_мем.
5. И т.д.

поясните, что делаю не так, я только начал изучать С++. И ясно дело, еще многое не понимаю.



0



alsav22

5496 / 4891 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

16.07.2013, 23:53

4

Как-то так:

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
#include<iostream>
#include<conio.h>
using namespace std;
 
template <class T>
class Dynamic_array
{
private:
    int iSize, iStep, iCurInd;
    T * pArray;
    bool Add_Mem(); 
public:
    Dynamic_array() : iSize(2), iStep(2), iCurInd(0), pArray(new T [iSize])
    {
        for( int i = 0; i < iSize; ++i )
            pArray[i] = 0;
    }
    
    ~Dynamic_array()
    {
        delete pArray;
    }
    bool Add(T);
    void Show();
};
 
template <class T>
bool Dynamic_array <T> :: Add_Mem()
{
    cout << "nAdding memory..." << endl;
    T * pTemp = new T [iSize + iStep];
    if (pTemp == 0) return false;
    for( int i = 0; i < (iSize + iStep); ++i )
        pTemp[i] = 0;
    for( int i = 0; i < iSize; ++i )
        pTemp[i] = pArray[i];
    delete [] pArray;
    pArray = pTemp;
    iSize += iStep;
    return true;
}
 
template <class T>
bool Dynamic_array <T> :: Add(T a)
{
    if( iCurInd == iSize ) 
        if (!Add_Mem()) return false;
 
    pArray[iCurInd++] = a;
    cout << "Add successful" << endl;
    return true;
}
 
template <class T>
void Dynamic_array <T> :: Show()
{
    for (int i = 0; i < iCurInd; ++i)
        cout << pArray[i] << ' ';
        
}
 
 
int main()
{
    Dynamic_array<int> d;
    for (int i = 0; i < 10; ++i)
        d.Add(i);
   
    d.Show(); 
    
    if (_CrtDumpMemoryLeaks() != 0)
        cout<< "Oops!" << endl; 
 
    _getch();
    cout << endl;
    return 0;
}



1



Аццкий Прогер

21 / 10 / 5

Регистрация: 07.01.2013

Сообщений: 222

17.07.2013, 00:04

 [ТС]

5

Спасибо, некоторые свои промахи я понял. Ваш пример помог.

Цитата
Сообщение от alsav22
Посмотреть сообщение

Как-то так:

C++
1
2
3
4
    ~Dynamic_array()
    {
        delete pArray;
    }

Но, тут вот есть минус, при таком диструкторе происходит утечка памяти, но и мой вариант не помогает. Как быть?



1



Kuzia domovenok

4023 / 3280 / 920

Регистрация: 25.03.2012

Сообщений: 12,266

Записей в блоге: 1

17.07.2013, 00:08

6

Цитата
Сообщение от Аццкий Прогер
Посмотреть сообщение

~Dynamic_array()
* * {
* * * * delete pArray;
* * }

C++
1
delete[] pArray;



1



alsav22

5496 / 4891 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

17.07.2013, 00:42

7

Цитата
Сообщение от Аццкий Прогер
Посмотреть сообщение

при таком диструкторе происходит утечка памяти

Это я просмотрел. Тут ошибка. Нужно

Цитата
Сообщение от Kuzia domovenok
Посмотреть сообщение

delete[] pArray;

Добавлено через 3 минуты
При таком деструкторе утечки нет.

Добавлено через 7 минут
А для проверки утечек, нужно так сделать:

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
#include<iostream>
#include<conio.h>
using namespace std;
 
template <class T>
class Dynamic_array
{
private:
    int iSize, iStep, iCurInd;
    T * pArray;
    bool Add_Mem(); 
public:
    Dynamic_array() : iSize(2), iStep(2), iCurInd(0), pArray(new T [iSize])
    {
        for( int i = 0; i < iSize; ++i )
            pArray[i] = 0;
    }
    
    ~Dynamic_array()
    {
        delete [] pArray;
    }
    bool Add(T);
    void Show();
};
 
template <class T>
bool Dynamic_array <T> :: Add_Mem()
{
    cout << "nAdding memory..." << endl;
    T * pTemp = new T [iSize + iStep];
    if (pTemp == 0) return false;
    for( int i = 0; i < (iSize + iStep); ++i )
        pTemp[i] = 0;
    for( int i = 0; i < iSize; ++i )
        pTemp[i] = pArray[i];
    delete [] pArray;
    pArray = pTemp;
    iSize += iStep;
    return true;
}
 
template <class T>
bool Dynamic_array <T> :: Add(T a)
{
    if( iCurInd == iSize ) 
        if (!Add_Mem())
        {
            cout << "Memory allocation error!" << endl;
            return false;
        }
 
    pArray[iCurInd++] = a;
    cout << "Add successful" << endl;
    return true;
}
 
template <class T>
void Dynamic_array <T> :: Show()
{
    for (int i = 0; i < iCurInd; ++i)
        cout << pArray[i] << ' ';
        
}
 
 
int main()
{
    {
    
        Dynamic_array<int> d;
        for (int i = 0; i < 10; ++i)
            d.Add(i);
   
        d.Show(); 
    
    }
    
    if (_CrtDumpMemoryLeaks() != 0)
        cout<< "Oops!" << endl; 
    else cout << "nNo memory leaks!" << endl;
    _getch();
    cout << endl;
    return 0;
}



1



21 / 10 / 5

Регистрация: 07.01.2013

Сообщений: 222

17.07.2013, 00:54

 [ТС]

8

Цитата
Сообщение от alsav22
Посмотреть сообщение

При таком деструкторе утечки нет.

Спасибо! Теперь разобрался.



0



I tried to compile this and got mistakes such as:

Error   4   error C2440: 'initializing' : cannot convert from 'void *' to 'char *'  

This code is taken from here. Why doesn’t it work?

DWORD dwRead=0;

char *lpData = (VOID*)GlobalAlloc(GMEM_FIXED, MAX_READ),

BlackVegetable's user avatar

asked Feb 27, 2013 at 6:57

user2114177's user avatar

You appear to be compiling with a C++ compiler, so you’ll need an explicit cast:

char *lpData = (char *)GlobalAlloc(GMEM_FIXED, MAX_READ);

answered Feb 27, 2013 at 7:01

nneonneo's user avatar

nneonneonneonneo

170k35 gold badges307 silver badges377 bronze badges

1

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка c3861 printf идентификатор не найден
  • Ошибка c241301 solaris
  • Ошибка c221500 мерседес glk
  • Ошибка c3825 konica minolta

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии