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

Не работает заполнение двумерного массива

30.04.2018, 21:28. Показов 866. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал процедуру заполнения двумерного массива. Не хочет работать. Тупо выдает окно с завершением программы. Где здесь ошибка?

C++
1
2
3
4
5
6
7
int x, y;
    srand(time(0));        
    cout<<"Введите диапазон генерируемых значений:\n"; cin>>x; cin>>y; 
    
    for (int i=0; i<p1; i++)
        for (int j=0; i<p2; j++)
            a[i][j] = rand() % (y - x + 1) + x;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2018, 21:28
Ответы с готовыми решениями:

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

Заполнение двумерного массива
Данный фрагмент кода заполняет двумерный массив случайными числами от 0 до 100. Как сделать так,...

Заполнение двумерного массива
дана матрица MxN заполнить ее следущим образом, элементам, находящимся по периметру матрицы,...

Заполнение двумерного массива
Такая задача: Вам вводится число N — размер двумерного массива. Необходимо вывести массив, где i-я...

17
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
30.04.2018, 21:35 2
Ну, во-первых, тут у тебя не объявлен массив a, и его размер - p1, p2, тем не менее такое вызывает понятную ошибку при компиляции. Допустим ты это сделал, однако выделил ты память (если работаешь с указателями), хотя это должно вызывать ошибку, потому бы ты понял. К тому же ты не выводишь не одно значение, ты просто заполняешь массив.

По хорошему следует выкладывать более полный код программы.
0
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 21:37  [ТС] 3
Прошу прощения, вот.

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
#include <iostream>
#include <cstdlib>
#include <ctime> 
 
#define N 100
#define M 100
 
using namespace std;
 
void gener(int a[N][M], int p1, int p2)            //Процедура генерации массива
{
    int x, y;
    srand(time(0));        
    cout<<"Введите диапазон генерируемых значений:\n"; cin>>x; cin>>y; 
    
    for (int i=0; i<p1; i++)
        for (int j=0; i<p2; j++)
            a[i][j] = rand() % (y - x + 1) + x;
    
}
 
void vivod(int a[N][M], int p1, int p2)            //Процедура вывода массива
{
    for (int i=0; i<p1; i++)
    {
        for (int j=0; i<p2; j++)
            cout<<a[i][j]<<'\t';
        cout<<endl;
    }
}
 
int main(int argc, char **argv)
{
    int a[N][M], n, m;
    
    cout<<"Введите количество строк (до 100): "; cin>>n;
    cout<<"Введите количество столбцов (до 100): "; cin>>m;
    
    gener(a, n, m);
    vivod(a, n, m);
    
    return 0;
}
0
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
30.04.2018, 21:41 4
BlackVoron, массив передается по значению, это значит что исходный объект копируются, и все действия происходят уже с копией объекта, а не непосредственно с ним.

Вот так все будет работать:
C++
1
void gener(int& a[N][M], int p1, int p2)
0
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 21:43  [ТС] 5
Если так прописываю - выдает ошибки
Миниатюры
Не работает заполнение двумерного массива  
0
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
30.04.2018, 21:45 6
В таком случае стоит передавать массив с помощью указателей:
C++
1
void gener(int **a, int p1, int p2)
0
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 21:47  [ТС] 7
А теперь в строчке вызова выдает ошибку

C++
1
gener(a, n, m);
Миниатюры
Не работает заполнение двумерного массива  
0
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
30.04.2018, 21:48 8
BlackVoron, в тексте ошибки всё ясно и понятно написано
"Невозможно преобразовать первый аргумент из int (*)[100] в int**"
0
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 21:50  [ТС] 9
Ну это я вижу. Вопрос как это поправить...
Получается, что в функцию я передаю указатель на массив

А когда вызываю ее должен передавать a[N][M] получается? Или как?
0
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
30.04.2018, 21:51 10
BlackVoron, ну как вариант можно просто объявить указатель на указатель и работать с ним. Не вижу никаких проблем
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
30.04.2018, 21:58 11
строка 17 j<p1, строка 26 j<p2

но использовать статический при вводе размера с клавиатуры не по стандарту, нужно динамический:

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
#include <iostream>
#include <ctime>  
using namespace std;
 
