передача в функцию массива по ссылке
От: Аноним  
Дата: 15.06.06 13:58
Оценка:
Собственно как?
Re: передача в функцию массива по ссылке
От: Roman Odaisky Украина  
Дата: 15.06.06 14:10
Оценка:
X foo(Y (&array)[N]);

или

typedef Y array_t[N];
X foo(array_t& array);

В отличие от передачи массива обычным образом, N имеет значение. Если оно может быть разным, его можно сделать шаблонным параметром.

P. S. rsdnsearch://ARRAY_LENGTH.
До последнего не верил в пирамиду Лебедева.
Re[2]: передача в функцию массива по ссылке
От: Аноним  
Дата: 15.06.06 14:43
Оценка: :)
Здравствуйте, Roman Odaisky, Вы писали:

RO>
RO>X foo(Y (&array)[N]);

RO>или

RO>typedef Y array_t[N];
RO>X foo(array_t& array);
RO>

RO>В отличие от передачи массива обычным образом, N имеет значение. Если оно может быть разным, его можно сделать шаблонным параметром.

RO>P. S. rsdnsearch://ARRAY_LENGTH.


ОГО!
а я думал что имя массива и естть адресс первого его элемента
в общем учите си!
Re[3]: передача в функцию массива по ссылке
От: vip_delete  
Дата: 15.06.06 22:20
Оценка:
во первых, можно передавать по ссылке и по значению
очевидно, массив по значению передать нельзя никак.

я делаю так:
void myfunc(int *a)
{
        for(int i=0;i<100;++i)a[i]=i;
}
void main()
{
        int a[100];
        myfunc(a);
}
Re[4]: передача в функцию массива по ссылке
От: Ubivetz Украина  
Дата: 16.06.06 06:59
Оценка:
Здравствуйте, vip_delete, Вы писали:

_>во первых, можно передавать по ссылке и по значению

_>очевидно, массив по значению передать нельзя никак.

_>я делаю так:

_>
_>void myfunc(int *a)
_>{
_>        for(int i=0;i<100;++i)a[i]=i;
_>}
_>void main()
_>{
_>        int a[100];
_>        myfunc(a);
_>}
_>

В отличие от Паскаля это так и есть.
И всё равно как объявить myfunc- результат один и тот же:

void myfunc(int a[]);
void myfunc(int a[100]);
void myfunc(int *a);
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re[5]: передача в функцию массива по ссылке
От: remark Россия http://www.1024cores.net/
Дата: 16.06.06 07:18
Оценка:
Здравствуйте, Ubivetz, Вы писали:

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


_>>во первых, можно передавать по ссылке и по значению

_>>очевидно, массив по значению передать нельзя никак.

_>>я делаю так:

_>>
_>>void myfunc(int *a)
_>>{
_>>        for(int i=0;i<100;++i)a[i]=i;
_>>}
_>>void main()
_>>{
_>>        int a[100];
_>>        myfunc(a);
_>>}
_>>

U>В отличие от Паскаля это так и есть.
U>И всё равно как объявить myfunc- результат один и тот же:

U>
U>void myfunc(int a[]);
U>void myfunc(int a[100]);
U>void myfunc(int *a);
U>


Это С-стиль. Он не совсем типобезопасный. В С++ большой интерес представляет такое объявление функции (тут результат уже другой — не теряем информацию о типе, а именно о размере):

template<typename T, size_t N>
void foo(T (&array)[N])
{
  for (size_t i = 0; i < N; ++i)
    array[i] = T();
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: передача в функцию массива по ссылке
От: _ALeRT_  
Дата: 16.06.06 10:21
Оценка:
Здравствуйте, remark, Вы писали:

R>Это С-стиль. Он не совсем типобезопасный. В С++ большой интерес представляет такое объявление функции (тут результат уже другой — не теряем информацию о типе, а именно о размере):


R>
R>template<typename T, size_t N>
R>void foo(T (&array)[N])
R>{
R>  for (size_t i = 0; i < N; ++i)
R>    array[i] = T();
R>}
R>


Извините за оффтоп, а как реализовать подобную типобезопасную функцию, если она должна быть виртуальным членом класса?
Небезопасный вариант:
class A
{
  virtual void foo(char* array);
};
Re[7]: передача в функцию массива по ссылке
От: remark Россия http://www.1024cores.net/
Дата: 16.06.06 10:26
Оценка: 37 (2)
Здравствуйте, _ALeRT_, Вы писали:

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


R>>Это С-стиль. Он не совсем типобезопасный. В С++ большой интерес представляет такое объявление функции (тут результат уже другой — не теряем информацию о типе, а именно о размере):


R>>
R>>template<typename T, size_t N>
R>>void foo(T (&array)[N])
R>>{
R>>  for (size_t i = 0; i < N; ++i)
R>>    array[i] = T();
R>>}
R>>


_AL>Извините за оффтоп, а как реализовать подобную типобезопасную функцию, если она должна быть виртуальным членом класса?

_AL>Небезопасный вариант:
_AL>
_AL>class A
_AL>{
_AL>  virtual void foo(char* array);
_AL>};
_AL>


Определение размера массива — не варьируемая часть. Следовательно, зачем её вообще вносить в виртуальную функцию?

class A
{
  public:
    template<size_t Size>
    void foo(int (&array)[Size])
    {
      foo_impl(array, Size);
    }

  private:
    virtual void foo_impl(int* array, size_t size)
    {
      //...
    }
};



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: передача в функцию массива по ссылке
От: Roman Odaisky Украина  
Дата: 16.06.06 10:49
Оценка:
Здравствуйте, remark, Вы писали:

R>Определение размера массива — не варьируемая часть. Следовательно, зачем её вообще вносить в виртуальную функцию?


R>
class A
{
  public:
    template<size_t Size>
    void foo(int (&array)[Size])
    {
      foo_impl(array, Size);
    }

  private:
    virtual void foo_impl(int* array, size_t size)
    {
      //...
    }
};

+1! NVI rulez!

Только эта foo не будет работать с обыкновенными указателями. Даже так не будет: A().foo((int *)array). Хорошо бы еще добавить перегрузку foo с тем же прототипом, что и у foo_impl, тогда, кстати, можно будет работать с частью массива... впрочем, так мы в конце концов придем к template <class InputIterator> void foo(...
До последнего не верил в пирамиду Лебедева.
Re[9]: передача в функцию массива по ссылке
От: remark Россия http://www.1024cores.net/
Дата: 17.06.06 13:30
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Только эта foo не будет работать с обыкновенными указателями. Даже так не будет: A().foo((int *)array). Хорошо бы еще добавить перегрузку foo с тем же прототипом, что и у foo_impl, тогда, кстати, можно будет работать с частью массива... впрочем, так мы в конце концов придем к template <class InputIterator> void foo(...


Если нужно, то можно просто открыть функцию foo_impl(). Хотя я лично считаю, что чем больше ограничений, тем лучше.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.