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

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

Восстановить пароль Регистрация
 
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 15:05     Передача всего массива в функцию #1
Начал изучать алгоритмы сортировки и поиска, решил сделать программу для тестирования работы сортировки и поиска на производительность, по времени (по нагрузке на ЦП и ОП пока что мозгов не хватает).
И возникла проблема, вот я из своей программы выделил новую программу, убрав весь лишний код, оставил только то, где происходит косяк:

Кликните здесь для просмотра всего текста
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++ Передача массива в функцию
Передача массива структур в функцию не указывая размера массива C++
Передача массива в функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.08.2013, 15:14     Передача всего массива в функцию #2
Цитата Сообщение от VLK Посмотреть сообщение
C++
1
*temp = *test1;
Ты в курсе, что тут присвоение только первому элементу массива?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 15:17  [ТС]     Передача всего массива в функцию #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты в курсе, что тут присвоение только первому элементу массива?
Теперь да. т.е. передавал я все нормально, косяк в присвоении, а как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 15:20     Передача всего массива в функцию #4
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Зачем это нужно?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.08.2013, 15:22     Передача всего массива в функцию #5
Цитата Сообщение от VLK Посмотреть сообщение
как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
С обычными массивами - невозможно, используй std::array.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 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
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 15:36  [ТС]     Передача всего массива в функцию #10
Цитата Сообщение от Кудаив Посмотреть сообщение
от глобальных переменных надо отказываться.
да я пытался устроить круговорот локальной константной переменной по функция, но что то не очень

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

при наведении на подчеркнутое пишет, что const int dlina должно иметь константное значение, юмор прямо.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 15:44  [ТС]     Передача всего массива в функцию #12
А что насчет передачи всего массива не по ссылке (указателю), а что бы в функции сделали копию всего массива? такое не возможно?
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
21.08.2013, 15:44     Передача всего массива в функцию #13
Цитата Сообщение от VLK Посмотреть сообщение
юмор прямо.
создавай temp динамически
Jupiter
21.08.2013, 15:48
  #14

Не по теме:

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

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

Или в каждом конкретном случае свое, по этому стоит писать свои тестировать их ну и т.д.?
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
21.08.2013, 15:51     Передача всего массива в функцию #16
Цитата Сообщение от VLK Посмотреть сообщение
надо быть программистом с 30 летним стажем + профессором высшей математики
надо лишь рационально мыслить
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 15:53     Передача всего массива в функцию #17
Цитата Сообщение от VLK Посмотреть сообщение
я могу не парится в поисках оптимальных вариантов т.к. как я понимаю они все описаны тут - Алгоритмы сортировок ?
не все

Цитата Сообщение от VLK Посмотреть сообщение
по этому стоит писать свои тестировать их ну и т.д.?
в учебных целях стоит писать свои
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 15:55  [ТС]     Передача всего массива в функцию #18
Цитата Сообщение от Кудаив Посмотреть сообщение
надо лишь рационально мыслить
ну скажем так, конечно когда то я это знал, но потом забыл и вспомнил что делить на 0 нельзя, только когда решил написать такую программу Возведение в степень, отрицательные числа

так стоит мне напрягаться с сортировкой или когда она мне понадобится, все что мне нужно, это заглянуть в эту тему - Алгоритмы сортировок ?

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
в учебных целях стоит писать свои
ну я переписал из книги пару вариантов но с пониманием дела, во все вник, надеюсь этого будет достаточно?


а точнее не вспомнил что на 0 делить нельзя, а это вычитал в книжке! если бы этого не было в книжке, была бы очередная тема на форуме с название, "почему не работает?!"
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
21.08.2013, 16:35     Передача всего массива в функцию #19
Цитата Сообщение от VLK Посмотреть сообщение
И еще вопрос, немного относящийся к теме, сортировка, я могу не парится в поисках оптимальных вариантов т.к. как я понимаю они все описаны тут - Алгоритмы сортировок ? а что бы придумать что то новое (стоящее) надо быть программистом с 30 летним стажем + профессором высшей математики ?
надо очень хорошо разбираться в вопросе. надо понимать, какая асимптотика у какой сортировки; надо уметь по входным данным понимать, какой алгоритм быстрее; надо понимать, что к нему приписать, чтобы быстрее вышло. в общем везде принцип один нужно детально понимать все, что происходит, нужно уметь внести положительные изменения.

Добавлено через 1 минуту
Цитата Сообщение от VLK Посмотреть сообщение
const int dlina = 1000;
никогда не пишите так. это очень сильно портит впечатление о вас и вашем коде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 16:48     Передача всего массива в функцию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:48     Передача всего массива в функцию #20
Цитата Сообщение от salam Посмотреть сообщение
никогда не пишите так
Это насчёт названия переменной?
Yandex
Объявления
21.08.2013, 16:48     Передача всего массива в функцию
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru