Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 5
1

Передача и изменение одномерного динамического массива

29.09.2017, 11:52. Показов 1095. Ответов 6
Метки нет (Все метки)

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
47
48
49
50
51
52
53
void get(double *a, double *c, int i, int j, int m, int k, int r, int n);
void get(double *a, double *c, int i, int j, int m, int k, int r, int n)
{
    int mi=0, mj=0, s=0, l=0;
    mi=(j<=k ? m : r);
    mj=(j<=k ? m : r);
    for(l=0;l<mi;l++)
    {
        for(s=0;s<mj;s++)
        {
 
            c[l*n+s]=a[((i-1)*m+l)*n+(j-1)*m+s];
            cout<<c[((i-1)*m+l)*n+(j-1)*m+s]<<" ";
 
        }
        cout<<endl;
    }       
    
}
 
 
int main()
{
    int n=0;
    int i, j;
    int k=0, m=0, r=0;//n=m*k+r, k=[n/m]
    char*name=0;
 
cout<<"vvedite n"<<endl;
    cin>>n;
    cout<<"vvedite m"<<endl;
    cin>>m;
    double *a=new double [n*n];
    double *c1=new double [m*m];
 
    
    ifstream file;
        file.open("b.txt");
 
        for(i=0; i<n*n; i++)
        {
            file>>a[i]; 
        }
        file.close();
        k=int(n/m);
        r=n-m*k;
 
   printmatrix(a, n);
   
   get(a, c1, 1, 1, m, k, r, n);
 
   printmatrix(c1,m);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2017, 11:52
Ответы с готовыми решениями:

Метод-член класса для создания одномерного массива из отрицательных элементов двумерного динамического массива
Помогите, пожалуйста, нужно разработать метод-член класса для создания одномерного массива из...

Обработка одномерного динамического массива
создать одномерный динамический массив произвольного размера.Заполнить его случайным...

Сортировка динамического одномерного массива
void Sort(int *l, int n) { for (*(l + 1) = 0; *(l + 1)&lt;n - 1; *(l + 1)++) for (*(l + 2) = *(l...

Удаление динамического одномерного массива
Я в шоке оказывается надо еще удалять массив из памяти когда его создаешь. Всегда писал на шарпе...

6
 Аватар для COKPOWEHEU
4029 / 2575 / 430
Регистрация: 09.09.2017
Сообщений: 11,494
29.09.2017, 12:59 2
Цитата Сообщение от Mashka_8512 Посмотреть сообщение
mi=(j<=k ? m : r);
mj=(j<=k ? m : r);
не проще сделать mj=mi?
В остальном - без описания алгоритма, нормального именования переменных, комментариев, сложно что-то анализировать.
0
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 5
29.09.2017, 14:32  [ТС] 3
там допущена ошибка, там в первом по i, они могут не совпадать. Описание алгоритма для того чтобы исправить ошибку не нужно. Ошибка заключается в том, что передается указатель, то есть меняется только локальная копия в функции а само значение в итоге не меняется. Я не знаю как это исправить вот и все. В этом и заключается вопрос
0
 Аватар для COKPOWEHEU
4029 / 2575 / 430
Регистрация: 09.09.2017
Сообщений: 11,494
29.09.2017, 14:41 4
Если скрываете алгоритм - хотя бы воспроизведите ошибку на простейшем примере.
Потому что при передаче по указателю меняется не локальная копия. Следовательно, ошибка где-то в другом месте, и чтобы ее найти надо разобраться в коде.
0
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 5
29.09.2017, 14:59  [ТС] 5
я не то чтобы скрываю алгоритм, он просто еще не написан. не имею дурной привычки писать дальше, пока элементарные вещи не работают. это в принципе весь кусок, есть еще конечно функция печати матрицы - и все. но она тут явно не причем

Добавлено через 8 минут
нашла ошибку, в этой строчке: c[l*m+s]=a[((i-1)*m+l)*n+(j-1)*m+s];
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.09.2017, 15:31 6
Вот так всё работает
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
#include <iostream>
 
void Change(int *arr, const size_t N)
{
    for (size_t i = 0; i < N; i++)
        arr[i] <<= 1;
}
 
int main()
{
    const size_t N = 5;
    int *arr = new int[N];
    for (size_t i = 0; i < N; i++)
    {
        arr[i] = i;
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
 
    Change(arr, N);
    for (size_t i = 0; i < N; i++)
        std::cout << arr[i] << " ";
 
    delete[] arr;
}
0
 Аватар для COKPOWEHEU
4029 / 2575 / 430
Регистрация: 09.09.2017
Сообщений: 11,494
29.09.2017, 15:47 7
Цитата Сообщение от Mashka_8512 Посмотреть сообщение
не имею дурной привычки писать дальше
Еще бы научиться именованию переменных и комментариям. Ну хотя бы с форматированием кода все нормально, а это встречается так редко...
Что мешало написать хотя бы
C
1
void arr_copy(double *dst, double *src, int dst_w, int src_w, int x, int y)
В функциях копирования обычно порядок переменных такой: ([куда],[откуда/что],[сколько]) - strcpy, memcpy, memset как примеры
Передавать k и r не нужно, их легко вычислить внутри процедуры, зато ее вызов выглядит проще и меньше шансов напутать.
Цитата Сообщение от Mashka_8512 Посмотреть сообщение
c[l*m+s]=a[((i-1)*m+l)*n+(j-1)*m+s];
Если представить как двумерный массив, исключительно для обработки человеком, в коде останется ваш вариант.
Код
xd = s;
yd = l;
xs = (j-1)*m + s;
ys = (i-1)*m + l;
c[ xd, yd ] = a[ xs, ys ];
Довольно странно смотрится умножение компонент адреса массива источника (a) на размер массива приемника (c), причем обеих. Если бы умножалась только Y-компонента, причем на размер источника (n), я бы сказал что это копирование квадратного куска (с проверкой границ) из источника (c) в приемник (a). А так - затрудняюсь сказать.
Могу дать совет по улучшению читабельности:
C
1
2
#define SRC(x,y) a[(x)+(y)*m]
#define DST(x,y) c[(x)+(y)*n]
а когда работа закончена, можно удалить макросы.
C
1
2
#undef SRC
#undef DST
0
29.09.2017, 15:47
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2017, 15:47
Помогаю со студенческими работами здесь

Объявление динамического одномерного массива.
БИЛЕТ №14 3. Составьте программу, в которой объявляется динамический одномерный массив...

Из динамического одномерного массива в статический
Здравствуйте! Я хотел бы попросить вас показать на данном примере, как изменится код программы, в...

Список на основе одномерного динамического массива
Добрый вечер! Кто может привести в пример структуру такого списка? (на основе одномерного...

Алгоритм (псевдокод) одномерного динамического массива
Суть проблемы такова: Задан массив – А(10). Получить из него массив В, состоящий из элементов...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru