LINUX.ORG.RU

Непонятный сегфолт

 , ,


0

1

Приветствую, лор!

Лабораторная работа. Необходимо написать класс для матрицы на основе двумерного массива. Код компилируется успешно, но в процесе работы, при обращении к массиву сегфолтится. Если скопипастить куски кода из класса в функцию main, то вроде работает как надо. Чувствую, что какая-нибудь глупая/тривиальная ошибка, но самому разобраться или нагуглить не вышло. Заранее спасибо.

Собственной код:

//matrix.h
#include <iostream>

using std::cout;
using std::cin;

class Matrix
{
public:
	Matrix();
	Matrix(int, int);
	void display();
	void enter();
private:
	int row_;
	int col_;
	int **matrix_;
};
//matrix.cpp
#include "matrix.h"

Matrix::Matrix(int row, int col){
	int **matrix_ = new int* [row];
	for (int r = 0; r < row; r++)
		matrix_[r] = new int [col];
	
	for(int n = 0; n < row; n++){
		for(int m = 0; m < col; m++)
			matrix_[n][m] = 1;
	}

	row_ = row;
	col_ = col;
}

void Matrix::display(){
	for(int n = 0; n < row_; n++)
		for(int m = 0; m < col_; m++)
			cout << matrix_[n][m];
			cout << '\n';
}

void Matrix::enter(){
	for(int n = 0; n < row_; n++)
		for(int m = 0; m < col_; m++){
			std::cout << "Inter element " << "[" << n << "][" << m << "]  ";
			std::cin >> matrix_[n][m];
		}
}
//main.cpp
#include "matrix.h"

int main(void){
	Matrix mt(3, 4);
	mt.display();
	mt.enter();
	return 0;
	
}

int **matrix_

Ты переопределил член класса в конструкторе и инициализируешь локальную переменную.

ziemin ★★
()
Ответ на: комментарий от ziemin

Да, спасибо, увидел косяк наконец.

Вместо:

Matrix::Matrix(int row, int col){
	int **matrix_ = new int* [row];

нужно:

Matrix::Matrix(int row, int col){
	matrix_ = new int* [row];

b0c0813f
() автор топика

Так и думал, что ошибка безумно глупая.

b0c0813f
() автор топика
Ответ на: комментарий от MyTrooName

джава, например, предупреждает, если локальная переменная перегружает член класса.

емнип, для этого компилятору надо отдельно указать такое делать. По дефолту javac про такое не должен ничего говорить.

arkhnchul ★★★
()
Ответ на: комментарий от arkhnchul

емнип, для этого компилятору надо отдельно указать такое делать. По дефолту javac про такое не должен ничего говорить.

только -Wall, только -Werr

(я хз, для джавы пользую ide, видимо, этот ключ воткнут по умолчанию)

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Пытаюсь компилировать следущей коммандой:

g++ -Wall -Werror -o lab main.cpp matrix.h matrix.cpp

Код всё равно успешно компилируется. Никаких ворнингов и/или ошибок я всё равно не получаю.

b0c0813f
() автор топика
Ответ на: комментарий от MyTrooName

джава, например, предупреждает, если локальная переменная перегружает член класса.

а это что, так непонятно?

emulek
()
Ответ на: комментарий от b0c0813f

Никаких ворнингов и/или ошибок я всё равно не получаю.

потому что это не баг, а фича. Ты можешь определить в классе переменную, и в методе ещё одну локальную с тем же именем. Нужно для того, что-бы не уродоваться с j_methodX_classY_fileZ, а просто писать j.

emulek
()

**matrix_

Писец. Вот зачем, зачем юзать указатель на указатель, а потом создавать такие темы? Да в 99% можно сделать по другому, по нормальному, а не так, чтобы потом в дебаггере сидеть и разбираться с указателями.

Deleted
()
Ответ на: комментарий от anonymous

Да знаю, деструктор на тот момент еще не был написан.

b0c0813f
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.