2015-03-04 2 views
2

Я пытаюсь сделать работу c-функции в каком-то общедоступном коде линейной алгебры.Преобразование из строкового литерала в char *

общедоступный прототип ...

int ilaenv_(int *, char *, char *, int *, int *,int *, int *); 

общедоступный код имеет вызов функции ...

nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1); 

где т, п, c_1 и c_n1 являются целыми числами,

сообщение об ошибке есть.

C++ 11 does not allow conversation from string literal to char *. 

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

Как я могу это решить?

+0

Вы можете просто произносить константу, но я не знаю, может ли это быть хорошо. –

+2

Действительно ли это «разговор»? Используйте фактические строки ошибок. И исправьте заголовок. –

+0

Не строгий дубликат, но это должно иметь некоторую полезную информацию: http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c/ 1704433 # 1704433 – Adam

ответ

1

Извините за то, что так поздно, я просто столкнулся с этой проблемой. Вы можете попробовать это,

string dgeqrf = "DGEQRF"; 

Одна из проблем, с использованием «константный символ *» это код, как это,

string formatString; 
switch (format) 
{ 
    case FORMAT_RGB: formatString = "RGB"; break; 
    case FORMAT_RGBA: formatString = "RGBA"; break; 
    case FORMAT_TP10: formatString = "TP10"; break; 
    default:   formatString = "Unsupported"; break; 
} 

Если объявить FormatString как «сопз полукокса *», это не будет работать ,

+0

re." Если вы объявить 'formatString' как' const char * ', это не сработает» - приведенный здесь код будет отлично работать с 'const char *', но потенциальная проблема заключается в том, что функция принимает 'char *' not 'const char * ', поэтому мы не знаем, будет ли он изменяться содержимое строки, а изменение строковых литералов запрещено.Следовательно, необходимо иметь модифицируемый массив, либо путем преобразования из 'string', либо в виде массива' char' вместо указателя (согласно моему ответу). _Unless_ вам нужно назначить содержимое динамически (как в этом ответе), массив проще. – Arkku

6

Чтобы быть в безопасности, вы можете создать char массивов инициализированы в одних и те же значения, например:

char dgeqrf[] = "DGEQRF"; 
char space[] = " "; 

Или вы можете проверить исходный код функции; если он фактически не изменяет содержимое этих массивов, вы можете изменить аргументы на const char *.

+0

Спасибо. Это похоже на направление. – K17

+0

Создание символьной строки успешно удалило ошибку. – K17

3

Ваша функция принимает символ «char *», а не «const char *». Строковые литералы могут быть назначены только «const char *».

Смежные вопросы