Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
1

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

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

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

Кликните здесь для просмотра всего текста
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, я в курсе, для простоты я написал что передаю по ссылке.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2013, 15:05
Ответы с готовыми решениями:

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

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

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

Передача двухмерного массива в функцию и изменение элемента массива
Такая проблема! Нужно передать в функцию двухмерный массив и изменить на елемент который равен 0 и...

28
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
21.08.2013, 15:14 2
Цитата Сообщение от VLK Посмотреть сообщение
C++
1
*temp = *test1;
Ты в курсе, что тут присвоение только первому элементу массива?
2
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
21.08.2013, 15:17  [ТС] 3
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты в курсе, что тут присвоение только первому элементу массива?
Теперь да. т.е. передавал я все нормально, косяк в присвоении, а как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 15:20 4
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Зачем это нужно?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
21.08.2013, 15:22 5
Цитата Сообщение от VLK Посмотреть сообщение
как присвоить весь массив, всему массиву, очень желательно без циклов, если это конечно возможно.
С обычными массивами - невозможно, используй std::array.
1
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
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 указатель за последним элементом, а вообще передавать можно любые интервалы
1
1 / 1 / 3
Регистрация: 04.06.2013
Сообщений: 48
21.08.2013, 15:23 7
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Ну тогда используйте
C++
1
std::vector
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
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
пока что для простоты тестирование использую обыкновенный массив, мне с ним легче работать.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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 и т.д.).
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
21.08.2013, 15:36  [ТС] 10
Цитата Сообщение от Кудаив Посмотреть сообщение
от глобальных переменных надо отказываться.
да я пытался устроить круговорот локальной константной переменной по функция, но что то не очень

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


при наведении на подчеркнутое пишет, что const int dlina должно иметь константное значение, юмор прямо.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
21.08.2013, 15:44  [ТС] 12
А что насчет передачи всего массива не по ссылке (указателю), а что бы в функции сделали копию всего массива? такое не возможно?
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.08.2013, 15:44 13
Цитата Сообщение от VLK Посмотреть сообщение
юмор прямо.
создавай temp динамически
0
Jupiter
21.08.2013, 15:48
  #14

Не по теме:

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

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

Или в каждом конкретном случае свое, по этому стоит писать свои тестировать их ну и т.д.?
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.08.2013, 15:51 16
Цитата Сообщение от VLK Посмотреть сообщение
надо быть программистом с 30 летним стажем + профессором высшей математики
надо лишь рационально мыслить
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.08.2013, 15:53 17
Цитата Сообщение от VLK Посмотреть сообщение
я могу не парится в поисках оптимальных вариантов т.к. как я понимаю они все описаны тут - Алгоритмы сортировок ?
не все

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

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

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


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

Добавлено через 1 минуту
Цитата Сообщение от VLK Посмотреть сообщение
const int dlina = 1000;
никогда не пишите так. это очень сильно портит впечатление о вас и вашем коде.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:48 20
Цитата Сообщение от salam Посмотреть сообщение
никогда не пишите так
Это насчёт названия переменной?
0
21.08.2013, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2013, 16:48
Помогаю со студенческими работами здесь

Передача массива в функцию
Всем привет. Есть некий динамический массив arr; Его надо передать в функцию. Я уже пробовал...

Передача массива в функцию
В общем задание такое Превратить этот код в другой код, что-то поменять, я не врубаюсь что и как....

Передача в функцию массива
Есть код #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; double search(int i_l,...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru