C++ как вернуть массив типа char из функции
По замыслу эта функция будет открывать файл и считывать от туда данные, после эти данные функция вернёт, а потом я буду решать что с ними делать. Но при компиляции мне выдаёт ошибку:
main.cpp:8:16: error: incompatible types in assignment of 'char*' to 'char* [200]' text_in_file = data.loadData("C://Users//SilentiumNoxe//Documents//Projects//noteCoin//data//savedata.txt"); ^ main.cpp:9:107: error: no matching function for call to 'SaveText::saveData(char* [200], const char [75])' data.saveData(text_in_file, "C://Users//SilentiumNoxe//Documents//Projects//noteCoin//data//outfile.txt"); ^
Как правильно вернуть в данной ситуации массив и что значит «Нет подходящей функции для вызова»? P.S. string, vector и пр. не предлагать. Спасибо.
Как вернуть массив char из функции c
Написал функцию перевода из int в char, но есть одна проблема.
Вот функция:
char IntToStr( int Value )
Необходимо вернуть массив символов char[].
char[] IntToStr( int Value ) — выдает ошибку.
указатель тоже нельзя возвращать — возвращаем адрес локальной переменной..
конечно есть вариант передавать в качестве второго аргумента указатель на буффер, куда засунуть результат, но это сделаю второй перегружаемой функцией, нужна именно такая которая вернет результат =)
Регистрация: 08.01.2009
Сообщений: 9
А как насчет:
char * intToStr(int val)
Тут конечно есть проблема в том, что asprintf алокирует память и после использования ее надо освободить. Статический массив объявить внутри функции нельзя, так как переменная помрет на выходе из функции. ИМХО, другого решения я не нахожу (для С), если ты пишешь на С++ то тогда лучше работать со std::string и тогда утечки памяти можно уверено избежать.
#define BUF (32) std::string intToStr(int val)
| v_root_mne_logi |
| Посмотреть профиль |
| Найти ещё сообщения от v_root_mne_logi |
Регистрация: 08.01.2009
Сообщений: 9
вот сегодня пришло в голову, что возможно, если объявить внутри функции
static char arr[CONST], то мне кажется, что отработает как надо.
Правда не проверял, нет пока возможности.
Естесственно, что функция возвращает char *, а не просто char
| v_root_mne_logi |
| Посмотреть профиль |
| Найти ещё сообщения от v_root_mne_logi |
Форумчанин
Регистрация: 17.11.2008
Сообщений: 233
Создавай Чар* динамически
char* IntToStr(int n) < int SIZE=. ;//Сдесь можешь делить на 10, пока не получишь 0 и использовать счетчик; char* str = new char[SIZE+1]; //для '\0' . //присвоения и т.п. return str; >
А в main() удаляй
int main() < char* myStr; int n=333; myStr=IntToStr(n); . //делай что тебе надо if(myStr)delete [] myStr; >
P.S. что то типо этого. код не проверял, писал сразу. Так что может и не работать!
| Похожие темы | ||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Ошибка cannot convert from ‘char *’ to ‘char [100]’ | Stellvertreter | Общие вопросы C/C++ | 5 | 30.05.2010 00:02 |
| Возвращение стража. | Манжосов Денис 🙂 | Софт | 0 | 18.09.2008 22:57 |
| Есть таблица — В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql | Muahahaha | PHP | 8 | 27.03.2008 11:17 |
| переписать из массива в линейный двунаправленный список чётные элементы массива | Black_Ak24 | Помощь студентам | 12 | 08.01.2008 00:44 |
Как вернуть массив строк C++?
Учи матчасть: массив из функции вернуть нельзя. Можно вернуть указатель на массив или структуру содержащую массив.
string arr[0] = func(exp);
Слева в этом выражении стоит массив из нуля элементов. Справа — указатель на string.
Что ты хотел этим выражением сказать?
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Программист на «си с крестами» и не только
ВНИМАНИЕ: У вас есть пара тонких мест.
РАЗ. не забудьте, что строковые литералы в Си — это нуль-терминированные строки, и «\0» по факту будет пустой строкой. Строку из одного нулевого символа можно загнать в string — например, конструктором string(begin, end) или s += ‘\0’, но не конструктором string(const char*).
ДВА. Этот static будет инициализирован при первом вызове. Второй вызов вернёт тот же массив.
ТРИ. Строчку лучше передавать как string *func(const string& s) <>
К делу. Массив — это довольно сложный объект, и возникает вопрос: кто этим массивом будет владеть после того, как он покинет пределы функции?
1. Владеет система времени выполнения. Это отлично ответил Роман, дам только ключевую строчку.
string* arr = func(exp);
НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ: если массив используется в чьих-то «конских» конструкторах-деструкторах статических объектов (из-за отсутствия модулей Си++ не позволяет установить на уровне языка порядок создания/уничтожения статических объектов).
2. Владеет какой-то объект.
string *func(string s)
НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ: ну, это уж разбирайтесь сами с этим объектом, сколько он будет жить и насколько долго он будет держать массив. В данном случае каждый новый вызов уничтожает старый массив. (Код корявый, потому что последний массив не уничтожается.)
3. Владеет тот, кто вызывает. Лучше для таких целей использовать какой-нибудь std::vector.
vector func(string s) < vectorr; r.reserve(3); r.push_back("qwe"); r.push_back(s); r.push_back(std::string()); return r; >
c++ возврат char из функции
(1) Ваша программа будет иметь неопределённое поведение, потому что возвращать из функции указатель на локальную переменную нельзя. После выхода из функции участок памяти, занятый локальной переменной, освобождается и может быть использован системой для чего угодно. Если Вам повезёт и система ещё не успеет переиспользовать этот участок памяти, то Вы даже можете получить правильные результаты. Но полагаться на это нельзя. Если Вы уж обязательно хотите вернуть из функции char *, то надо внутри функции аллокировать память с помощью оператора new (ну или malloc, если в С) . Пример Вам привёл DarkLostSoul.
(2) Сама идея возвращения char * из функции совершенно не соответствует духу С++. Это штучки из С. В С++ надо избегать манипуляций низкого уровня, к котором относятся и манипуляции с char *. Вместо этого надо работать с std::string, классом, который для того и создан, чтобы облегчить жизнь и избежать многочисленных ошибок (вроде Вашей) , которые так легко сделать в низкоуровневых операциях.