Консультация № 188682
19.01.2016, 17:52
0.00 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Помогите пожалуйста, проблема при выводе массива.
Еще вопрос, правильно ли я назначаю размерность матрицы?

спасибо большое.

Приложение:
#include <cmath>
#include <iomanip>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define m 4 //количество столбцов
int n; //количество строк
int **a; //двумерный массив
void create_sotr (int** a, int row, int col){
int i,j;
a = new int *[row];
for (i=1; i<=row; i++){
a[i]=new int [col];
std::cout<<"Введите данные для " << i <<" -й строки \n";
for (j=1; j<=col; j++)
{
std::cout <<"Введите данные для " << j << "-го стоблца ";
std::cin >> a[i][j];
}
}

}
void print_sotr (int **a, int row, int col){
int i,j;
for(i=1;i<=row;i++){
for(j=1;j<=col;j++){
//std::cout << a[i][j];
std::cout << a[i][j];
}
}
}
int main() {

//std::cout << "Hello, World!\n";
std::cout <<"Введите количество строк ";
std::cin >> n;
create_sotr(a,n,m);
print_sotr(a,n,m);
return 0;
}

Обсуждение

давно
Академик
20764
1861
19.01.2016, 18:05
общий
дык - массивы в C/C++ 0-based, то есть индексируются с 0
так что: for (i=0; i<row; i++) - и так везде
А ваш код обращается за пределы аллокированных объектов, что приводит к непредсказуемым результатам.
давно
Профессор
230118
3054
20.01.2016, 15:17
общий
это ответ
Здравствуйте, Сергей В.!

Запомните, что в массивах индексация начинается с 0 и заканчивается на n-1, если n - размер массива. Следовательно, Вы должны писать не for (j=1; j<=col; j++), а for (j=0; j<col; j++), как принято среди программистов на С++. Ну и создавая массив с помощью new, нужно освободить его с помощью delete. Еще одна проблема - глобальная переменная а. Она копируется в функцию, поэтому память выделяется только внутри функции, а она остается NULL. Поэтому не передавайте ее как параметр, если сделали глобальной.

В результате получаем код
Код:
#include <cmath>
#include <iomanip>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define M 4 //количество столбцов
int n; //количество строк
int **a; //двумерный массив
void create_sotr (int row, int col){
int i,j;
a = new int *[row];
for (i=0; i<row; i++){
a[i]=new int [col];
std::cout<<"Введите данные для " << i <<" -й строки \n";
for (j=0; j<col; j++)
{
std::cout <<"Введите данные для " << j << "-го стоблца ";
std::cin >> a[i][j];
}
}


}
void print_sotr (int row, int col){
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
std::cout << a[i][j];
}
}
}
int main() {

//std::cout << "Hello, World!\n";
std::cout <<"Введите количество строк ";
std::cin >> n;
create_sotr(n,M);
print_sotr(n,M);
for (int i=0; i<n; i++)
delete a[i];
return 0;
}
5
давно
Посетитель
7438
7205
21.01.2016, 12:42
общий
Адресаты:
В дополнение замечания о глобальной переменной а:
В принципе, можно передавать параметром и глобальную переменную,
но только не саму, а ее адрес.
Все же проще так, как указала Асмик. Глобальные переменные доступны всегда.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа