Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как возвратить из функции массив?

17K
11 декабря 2006 года
Soda
8 / / 17.07.2006
Всем привет.

Есть функция, которая читает строку из файла.
типа
 
Код:
void fileread(FILE *f, char *readbuff)
тоесть читает из файла и записывает результат в readbuff.

А как сделать так чтобы эта функция возвращала эту чтроку. Тоесть передаем ей только указатель на файл, а она возвращает прочитанную строку? Что-то я попробовал и так и сяк - и не добился толка.

Спасибо
2
11 декабря 2006 года
squirL
5.6K / / 13.08.2003
функция - меняет эту строку. так что по окончании работы в *readbuf - должна быть измененная строка. можешь считать это возвратом. так работают половина С-шных функций стандартных. кроме того - можно возвращать сам указатель на строку.
274
11 декабря 2006 года
Lone Wolf
1.3K / / 26.11.2006
Но в таком случае, надо быть ьвнимательым, что ы эта строка не была обьявлена внутри функции. Обычно возвращаетсья тот-же указатель, что и в аргументах передается
 
Код:
char *fileread(FILE *f, char *readbuff) {
...........................
return readbuff;
}
17K
11 декабря 2006 года
Soda
8 / / 17.07.2006
Может я что-то не то несу :)
Но я имел ввиду следующее, можно ли ту же функцию оформить так
 
Код:
char *fileread(FILE *f){
.........................
return my_string;
}
так она вроде должна возвратить строку сама по себе, тоесть так она будет реально функцией а не процедурой (в паскальном смысле). Такая вот сумасшедшая мысль =)
Возможно такое вооще, чтоб это можно было не сильно по-извращенски реализовать?
2
12 декабря 2006 года
squirL
5.6K / / 13.08.2003
ну естественно можно!
Код:
char *fn()
{
    char* in_fn_str;
    strncpy(in_fn_str, "abcd", 5);

    return in_fn_str;
}

int main()
{
    char *str = fn();
    printf("%s\n", str);
    return 0;
}
274
12 декабря 2006 года
Lone Wolf
1.3K / / 26.11.2006
естествено нельзя.
переменая прекрати свое существование, как только программа покинет функцию fn. т.е никто не знает. что будет находится по тому адрессу ,который вернет функция спустя некоторе время.
309
12 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата: Lone Wolf
естествено нельзя.
переменая прекрати свое существование, как только программа покинет функцию fn. т.е никто не знает. что будет находится по тому адрессу ,который вернет функция спустя некоторе время.


Это произойдёт, только если массив будет храниться в стеке. А вообще, символьные массивы формируются в "куче".

 
Код:
char *fileread(FILE *f)
{
   char *my_string = (char*) malloc (sizeof (char) * Длина_Строки); // Выделяем область памяти
//.........................
   return my_string; // Возвращаем указатель на неё
}
//..............
// Использование без присвоения результата
filedear (File); // Утечка памяти

Но здесь имеется большие вилы: выделенную память требуется освобождать. А вот с этим очень часто бывают проблемы: достаточно вызвать функцию без явного присвоения результата, и мы получим утечку памяти.
Вообще, то функции, которые в качестве результата возвращают указатели на создаваемые объекты, использовать не рекомендуется. Куда лучше следующий код
Код:
int fileread(FILE *f, char **Data)
{
   if (Data)
   {
      *Data = (char*) malloc (sizeof (char) * Длина_Строки);
// Выделяем область памяти
//.........................
   }
   return Длина_Строки; // Возвращаем размер
}
//...............
// Использование
char *My_String = NULL; // Объявляем указатель
int Length = FileRead (File, &My_String); // Считываем данные
3
12 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: Soda
Всем привет.

Есть функция, которая читает строку из файла.
типа
 
Код:
void fileread(FILE *f, char *readbuff)
тоесть читает из файла и записывает результат в readbuff.

А как сделать так чтобы эта функция возвращала эту чтроку. Тоесть передаем ей только указатель на файл, а она возвращает прочитанную строку? Что-то я попробовал и так и сяк - и не добился толка.

Спасибо



Это должен быть C или C++ ?
Если C, то наиболее правильным будет все так же:

 
Код:
char* fileread(FILE *f, char *readbuff)
{
  ..................
  return readbuff;
}

другие варианты будут весьма спорными.

Если ты используешь С++, то можно вернуть объект, например, контейнер или строку:
Код:
string fileread(FILE *f)
{
  string str;
  ..................
  return str;
}

vector fileread(FILE *f)
{
  vector buff;
  ..................
  return buff;
}

Хотя в этом случае я бы использовал не FILE, а ifstream.
17K
12 декабря 2006 года
Soda
8 / / 17.07.2006
Ребята, спасибо вам всем!
Все вами сказанное оказалось очень полезным (:
274
12 декабря 2006 года
Lone Wolf
1.3K / / 26.11.2006
2el scorpio
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя.
309
13 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата: Lone Wolf
2el scorpio
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя.


Что это было????
Участок в "куче" может быть отмечен как "свободный" только в двумя способами - функцей free или командой delete.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог