1 Востаннє редагувалося Betterthanyou (14.01.2017 02:08:03)

Тема: warning: deprecated conversion from string constant to 'char*'

Я хочу зробити таку функцію яка буде повертати текст (що вона робить не важливо)

я вирішив зробити функцію яка буде отримувати посилання

Чому

тому що я зіткнувся з такою проблемою, коли функція спрацьовує з помилкою я маю її припинити, наскільки я знаю виконання функції можна припинити лише за допомогою return, але що мені повертати ? Динамічно створений масив символів (рядок) чи пустий рядок (*text чи "")
Навіщо повертати рядок якщо функція спрацювала з помилкою (тобто text пустий).
А пустий рядок я не хочу повертати бо не знаю чи він видалиться, я ж не виділяв для нього пам'яті, виходить це видалення статичний даних ?

char *fun()
{
    char *text = new char[100];
    ...
    if(ЯКЩО ПОМИЛКА)
    return "";
    ...
    return text;
}

int main()
{
    char *text = fun();
    delete [] text;
    ...
void fun(char **contents/*out*/)
{
    *contents = NULL;//init
    char *text = new char[100];
    ...
    if(ЯКЩО ПОМИЛКА)
    return;
    ...
    *contents = text;
}
int main()
{
    char *text;
    fun(&text);
    delete [] text;
    ...

Все працює, але мене бентежить попередження про застаріле перетворення, що я не так роблю ?

2

Re: warning: deprecated conversion from string constant to 'char*'

Якщо це плюси, то тут сам Страуструп наказав RAII застосовувати. Ліньки клас писати - беріть розумні вказівники.
Раз ви не хочете повертати пустий рядок, а хочете NULL - то його й повертайте, в чому проблема?
Що ж до вашого питання

Betterthanyou написав:

мене бентежить попередження про застаріле перетворення, що я не так роблю ?

то ви не вказуєте, в якому рядку компілятор бачить проблему. А, так, і сам компілятор ви не назвали (ви навіть мову не назвали, якщо бути чесним).

Подякували: Yola, Betterthanyou2

3 Востаннє редагувалося Yola (14.01.2017 10:35:06)

Re: warning: deprecated conversion from string constant to 'char*'

А якщо у вас виняткова ситуація виникне десь у функції, хто очистить пам'ять? Ага, ніхто:)

void fun(unique_ptr<char[]>& contents)
{
    contents = make_unique<char[]>(100);
}
int main()
{
    unique_ptr<char[]> text;
    fun(text);
}

У випадку помилку кидайте виняток. Звісно, можна і просто не встановити contents, але виняток краще.

А ви точно не можете використати string чи vector<char>?

Подякували: Betterthanyou1

4

Re: warning: deprecated conversion from string constant to 'char*'

Дійсно хотілося б побачити на який рядок і що за попередження

Betterthanyou написав:
char *fun()
{
    char *text = new char[100];
    ...
    if(ЯКЩО ПОМИЛКА)
    return "";    

А літерал зараз хіба не const char* ?

Betterthanyou написав:
void fun(char **contents/*out*/)
{
    *contents = NULL;//init

Все працює, але мене бентежить попередження про застаріле перетворення, що я не так роблю ?

Якщо #define NULL (void*)0 то це і буде «С-шний cast», який трохи тойво…

Подякували: Yola, Betterthanyou2

5

Re: warning: deprecated conversion from string constant to 'char*'

Ймовірно попередження в цьому рядку

return "";

Бо рядковий літерал - це const char*.

Ну, і так, варто використовувати nullptr замість NULL.

Подякували: Betterthanyou1

6

Re: warning: deprecated conversion from string constant to 'char*'

koala написав:

то ви не вказуєте, в якому рядку компілятор бачить проблему. А, так, і сам компілятор ви не назвали (ви навіть мову не назвали, якщо бути чесним).

IDE - qt
збирає qmake
компілятор MinGW
попередження в рядку

fun(&text);

(тобто в 14)

Yola написав:

А ви точно не можете використати string чи vector<char>?

Я пишу на С++ але я не можу використати string тому що я підключив mini-gmp (для арифметики), GMP написана С тому мені потрібні рядки char (який я передаю в GMP)
Я знаю що можна створити рядок string, а потім при потребі конвертувати його в char, але на мій погляд це не правильно (навіщо використовувати додаткову операцію конвертування)

Подякували: Yola1

7 Востаннє редагувалося Yola (14.01.2017 16:43:53)

Re: warning: deprecated conversion from string constant to 'char*'

Betterthanyou написав:

Я пишу на С++ але я не можу використати string тому що я підключив mini-gmp (для арифметики), GMP написана С тому мені потрібні рядки char (який я передаю в GMP)
Я знаю що можна створити рядок string, а потім при потребі конвертувати його в char, але на мій погляд це не правильно (навіщо використовувати додаткову операцію конвертування)

string::c_str()- повертає вказівник на сталий рядок.

Для vector<char>

value_type* data() noexcept;
const value_type* data() const noexcept;

Якщо пам'ять дуже критична, то кращу unique_ptr, бо вектор може виділити більше пам'яті ніж треба.

Також подумайте про можливість виділення пам'яті на стеку замість купи.

#include <array>
bool c_fun(char raw_contents[100]) {
    cout << "raw_contents:" << raw_contents << endl;
    return true;
}
void fun(array<char, 100>& contents)
{
    bool error = false;
    // ....
    error = c_fun(contents.data());
    if (error)
        throw logic_error("опис помилки");
    // ....
}
int main()
{
    try {
        array<char, 100> contents;
        fun(contents);
        // ....
    }
    catch (logic_error& e) {
        cout << e.what() << std::endl;
    }
}
Подякували: Betterthanyou1