invalid conversion from int to char fpermissive

У меня сегодня самая странная проблема. Я работал с примером в Интернете, и, к моему удивлению, это не сработало (они почти никогда не делают). Я решил исправить это сам, но, похоже, застрял на этой ошибке:

Это я поняла. Я предоставляю int* Хочет unsigned int* , Тем не менее, я на самом деле не знаю, Зачем int* генерируется.

Вот фрагмент кода, бросающий проблему:

Третий аргумент этого вызова функции, &md_length , вызывает проблему. Просматривая документацию для вызова этой функции (Из OpenSSL, если это
вопросы)
, он ожидает, что аргумент unsigned int* тип, который делает с тех пор, потому что он хочет адрес (или, по крайней мере, то, как пример использует этот пример).

Забавно, я думал, что & оператор вернул unsigned int* , как возвращение int* не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.

Ниже приведен исходный код, если вы хотите попробовать его самостоятельно. Я сомневаюсь, что вам на самом деле нужно прочитать это, чтобы решить эту проблему, но наличие этого здесь не повредит.

Исходный код:

Кроме того, положив явный приведение (unsigned int*) кажется, только усугубляет ситуацию, так как я получаю следующую ошибку:

В основном, он жалуется на все функции OpenSSL.

И, наконец, (опять же, это просто, чтобы дать вам, ребята, все, что вам может понадобиться) Я не посылаю никаких смешных аргументов компилятору. Я просто использую:

Так как есть ошибка, example.out на самом деле никогда не создается.

Решение

Забавно, я думал, что & Оператор возвратил беззнаковое целое *, так как возвращать целое * не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.

Это не смешно»; это просто неправильно.

Оператор address-of применяется к объекту типа T дает указатель типа T* ,

Будь то T тип без знака или со знаком не входит в него и не имеет ничего общего с философскими дебатами о том, могут ли компьютеры иметь отрицательные адреса. На самом деле, указатели являются как правило, с подписью, потому что, если это не так, вы скоро застрянете, пытаясь измерить разницу между двумя адресами, или вернетесь назад в адресное пространство.

Но это не имеет ничего общего с использованием термина unsigned в вашем коде.

Другие решения

возвращать int * не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.

Вы неправильно понимаете, что означает имя типа.

unsigned int* это указатель на unsigned int , без знака не относится к значению указателя.

Таким образом, решение состоит в том, чтобы изменить ваш int на unsigned int.

Забавно, я думал, что & Оператор возвратил беззнаковое целое *, так как возвращать целое * не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.

Это не подпись номера адреса памяти (базовое значение указателя), это подпись типа данных, хранящегося в адресах памяти, в данном случае целые числа.

Измени свой md_length для unsigned int согласно спецификации, и все должно быть в порядке.

When I try to run this code snippet I got an error invalid conversion from char * to int fpermissive. I can not figure out what does this error indicate. If any one have any idea please help me to find out its meaning.

Thank you in advance.

2 Answers 2

argv is a pointer to a pointer to a character which in short you can assume as pointer to strings and you assign an element of that directly to n.

n is a character array. First convert n to an integer by atoi() which you can find in stdlib.h

I guess in C++ it is cstdlib.

You can’t assign a char* pointer to an int variable, unless you type-cast it, which is not what you need in this situation. You need to parse the char* string using a function that interprets the *content* of the string and returns a translated integer, such as [ std::atoi() ](https://en.cppreference.com/w/cpp/string/byte/atoi), [ std::stoi()`](https://en.cppreference.com/w/cpp/string/basic_string/stol), etc.

Also, you are not initializing n if the user runs your app without entering a command-line parameter. And the first user-entered parameter is stored in argv[1] , argv[0] contains the calling app’s path/filename instead.

Also, you need to use delete[] instead of delete . Rule of thumb — use new and delete together, and new[] and delete[] together. Or prefer to not use them directly at all (use std::vector , std::make_unique () , etc instead).

VadimRM

Nick_SPb

Привет, запятые убери перед закрывающей скобкой)))

VadimRM

Привет, запятые убери перед закрывающей скобкой)))

Arhat109

frames_cloud_up определен неверно.

Вы указали его как массив коротких целых из 2-х элементов, а приинициализировать пытаетесь двумя АДРЕСАМИ на массивы. Об чем Вам и сообщает кумпилятыр.

const uint16t * frames_cloud_up[2] = ; // так должно быть правильней.

VadimRM

frames_cloud_up определен неверно.

Вы указали его как массив коротких целых из 2-х элементов, а приинициализировать пытаетесь двумя АДРЕСАМИ на массивы. Об чем Вам и сообщает кумпилятыр.

const uint16t * frames_cloud_up[2] = ; // так должно быть правильней.

Оцените статью