void Set(int** a, int n, int m)            
{
   
    int x, y;            
    cout<<"x, y:\n"; cin>>x>>y;     
    for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)
            a[i][j] = rand() % (y - x + 1) + x;    
}
 
void Print (int** a, int n, int m)           
{
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<m; j++)
            cout<<a[i][j]<<'\t';
        cout<<endl;
    }
}
 
int main()
{ 
    srand(time(0));
    int n, m;
    cout<<"n: "; cin>>n;
    cout<<"m: "; cin>>m;
    
      int **a = new int*[n]; 
    for (int i = 0; i < n; i++)
       a[i] = new int[m];   
    
    Set(a, n, m);
    Print (a, n, m);
    
    for (int i = 0; i < n; i++)
    delete [] a[i];
    delete [] a;
system("pause");
return 0;
}
1
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
30.04.2018, 22:02 12
Yetty, там размерность через define задана. Потом просто используется часть выделенного объёма

Добавлено через 1 минуту
Проблема в описании метода. В этом плане, как по мне, действительно удобнее использовать указатели
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
30.04.2018, 22:08 13
Цитата Сообщение от Hitoku Посмотреть сообщение
там размерность через define задана
там это где ? условие автор темы решил не выкладывать, а коды с ошибками сбрасывают для исправлений.
как говорил в коде автора нужно исправить
Цитата Сообщение от Yetty Посмотреть сообщение
строка 17 j<p1, строка 26 j<p2
и всё должно работать
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
30.04.2018, 22:16 14
Цитата Сообщение от Cortas Посмотреть сообщение
массив передается по значению, это значит что исходный объект копируются, и все действия происходят уже с копией объекта, а не непосредственно с ним.
к массивам это не относится.

Добавлено через 1 минуту
в функцию передается указатель на первый элемент массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Function(int a[2][2])
{
    a[0][0] = 1;
    a[0][1] = 2;
    a[1][0] = 3;
    a[1][1] = 4;
}
 
int main()
{
    int a[2][2] {0};
    Function(&a[0] );
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 23:09  [ТС] 15
Цитата Сообщение от _stanislav Посмотреть сообщение
в функцию передается указатель на первый элемент массива.
Все равно выдает ошибку

C++
1
gener(&a[0], n, m);
А задание я сам для себя сделал простое: заполнить двумерный массив при помощи процедуры и так же при помощи процедуры его вывести.

Путаюсь в этих всех указателях. Одномерный массив передается просто, а с матрицами дичь какая то получается
Миниатюры
Не работает заполнение двумерного массива  
0
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
30.04.2018, 23:18  [ТС] 16
А все, разобрался
А за помощь всем большое спасибо!
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
01.05.2018, 00:38 17
Цитата Сообщение от BlackVoron Посмотреть сообщение
Путаюсь в этих всех указателях. Одномерный массив передается просто, а с матрицами дичь какая то получается
Да ничего Вы не путаете. Статический двумерный массив, например x[4][4] и его размер можно передать непосредственно, примерно как Вы делали: void F (int x[4][4], int n) или так: void F (int x[][4], int n), а в передаче по указателю есть специфика, т.е. в отличие от передачи динамического, нужно так: void F (int (*x)[4], int n) - мне это подсказали, сам тоже не мог въехать. А вообще используйте динамический.

Добавлено через 11 минут
Для дальнейшего освоения рекомендую Вам решить новую задачу - вывод массива не через void, а через обычную функцию.
1
0 / 0 / 0
Регистрация: 26.04.2018
Сообщений: 43
01.05.2018, 10:55  [ТС] 18
Цитата Сообщение от Yetty Посмотреть сообщение
вывод массива не через void, а через обычную функцию
Хорошо, попробую!
Спасибо еще раз!)
0
01.05.2018, 10:55
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2018, 10:55
Помогаю со студенческими работами здесь

Заполнение двумерного массива
Ребят, такой вопрос: надо создать двумерный массив, но размерность должен указать юзер. Пробовал...

Заполнение двумерного массива
#include &quot;stdafx.h&quot; const int n=5; int _tmain(int argc, _TCHAR* argv) { int a; int k=0;...

Заполнение двумерного массива
НАШЕЛ САМ

Заполнение двумерного массива
Есть простой код, но он не работает. Выскакивает сообщение о необработанном исключении. Типо...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru