Ошибка компиляции Malloc: значение типа » int » нельзя использовать для инициализации сущности типа int (*)[30]
Я, должно быть, уже пробовал 20 способов сделать это. Мне действительно нужна помощь, независимо от того, что я делаю, я получаю ошибку, подобную этой.
т. е. это приведет меня к такой ошибке
и делать что-то вроде этого
у кого-нибудь есть решение для того, как успешно выделить 2dArray int[160][10]
6 ответов
оба они компилируются отлично для меня. Первая ошибка распространена, когда вы забываете #include до использования функций, объявленных в пределах said-same (например, malloc(size_t) ), что я и сделал не забудьте сделать.
C имеет некоторые интересные поведения во время компиляции, среди них способность вызывать функцию, которая никогда не была замечена раньше (ни определение прототипа , ни реализации). При встрече с таким вызовом C принимает функция:
например., неявно предполагается, что функция имеет вид:
часто вы даже не заметите, за исключением предупреждений от вашего компилятора, которые сообщают что-то о:
и если вы на-мяч, у вас есть уровни предупреждения появились с включенными предупреждениями-как-ошибки и поймают это.
ну, компилятор должен блевать, говоря вам, что int и char* не совместимы (вскоре после того, как он предупреждает вас get_str предполагается вернуть int ). Но что, если вы заставите компилятор вручную говорит сделать char* так или иначе:
Итак, как все это относится к вашему коду? Не включая компилятор не знает, что malloc есть. Поэтому он предполагает, что это формы:
затем, бросив результат в (int**) вы говорите компилятору: «что бы из этого ни вышло, сделайте это int** «. В момент соединения, _malloc найдено (нет сигнатуры параметра через имя, например, C++), подключено, и ваша программа готова к вечеринке. Но на вашей платформе!—7—> и указатели данных не тот же размер, таким образом, вы в конечном итоге с несколькими нежелательными последствиями:
Итак, вы строите это на своем 32-битном Debian box, все выглядит хорошо. Вы сдаете домашнее задание профессору, который строит его на своем 64-битном Mac, и он падает, вы проваливаете задание, проваливаете класс, бросаете колледж и проводите следующие десять лет, гладя кошку, наблюдая повторы Сайнфелда в подвале вашей мамы, удивляясь, что пошло не так. Ай.
не относитесь к литью, как к какой-то серебряной пуле. Это не так. В C, это необходимо далеко реже, чем люди используют его, и если используется в неправильном месте, может скрыть катастрофические ошибки. Если вы найдете точку в своем коде, где что-то не будет компилироваться без жесткого приведения, посмотрите еще раз. Если вы не абсолютно, положительно уверены, что бросок-это правильная вещь, шансы его неправильно.
в этом случае он скрыл реальную ошибку, что вы забыли дать достаточно информации вашему компилятору, чтобы знать, что malloc действительно делает.
Вспомним синтаксис C++ или помогите с присвоением значения переменной
typedef BOOL(FAR *GetDeviceListFuncType) (LPVOID*, int*, LPVOID*, int);
BOOL(FAR* Proba);
LPVOID* aaa1, aaa2;
int* bbb1;
int bbb2;
Proba = GetDeviceListFuncType(aaa1, bbb1, aaa2, bbb2);
IntelliSense: значение типа «GetDeviceListFuncType» нельзя присвоить сущности типа «BOOL *»
Что сделано неправильно?
typedef BOOL (FAR *GetDeviceListFuncType) (LPVOID*, int*, LPVOID*, int);
HMODULE hLib = GetModuleHandle(«MyDll.dll»);
GetDeviceListFuncType GetDeviceList = GetProcAddress(hLib, «GetDeviceListFunc»);
GetDeviceList(a,b,c,d);
IntelliSense: значение типа «FARPROC» нельзя использовать для инициализации сущности типа «GetDeviceListFuncType»
(11) не горит. для себя родного всё.
(13)
HMODULE hLib = GetModuleHandle(«PMDll.dll»);
typedef BOOL (FAR *GetDeviceListFuncType) (LPVOID*, int*, LPVOID*, int);
GetDeviceListFuncType pVar = GetProcAddress(hLib, «GetDeviceListFuncType»);
Получилось вот так
BOOL (FAR *GetDeviceListFuncType) (LPVOID*, int*, LPVOID*, int);
(FARPROC &)GetDeviceListFuncType = GetProcAddress(hLib, «GetDeviceListFuncType»);
BOOL pVar = GetDeviceListFuncType(aaa1, bbb1, aaa2, bbb2);
по примеру из ссылки выше. теперь осталось добить переменные для функции.
ну судя по
LPVOID* aaa1, aaa2;
int* bbb1;
int bbb2;
тебе еще долго ковыряться 🙂
GetDeviceListFuncType GetDeviceList = GetDeviceListFuncType(GetProcAddress(hLib, «GetDeviceListFunc»));
GetDeviceList(a,b,c,d);
GetDeviceListFuncType это тип
GetDeviceList это переменная типа GetDeviceListFuncType
ей присваиваем адрес функции
GetDeviceList = GetDeviceListFuncType(GetProcAddress(hLib, «GetDeviceListFunc»));
BOOL z = GetDeviceList(a,b,c,d);
что должно быть в параметрах, я не знаю.
ну и прежде чем вызывать функцию, проверь, есть она или нет.
if (GetDeviceList == NULL) < ошибка >;
(27) «как перевести в C++ строки из C#? нужен аналог вот этого:
public String strHostname;»
пиши так CString strHostname;
или так char * strHostname;
или так char strHostname[80];
(14) «HMODULE hLib = GetModuleHandle(«PMDll.dll»); «
может стоит так написать
(0) ТС вот тебе пример загрузки длл
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;
Из типа char * в тип int *
Из-за невозможности неявного преобразования из типа char * в тип int * в проекте при компиляции происходит ошибка:
. \ProcMem.cpp In file included from ProcMem.cpp
. \ProcMem.h In member function ‘cData ProcMem::Read(DWORD, char*, BOOL)’:
. \ProcMem.h [Error] no matching function for call to ‘ProcMem::iSizeOfArray(char*&)’
. \ProcMem.h [Note] candidate is:
. \ProcMem.cpp In file included from ProcMem.cpp
. \ProcMem.h [Note] int ProcMem::iSizeOfArray(int*)
. \ProcMem.h [Note] no known conversion for argument 1 from ‘char*’ to ‘int*’
Что мне нужно изменить в ProcMem.h?
2 ответа 2
Вы можете использовать приведение типов reinterpret_cast при условии, что значение исходного указателя типа char * соответственно выравнено на границу для типа int.
Но я думаю, что ваш вопрос к вашей проблеме не имеет отношения. Скорей всего вы по недопониманию пытаетесь сделать что-то некорректное либо в проектировании ваших классов, либо в обращении с ними.
Для начала нужно понимать в каком контексте вызывается вот эта функция:
Точней вам может ответить только тот человек, который проектировал весь этот функционал. И/или тот, у которого есть хорошее его понимание плюс полный набор исходников перед глазами.
Динамический массив C ++: значение типа «void» не может использоваться для инициализации объекта типа & quot; int & quot;
Я работаю над проектом C ++ для школы, в котором программа будет читать список чисел из текстового файла, сохранять их в динамическом массиве, а затем распечатывать в другой текстовый файл. Честно говоря, я немного растерялся с указателями в этом, и я получаю ошибку «Значение типа» void «нельзя использовать для инициализации объекта типа» int «» в моем основном исходном файле.
Main.cpp (здесь я получаю сообщение об ошибке):
dynamic.cpp (каркас для программы):
и dynamic.h, заголовочный файл:
Решение
Вы должны добавить скобки к главной или любой функции:
2- вы используете унифицированный объект:
так что int * theArray является данными члена и неинициализирован, так что добро пожаловать в segfault
все члены da не инициализированы, поэтому вы должны сделать это перед использованием.
3 — также вы добавляете круглые скобки для функции Grow:
4- using namespace std; в заголовочном файле это очень плохая практика.
совет использовать его внутри источника
Другие решения
main это функция, поэтому ей нужны скобки:
А также. Ваш grow также является функцией, поэтому, если вы хотите вызвать ее, напишите grow() и это нужно DynamicArray в качестве параметра.
Нельзя писать рабочие программы на C / C ++ любой язык программирования, не знающий базового синтаксиса.
Преобразование типов в C++
С++ позволяет нам преобразовывать данные одного типа в данные другого – это известно как преобразование типов.
В C++ существует два типа преобразования:
Неявное преобразование типов
Преобразование типа, которое автоматически выполняется компилятором, известно как неявное преобразование. Этот тип также известен, как автоматическое преобразование.
Давайте посмотрим на два примера неявного преобразования типов.
Пример 1: из int в double
В программе мы присвоили данные типа int переменной типа double.
Пример 2: из double в int
В программе мы присвоили данные типа double переменной типа int.
Примечание. Поскольку int не может иметь десятичную часть, цифры после десятичной точки в приведенном выше примере усекаются.
Потеря данных (сужение преобразования)
Как мы видели из приведенного выше примера, преобразование из одного типа данных C++ в другой в С++ подвержено потере данных. Это происходит, когда данные большего типа преобразуются в данные меньшего типа.
Явное преобразование
Когда пользователь в C++ вручную меняет данные с одного типа на другой, это называется явным преобразованием. Этот тип преобразования также известен, как приведение типов.
Есть три основных способа использования явного преобразования в C++:
C-style
Как следует из названия, этому типу приведения предпочитает язык программирования C. Это также известно как обозначение приведения.
Синтаксис этого стиля:
Использование функционального стиля
Мы также можем использовать такую функцию, как нотация, для преобразования данных из одного типа в другой.
Пример 3: приведение типов
Мы использовали преобразование типа в стиле C и преобразование в функциональный стиль, и отобразили результаты. Поскольку они выполняют одну и ту же задачу, оба дают нам одинаковый результат.
Операторы преобразования типов
Помимо этих двух приведений типов, C++ также имеет четыре оператора преобразования типов:






