Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.mmonline.ru/forum/read/7/24964/
Дата изменения: Mon Apr 11 15:41:42 2016
Дата индексирования: Mon Apr 11 15:41:43 2016
Кодировка: Windows-1251
MMOnline | Форумы | Разное | Вопрос по языку Си (от чайника)

Вопрос по языку Си (от чайника)

Автор темы gecko 
21.09.2002 22:38
Вопрос по языку Си (от чайника)
Люди подскажите плиз может ли функция в языке Си (не ++) возвращать массив?
Конкретно, мне нужно написать функцию для вычисления суммы двух векторов. ее аргументы - два массива, и возвращать она по идее должна массив.
Если так можно, то как это написать? Если нельзя, то как правильно это сделать? Спасибо.
22.09.2002 00:04
koh
Например, вот так!
Массив она вернуть, конечно не может, но может вернуть указатель на массив. Вот действующий пример сложения двух массивов известной длины.

#include<iostream.h>
double *sum(int n, double *a, double *b)
{
int i;
double *d;
d=new double[n+1];
for(i=0;i<n;i++)d=a+b;
return d;
}
void main()
{
double aa[]={1.,3.1,13.,14.};
double bb[]={4.,4.4,3.5,7.};
double *cc;
int nn,i;
nn=sizeof(aa)/sizeof(aa[0]);
cc=sum(nn,aa,bb);
for(i=0;i<nn;i++)cout << cc << " ";
}
22.09.2002 12:24
Lynx
Уважаемый koh не ответил на вопрос
Его пример написан на C++, а не на C.

int *sum(int *v1, int *v2, int n)
{
int i;
int *summa=malloc(n*sizeof(int));
for(i=0; i<n; i++)
sum=v1+v2;
return summa;
}

После использования функции sum нужно освободить динамически выделенную память по адресу, возвращенному функцией sum:
нужно передать этот адрес функции free(void *).

Конечно, на C++ работа с массивами выглядит изящней.
Сложность в том, что массивы в C не знают свой размер
(кроме специального случая символьных массивов-строк, заканчивающихся нулевым символом; этот символ отмечает конец массива).

Мне кажется, лучше заранее подготовить массив, в котором будет размещена сумма, его адрес передать в суммирующую функцию вместе с адресами массивов-слагаемых, использовать результат сложения, и освободить память.
23.09.2002 10:55
plop
Bugs
Вот тока надо учитывать, что при выходе из функции место, которое занимал "виртуальный" массив (который в функции создается), может быть сразу чем-нить загажено..... так что лучше имхо использовать в ф-ии 3 массива:

int sum(int n, double* a, double* b, double* c)
{
for(;n>=0;n--) c[n]=a[n]+b[n];
return 1;
}
23.09.2002 18:51
Замечание не совсем верное!
plop, мне показалось, что вы не очень глубоко знаете Си.

> Вот тока надо учитывать, что при выходе из функции место, которое
> занимал "виртуальный" массив (который в функции создается), может
> быть сразу чем-нить загажено

В Си нет сборки мусора, и память выделенная функцией malloc() может быть удалена только Пользователем, но никак не системой, причем в независимоcти от того где эта память была выделена.
Но по идеологическим соображениям лучш выделать и освобождать память "на одном уровне", тогда минимизируется вероятность забыть вернуть память.

И во вторых, нет необходимости возвращать из функции только одно значение: 1, лучше сделать ее типа void.
26.09.2002 00:36
Большое всем спасибо!
Спасибо за ценные советы, я разобрался :)
26.10.2002 08:44
Из другого ВУЗа
void
> И во вторых, нет необходимости возвращать из функции только
> одно значение: 1, лучше сделать ее типа void.

Простите, вмешаюсь в Ваш разговор.
В С не желательно, чтобы функция возвращала значение void. Потому что изначально разработчики языка такого вообще не предполагали - все функции должны были иметь определенное значение (почитайте Кернигана и Ритчи более старых выпусков, к примеру 85-ого). Так что во-первых, это лучше ложится в идеалогию языка, а во вторых с Вашей программой может работать другая программа, которая ожидает от нее каких-то результатов. Возможно это будет старенькая юниксовая программка, которая написана без учета существования void. Конечно наврно глупо писать с учетом такого "старья" но все же хотелось бы, чтобы программы были совместимы друг с другом не зависомо от года выпуска. Ну не трудно же вернуть 1 или 0 вместо void... Да и пишется короче...
Извините, только зарегистрированные пользователи могут публиковать сообщения в этом форуме.

Кликните здесь, чтобы войти