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

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

21.08.2013, 15:05. Показов 1628. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2013, 15:05
Ответы с готовыми решениями:

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

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

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

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

28
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 15:20 4
Цитата Сообщение от VLK Посмотреть сообщение
а если мне нужно что бы он не по ссылке передавался, а копировался, как быть?
Зачем это нужно?
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
Каратель
Эксперт С++
6610 / 4029 / 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
Каратель
Эксперт С++
6610 / 4029 / 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 16:48 20
Цитата Сообщение от salam Посмотреть сообщение
никогда не пишите так
Это насчёт названия переменной?
0
21.08.2013, 16:48
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
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
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru