Re[2]: Передать массив из функции
От: MasterZiv СССР  
Дата: 30.06.10 15:24
Оценка:
Анатолий Широков wrote:

> int* myfunc(int *dst, const int *src, size_t s)

> {
> for(size_t i = 0; i < s; i++)
> dst[i] = src[i];
> return dst;
> }
Posted via RSDN NNTP Server 2.1 beta
Re: Передать массив из функции
От: meandr  
Дата: 30.06.10 19:25
Оценка:
Передать массив из функцииГрубо говоря массив a был создан в стеке, когда произошел выход из функции стек свернулся и сооветсвенно объект вместе с ним уничтожился и на его месте уже может лежать мусор(а может и не лежать тут уже как карта ляжет), поэтому как тут правильно заметили память нужно выделить динамически, или же вопользоватся STL типами, которые сделают всю работу за нас
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Передать массив из функции
От: gear nuke  
Дата: 01.07.10 02:29
Оценка: :)
Здравствуйте, art_kuz, Вы писали:

_>супер си-шный вариант


Думаешь, такое будет быстрее?
typedef std::array<long, 200> myarray;

myarray myfunc(long*  b)
{
  myarray a;
  for (int i=0;i<200;i++)
    a[i]=b[i];
  return a;
}
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: Передать массив из функции
От: gear nuke  
Дата: 01.07.10 03:02
Оценка: +1
Здравствуйте, s.ts, Вы писали:

ST>сразу скажу, что мы говорим, конечно, про "pure c".

ST>и тут скорее проще поставить вопрос иначе: какие плюсы у других реализаций ?
ST>ответ: только реентерабельность.

Еще и удешевление сопровождения кода. Ужасное количество С кода написано в таком стиле, и для переиспользование приходится передалывать. Код Васи Пупкина можно и не рессматривать, взять старндатную библиотеку С — фукнции вроде gmtime сейчас стали не юзабельны. gmtime_r, или gmtime_s есть не везде. Что далеть то с такими хорошими решениями? Делают даже такие костыли как по отдельному процессу вместо каждого потока

И это еще простая ситуация, когда о проблеме с нереентерабельностью функций заранее известно, а бывает что о таких статиках выясняют после длительного дебага, когда ошибка трудновоспроизводима
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Передать массив из функции
От: rg45 СССР  
Дата: 01.07.10 03:42
Оценка: +4
Здравствуйте, dabeat_bf, Вы писали:

_>Здравствуйте, monax, Вы писали:

M>>Нельзя так делать, это глобальная переменная получится.

_>явно не глобальная.


Давайте-ка разберемся с тем, что такое "глобальная переменная", потому как ни в C, ни в C++ языках нет такого понятия. А в место этого есть набор свойств, которыми можно характеризовать любую переменную:

В данном случае, массив, объявленный в теле функции с ключевым словом static, является объектом с локальной областью видимости (local scope), статическим классом памяти (static storage duration), без связывания (no linkage).

Теперь давайте решим, какие характеристики являются существенными для нас в данном случае, а какие не очень. По-моему, область видимости и тип связывания нашего массива в данном случае не имеют принципиального значения. А вот область памяти, в которой он расположен, является важной характеристикой. Взвесим все "за" и "против".
Преимущества:
И все.

Недостатки:
С учетом того, что единственное достоинство такого подхода можно достичь массой других способов, ИМХО, вывод в данном случае напрашивается сам собой — это не тот случай, когда использование объектов со статическим временем жизни оправдан.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Передать массив из функции
От: slava_phirsov Россия  
Дата: 02.07.10 09:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Уже было...
Автор: slava_phirsov
Дата: 09.04.10
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[2]: Передать массив из функции
От: slava_phirsov Россия  
Дата: 02.07.10 09:07
Оценка:
Здравствуйте, rm822, Вы писали:

R>
R>std::vector<int> myfunc(int *b)
R>{
R>  std::vector<int> a; 
R>  a.resize(200);

R>  for (int i=0;i<200;i++)
R>    a[i]=b[i];
R>  return a;
R>}
R>


Вообще-то у std::vector другие конструкторы есть, помимо explicit vector::vector (const Allocator& = Allocator());
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: Передать массив из функции
От: Mak_71_rus Россия  
Дата: 02.07.10 17:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет, необходимо передать массив заданный в функции:

А>int* myfunc(int *b)
А>{
А>int i;
А>long a[200];

А>for (i=0;i<200;i++)

А>a[i]=b[i];
А>return a;
А>}
А>Подскажите, почему возвращаются только первые несколько элементов, как исправить? Заранее спасибо.

a — это всего лишь указатель на long, а не массив. Вы пытаетесь вернуть локальный массив, т.е. такой память для которого выделяется при входе в функцию и удаляется при выходе из неё. Поэтому нет никакой гарантии, что по указателю, возвращённому из функции находится то, что нужно. Там может находиться всё что угодно!

Для того чтобы решить проблему можно:
1) зарезервировать память под массив в вызывающей функции, а в функцию myfunc передать уназатель на него:

myfunc(int *b, long* a)


2) воспользоваться механизмом динамического резервирования памяти:


long *a = new long[200]


и точно также вернуть
return a;


Теперь есть гарантия того, что, обращаясь по указателю a вы найдёте свой массив. Главное не забудьте его удалить, когда он станет вам не нужен!


delete [] a;


PS: ну чё, народ, вы ржёте? Сами небось по началу над подобным парились.
Re[9]: Передать массив из функции
От: s.ts  
Дата: 05.07.10 01:21
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, s.ts, Вы писали:


ST>>сразу скажу, что мы говорим, конечно, про "pure c".

ST>>и тут скорее проще поставить вопрос иначе: какие плюсы у других реализаций ?
ST>>ответ: только реентерабельность.

GN>Еще и удешевление сопровождения кода. Ужасное количество С кода написано в таком стиле, и для переиспользование приходится передалывать. Код Васи Пупкина можно и не рессматривать, взять старндатную библиотеку С — фукнции вроде gmtime сейчас стали не юзабельны. gmtime_r, или gmtime_s есть не везде. Что далеть то с такими хорошими решениями? Делают даже такие костыли как по отдельному процессу вместо каждого потока


GN>И это еще простая ситуация, когда о проблеме с нереентерабельностью функций заранее известно, а бывает что о таких статиках выясняют после длительного дебага, когда ошибка трудновоспроизводима


ты не то удалил/оставил для ответа
а то потом выясняется, что "из всех искусств для нас важнейшим является кино"(c)
если смотреть мой мессадж целиком, то:

сразу скажу, что мы говорим, конечно, про "pure c".
и тут скорее проще поставить вопрос иначе: какие плюсы у других реализаций ?
ответ: только реентерабельность.

т.е. если нет многопоточных вызовов, то static — это хорошее решение.
реентерабельное решение в чистом си сразу влечет дополнительные сложности реализации и использования.
потому многие чисто сишные функции именно так и реализованы — через static.
как-то так.

Re[10]: Передать массив из функции
От: gear nuke  
Дата: 05.07.10 05:40
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>ты не то удалил/оставил для ответа


Я удалил несущественное. Если сейчас "нет многопоточных вызовов", то завтра они появятся, и решение окажется негодным — поэтому поддержка кода и увеличивается в цене.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.