forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Передача массива в функцию по ссылке (http://forum.boolean.name/showthread.php?t=16742)

Mind 03.05.2012 20:31

Передача массива в функцию по ссылке
 
Мне нужно передать одномерный массив вектора в функцию по ссылке. Каким образом я могу это сделать?

HolyDel 03.05.2012 20:48

Ответ: Передача массива в функцию по ссылке
 
кодом бы записал.

наверное так:
Код:

void myfunc(const vector<int> *vectors,int num_vectors)
{
}


Mind 03.05.2012 21:56

Ответ: Передача массива в функцию по ссылке
 
Цитата:

Код:

void myfunc(const vector<int> *vectors,int num_vectors)
{
}


Зачем const если я хочу переписать массив в функции? Или это никак ни связанно?

А скажем я использую стандартную структуру DIRECTX для 3д вектора - D3DXVECTOR3.
Как в таком случае передать одномерный массив в функцию по ссылке?
Так? :
Код:

void myfunc(D3DXVECTOR3<int> *arr,int size_arr)
{
....
}

А как быть с двумерным?

HolyDel 03.05.2012 22:17

Ответ: Передача массива в функцию по ссылке
 
а. такой вектор...

Код:

void myfunc(D3DXVECTOR3 *arr,int size_arr)
{
....
}

с двухмерным так:
Код:

void myfunc(D3DXVECTOR3 *arr,int size_arr_x,int size_arr_y)
{
....
}


Mind 03.05.2012 23:41

Ответ: Передача массива в функцию по ссылке
 
Цитата:

а. такой вектор...

Код:

void myfunc(D3DXVECTOR3 *arr,int size_arr)
{
....

}
т.е. если так, то все должно работать, да:

Код:

....
....
void myfunc(D3DXVECTOR3* arr,int size)
{
    if(size>2)
    {
    arr[2]->x=1;
    arr[2]->y=2;
    arr[2]->z=3;

    }
}
....
....
D3DXVECTOR3 V[10];
....
myfunc(V[10],10);

Не выдаст ли компилятор ошибку при таком коде? Правильно я записал то что выделено?

HolyDel 04.05.2012 00:20

Ответ: Передача массива в функцию по ссылке
 
выдаст.

Код:

myfunc(V,10);

impersonalis 04.05.2012 01:35

Ответ: Передача массива в функцию по ссылке
 
Цитата:

Зачем const если я хочу переписать массив в функции? Или это никак ни связанно?
В таком случае может быть целесообразно сделать константным сам указатель (элементы при этом менять можно)
Код:

void myfunc(vector<int> *const vectors,int num_vectors)
Имя массива и есть указатель на начало массива (иными словами - массив всегда "передаётся по ссылке").
Помимо вариантов HolyDel, в которых синтаксически явно подчёркивается "адресная природа" массива, можно использовать и другое описание, соответственно:
Код:

void myfunc(D3DXVECTOR3 arr[size_arr])
где size_arr константа, или:
Код:

void myfunc(D3DXVECTOR3 arr[])
;
для двумерного:
Код:

void myfunc(D3DXVECTOR3 arr[size_arr_x][size_arr_y])
где size_arr_x и size_arr_y константы, или
Код:

void myfunc(D3DXVECTOR3 arr[][size_arr_y])
где size_arr_y константа.

Mind 04.05.2012 15:15

Ответ: Передача массива в функцию по ссылке
 
Цитата:

для двумерного:

Код:

void myfunc(D3DXVECTOR3 arr[size_arr_x][size_arr_y])
где size_arr_x и size_arr_y константы, или

Код:

void myfunc(D3DXVECTOR3 arr[][size_arr_y])
где size_arr_y константа.
Если size_arr_y - константа, то её нужно объявлять вне функции, а это не делает функцию универсальной!

Как можно сделать что-то вроде этого:
Код:

void myfunc(D3DXVECTOR3 arr[x][y])
{
  for(int i=0;i<=x;i++)
  {
        for(int j=0;j<=y;j++)
        {
            arr[i][j].x=1;
            arr[i][j].y=2;
            arr[i][j].z=3;
        }
  }
}

Только так чтобы компилятор не ругался?

HolyDel 04.05.2012 17:01

Ответ: Передача массива в функцию по ссылке
 
Код:

#include <iostream>
#include <vector>
using namespace std;

struct D3DXVECTOR3
{
        float x,y,z;
};


void _myfunc(D3DXVECTOR3 *arr,int x, int y)
{
  for(int i=0;i<x;i++)
  {
        for(int j=0;j<y;j++)
        {
            arr[i*y + j].x=i;
            arr[i*y + j].y=j;
            arr[i*y + j].z=i+j;
        }
  }
}

template<class T, int x, int y>
void myfunc(T (&arr)[x][y])
{
        _myfunc(arr[0],x,y);
}

int main()
{
        const int x = 10;
        const int y = 20;

        D3DXVECTOR3 arr[x][y];

        myfunc(arr);

  for(int i=0;i<x;i++)
  {
        for(int j=0;j<y;j++)
        {
            std::cout<<arr[i][j].x<<" "<<arr[i][j].y<<" "<<arr[i][j].z<<std::endl;
        }
                std::cout<<std::endl;
  }

  std::cin.get();
}


Mind 04.05.2012 18:40

Ответ: Передача массива в функцию по ссылке
 
HolyDel благодарю, заработало.
Еще вопросик:
дан массив arr[20][20] - какие ячейки в нем нельзя заполнять? Только [20;20] или [19;20], или [20;17] (к примеру)?

HolyDel 04.05.2012 19:09

Ответ: Передача массива в функцию по ссылке
 
20 это уже 21 элемент. нельзя 20.


Часовой пояс GMT +4, время: 13:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot