Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

Передача всего массива в функцию - C++

21.08.2013, 15:05. Просмотров 819. Ответов 28
Метки нет (Все метки)

Начал изучать алгоритмы сортировки и поиска, решил сделать программу для тестирования работы сортировки и поиска на производительность, по времени (по нагрузке на ЦП и ОП пока что мозгов не хватает).
И возникла проблема, вот я из своей программы выделил новую программу, убрав весь лишний код, оставил только то, где происходит косяк:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream> 
using std::cin;
using std::cout;
using std::endl;
 
#include <time.h>
 
#include <windows.h>
 
const int dlina = 1000;
 
 
void One(const int *);
void Two(int *);
 
int main()
{
setlocale(LC_ALL,"");
 
int test[dlina];
 
for (int i = 0; i < dlina; i++ ) 
{ test[i] = (1 + rand() % 1000); } 
 
One(test);
 
system("pause");
return 0;
}
 
 
void One(const int *test1)
{
int temp[dlina];
*temp = *test1;
 
Two(temp);
}
 
 
void Two(int *test2)
{
for (int i = 0; i < dlina; i++ ) 
{ cout << test2[i] << " "; } 
cout << endl;
}


Я знаю что косяк происходит в строчке 37, что в Two передается что то не то, подскажите как сделать что бы передавалось нормально и подскажите почему возникает такой косяк, все в принципе сделано по аналогии с One, если взять код из строчек 43-45 и перенести в функцию One, а Two удалить, то все будет работать.


И еще вопрос, как я понял я в void One передаю ссылку на массив, т.е. если я в void One изменю полученный массив (test1) то у меня изменится и массив test из main, а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?

PS то, что я передаю не по ссылке, а передаю указатель в котором хранится адрес на массив test из main, я в курсе, для простоты я написал что передаю по ссылке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача всего массива в функцию (C++):

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...

Передача двухмерного массива из функцию в функцию - C++
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его передать в другую функцию, которая его выведет на экран. ...

Передача массива структур в функцию не указывая размера массива - C++
Я читаю с командной строки файл в котором содержится массив структур. Есть библиотека с функцией в которую я прередаю файл и массив...

передача массива в функцию - C++
у меня в мейне есть двумерный массив нужно его передать в дургую функцию как это сделать подскажите плиз

Передача массива в функцию - C++
Ребят, такая проблема закралась. По воле курсовика требуется запрогать алгоритм нахождения минимального многочлена рекуррентной...

С\С++ Передача в функцию 2 массива - C++
Всем доброго времени суток, при написание программы столкнулся с проблемой. void qs(int s_arr, int first, int last, int b) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
21.08.2013, 15:14 #2
Цитата Сообщение от VLK Посмотреть сообщение
C++
1
*temp = *test1;
Ты в курсе, что тут присвоение только первому элементу массива?
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 15:17  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты в курсе, что тут присвоение только первому элементу массива?
Теперь да. т.е. передавал я все нормально, косяк в присвоении, а как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 15:20 #4
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Зачем это нужно?
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
21.08.2013, 15:22 #5
Цитата Сообщение от VLK Посмотреть сообщение
как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
С обычными массивами - невозможно, используй std::array.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
21.08.2013, 15:22 #6
Цитата Сообщение от VLK Посмотреть сообщение
const int dlina = 1000;
от глобальных переменных надо отказываться. эффективнее передавать указатели на начало и конец последовательности - begin и end
C++
1
2
3
4
5
6
7
8
9
void Two(int *const begin, int * const end)
{
   int* iter = begin;
   while(iter != end)
   {
      std::cout << *iter;
      iter++;
   }
}
где как и в алгоритмах передавать begin - указатель на первый элемент, end указатель за последним элементом, а вообще передавать можно любые интервалы
S_O_A_D
1 / 1 / 0
Регистрация: 04.06.2013
Сообщений: 48
21.08.2013, 15:23 #7
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Ну тогда используйте
C++
1
std::vector
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 15:27  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем это нужно?
по аналогии с обычными переменными, там же для чего то это надо. Вообще интересуюсь на всякий случай, был удивлен, когда обнаружил что массив не копируется а передается в виде ссылки.

Цитата Сообщение от gray_fox Посмотреть сообщение
С обычными массивами - невозможно, используй std::array.
т.е. или
C++
1
2
for (int i=0; i < dlina; i++)
{ temp[i] = test1[i] }
или std::array? (хотя я пока не знаю что это)

Цитата Сообщение от S_O_A_D Посмотреть сообщение
Ну тогда используйте
C++
1
std::vector
пока что для простоты тестирование использую обыкновенный массив, мне с ним легче работать.
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
21.08.2013, 15:30 #9
Цитата Сообщение от VLK Посмотреть сообщение
т.е. или
for (int i=0; i < dlina; i++)
{ temp[i] = test1[i] }
или std::array? (хотя я пока не знаю что это)
Да, либо копировать поэлементно (ручками цикл писать или std::memcpy\std::copy), либо использовать контейнер (std::array (замена массивам по сути), std::vector и т.д.).
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 15:36  [ТС] #10
Цитата Сообщение от Кудаив Посмотреть сообщение
от глобальных переменных надо отказываться.
да я пытался устроить круговорот локальной константной переменной по функция, но что то не очень

Передача всего массива в функцию

при наведении на подчеркнутое пишет, что const int dlina должно иметь константное значение, юмор прямо.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 15:40 #11
Цитата Сообщение от VLK Посмотреть сообщение
при наведении на подчеркнутое пишет, что const int dlina должно иметь константное значение, юмор прямо
константное значение можно получить из константного выражения, то чно можно посчитать на этапе компиляции, const ни разу этого не делает, а лишь уберегает от изменения
C++
1
2
3
4
int a;
std::cin >> a;
const int b = a;
b = 5; //error
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 15:44  [ТС] #12
А что насчет передачи всего массива не по ссылке (указателю), а что бы в функции сделали копию всего массива? такое не возможно?
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
21.08.2013, 15:44 #13
Цитата Сообщение от VLK Посмотреть сообщение
юмор прямо.
создавай temp динамически
Jupiter
21.08.2013, 15:48
  #14

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
А что насчет передачи всего массива не по ссылке (указателю), а что бы в функции сделали копию всего массива? такое не возможно?
ответ уже дал gray_fox

VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
21.08.2013, 15:49  [ТС] #15
И еще вопрос, немного относящийся к теме, сортировка, я могу не парится в поисках оптимальных вариантов т.к. как я понимаю они все описаны тут - Алгоритмы сортировок ? а что бы придумать что то новое (стоящее) надо быть программистом с 30 летним стажем + профессором высшей математики ?

Или в каждом конкретном случае свое, по этому стоит писать свои тестировать их ну и т.д.?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 15:49
Привет! Вот еще темы с ответами:

Передача массива в функцию - C++
... int UnichtojenieFiguryMas( int *EnemyLocationXvalue, int z/* размер обоих массивов */, int *EnemyLocationYvalue, int Ocherednost ); ...

Передача массива в функцию - C++
Добрый день! Начал изучать C++ и столкнулся вот с какой проблемой. Я передаю массив в некоторую функцию. В конечном итоге передаваемый...

Передача массива в функцию - C++
Не знаю в чем проблема, почему-то в функции act()(это моя функция), итерации выполняются по два раза. Суть задания создать обратную...

Передача массива в функцию - C++
есть массив в методе какого то класса void _mServer::Listen() { .... ULONG s_c; s_c = (ULONG) this; s_c = (ULONG)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.08.2013, 15:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru