Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 03.05.2012, 20:31   #1
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Передача массива в функцию по ссылке

Мне нужно передать одномерный массив вектора в функцию по ссылке. Каким образом я могу это сделать?
(Offline)
 
Ответить с цитированием
Старый 03.05.2012, 20:48   #2
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Передача массива в функцию по ссылке

кодом бы записал.

наверное так:
void myfunc(const vector<int> *vectors,int num_vectors)
{
}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mind (03.05.2012)
Старый 03.05.2012, 21:56   #3
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: Передача массива в функцию по ссылке

void myfunc(const vector<int> *vectors,int num_vectors)
{
}
Зачем const если я хочу переписать массив в функции? Или это никак ни связанно?

А скажем я использую стандартную структуру DIRECTX для 3д вектора - D3DXVECTOR3.
Как в таком случае передать одномерный массив в функцию по ссылке?
Так? :
void myfunc(D3DXVECTOR3<int> *arr,int size_arr)
{
....
}
А как быть с двумерным?
(Offline)
 
Ответить с цитированием
Старый 03.05.2012, 22:17   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Передача массива в функцию по ссылке

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

void myfunc(D3DXVECTOR3 *arr,int size_arr)
{
....
}
с двухмерным так:
void myfunc(D3DXVECTOR3 *arr,int size_arr_x,int size_arr_y)
{
....
}
(Offline)
 
Ответить с цитированием
Старый 03.05.2012, 23:41   #5
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Сообщение Ответ: Передача массива в функцию по ссылке

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

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);
Не выдаст ли компилятор ошибку при таком коде? Правильно я записал то что выделено?
(Offline)
 
Ответить с цитированием
Старый 04.05.2012, 00:20   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Передача массива в функцию по ссылке

выдаст.

myfunc(V,10);
(Offline)
 
Ответить с цитированием
Старый 04.05.2012, 01:35   #7
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Передача массива в функцию по ссылке

Зачем 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 константа.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
HolyDel (04.05.2012), Mind (04.05.2012)
Старый 04.05.2012, 15:15   #8
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: Передача массива в функцию по ссылке

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

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;
        }
   }
}
Только так чтобы компилятор не ругался?
(Offline)
 
Ответить с цитированием
Старый 04.05.2012, 17:01   #9
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Передача массива в функцию по ссылке

#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();
}
(Offline)
 
Ответить с цитированием
Старый 04.05.2012, 18:40   #10
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: Передача массива в функцию по ссылке

HolyDel благодарю, заработало.
Еще вопросик:
дан массив arr[20][20] - какие ячейки в нем нельзя заполнять? Только [20;20] или [19;20], или [20;17] (к примеру)?
(Offline)
 
Ответить с цитированием
Старый 04.05.2012, 19:09   #11
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Передача массива в функцию по ссылке

20 это уже 21 элемент. нельзя 20.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com