Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » передача структури в функцию

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

lodya

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как мне передать структуру в функцию ???????

Всего записей: 115 | Зарегистр. 30-05-2004 | Отправлено: 20:07 10-10-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
езык то какой ?
передавай указатель на структуру (если C/C++/Pascal/Asm)

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 10:48 11-10-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Структура передается как и любая другая переменная. То есть или копированием, или по ссылке, или через указатель. Это выглядит так:
 
struct ST
{
int m;
//...
};
 
void f(ST s) // Копированием
{
// Все изменения в s останутся внутри функции пока она выполняется
}
 
procedure f(s : ST);
begin
{ Аналог для паскаля }
end;
 
void f(ST& s) // По ссылке (только в C++!)
{
// Все изменения произойдут будут действительны и после завершения функции
}
 
procedure f(var s : ST);
begin
{ Аналог для паскаля }
end;
 
void f(ST* s)
{
// Вариант 2 с указателем, однако обращение к членам структуры выглядит так:
s->m;
// Или так:
(*s).m;
}
 
Передача указателя или ссылки экономит время и память на копирование, но изменение приведет к (возможно ненужному) изменению исходных данных. В C++ этого можно избежать:
 
void f(const ST& s)
{
// Теперь всякая перезапись членов приведет ошибке компиляции.
}  
 
 

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 14:19 11-10-2004
lodya

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как если мне нужно передать в функцию двухмерний масив структур ?????
простой двухмерний масив  я мог,у а такой не виходит !!!!!!!!

Всего записей: 115 | Зарегистр. 30-05-2004 | Отправлено: 09:11 12-10-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lodya

Цитата:
простой двухмерний масив  я мог,у а такой не виходит !!!!!!!!

а какая разница?
struct ST{};
ST vec[10][20];
void f(ST * v;size_t size1;size_t size2){};
f(&vect[0][0],10,20);
или еще лучше использовать std::vector<std::vector<ST> > или матрицы из boost

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 11:51 12-10-2004 | Исправлено: WiseAlex, 11:51 12-10-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lodya
Главное - не забудь принципиальное место в посте TheChampionа:

Цитата:
Передача указателя или ссылки экономит время и память на копирование, но изменение приведет к (возможно ненужному) изменению исходных данных.

Т.е ты должен четко определиться - что тебе надо после выполнения функции.

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 18:42 12-10-2004
lodya

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а можно штоб работать с масивом в функции в нормальном виде - [i][j], а то способе описаним више нужно писать што вроде [i*nstr+j]

Всего записей: 115 | Зарегистр. 30-05-2004 | Отправлено: 13:17 13-10-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lodya

Цитата:
нормальном виде - [i][j],  

с чистым синтаксисом нельзя  - т.е. без использования классов, а с использованием классов нет проблем - см. мой пост выше

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:57 13-10-2004
lodya

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как мне зделать такое: мне нужна рекурсивная функция, каторая имеет в всписке аргументов  имеет масив.
fun(int *mas) {
....
fun( !!!!!!!!!!!! не знаю што здесь написать !!!!!!!)  
}
 
 
 
int main(){
..
int mas[i][j] = {.........};
..
 
fun(&mas[0][0])

Всего записей: 115 | Зарегистр. 30-05-2004 | Отправлено: 10:53 16-10-2004
CamTracer

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Уважаемый, вам лучше для начала почитать что-нить по сям. Рекомендую любое издание Кернигана и Ричи. И Страуструпа по С++.

Всего записей: 264 | Зарегистр. 07-07-2004 | Отправлено: 10:59 16-10-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lodya

Цитата:
как мне зделать такое:

Вам надо сделать то, что советует CamTracer...  

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 11:10 16-10-2004
lodya

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я читал( канечно не именно ето)
просто я думаю што  я делаю  правильно а оно не виходит !!!
и в инети нге могу найти  
помогите , просто оно мне очень нужно  
 
Добавлено
УРА !!!!!!!!!!
я уже сделал

Всего записей: 115 | Зарегистр. 30-05-2004 | Отправлено: 11:25 16-10-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lodya

Цитата:
я уже сделал  

Так больше пользы.

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 14:20 16-10-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как копированием передать в функцию массив?

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 14:35 16-10-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
odl455

Цитата:
А как копированием передать в функцию массив?  


Код:
#include <iostream>
using namespace std;
void func( int arr[10] )
{
  cout << arr[6] << endl;
}
 
int main()
{
  int arr[10];
  for (int i = 0; i < 10; i++)
  {
    arr[i] = i;
  }
  func( arr );
  return 0;
}

Если размер массива не известен, то лучше использовать vector.

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 16:18 16-10-2004 | Исправлено: Swappp, 16:19 16-10-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp
 
ууу. клёво. что-то мне такой вариант в голову не пришёл старею видать

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 10:58 18-10-2004
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp
 
То, что вы написали -- бред, а не копирование массива. Этот пример опровергает вашу мысль.
 
#include <iostream>
 
void f(int arr[10])
{
  for(int i = 0; i < 10; i++)
    arr[i] = i + 25;
}
 
int main(void)
{
  int arr[10];
  for(int i = 0; i < 10; i++)
    arr[i] = 200 - i;
  for(int i = 0; i < 10; i++)
    std::cout << arr[i] << std::endl;
  f(arr);
  for(int i = 0; i < 10; i++)
    std::cout << arr[i] << std::endl;
  return 0;
}
 
Впрочем, ничего удивительного. Имя массива само является указателем.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 17:30 18-10-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
 
ага. тогда вопрос к Вам
возможно ли передать массив в функцию по значению?

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 18:16 18-10-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
odl455
насколько я знаю только через классы

----------
Если не я за себя, то кто за меня?
Если я только сам по себе - что я?
И если не теперь, то когда? (Гилель)

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 18:20 18-10-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
Да, действительно...

Код:
#include <iostream>
#include <vector>
using namespace std;
 
void f(vector<int> arr)
{
  for(int i = 0; i < 10; i++)
    arr[i] = i + 25;
}
 
int main(void)
{
  vector<int> arr(10);
  for(int i = 0; i < 10; i++)
    arr[i] = 200 - i;
  for(int i = 0; i < 10; i++)
    std::cout << arr[i] << std::endl;
  f(arr);
  for(int i = 0; i < 10; i++)
    std::cout << arr[i] << std::endl;
  return 0;
}

Так лучше хотя не совсем то.

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 21:39 18-10-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » передача структури в функцию


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru