У меня странная проблема с memset, это было связано с классом, который я создаю перед ним, и файлом, который я открываю в конструкторе.Класс, с которым я работаю, обычно читает в массиве и преобразует его в другой массив, но это не важно.Класс, с которым я работаю:
#include <vector>
#include <algorithm>
using namespace std;
class PreProcess
{
public:
PreProcess(char* fileName,char* outFileName);
void SortedOrder();
private:
vector< vector<double > > matrix;
void SortRow(vector<double> &row);
char* newFileName;
vector< pair<double,int> > rowSorted;
};
Другие функции не важны, потому что я перестал их вызывать, и проблема сохраняется.По сути, я сузил его до моего конструктора:
PreProcess::PreProcess(char* fileName,char* outFileName):newFileName(outFileName){
ifstream input(fileName);
input.close(); //this statement is inconsequential
}
Я также прочитал в файле в моем конструкторе, но я обнаружил, что проблема сохраняется, если я не читаю в матрице и простооткройте файл.По сути, я сузил это до того, что, если я закомментирую эти две строки, memset будет работать правильно, иначе это не так.
Теперь в контексте проблемы, с которой я столкнулся: я написал свой собственный простой класс-оболочку для матриц.Он не имеет большой функциональности, мне просто нужны 2D-массивы в следующей части моего проекта, и с дескриптором класса все имеет для меня больше смысла.
Заголовочный файл:
#include <iostream>
using namespace std;
class Matrix{
public:
Matrix(int r,int c);
int &operator()(int i,int j)
{//I know I should check my bounds here
return matrix[i*columns+j];
}
~Matrix();
const void Display();
private:
int *matrix;
const int rows;
const int columns;
};
Драйвер:
#include "Matrix.h"
#include <string>
using namespace std;
Matrix::Matrix(int r,int c):rows(r),columns(c)
{
matrix=new int[rows*columns];
memset(matrix,0,sizeof(matrix));
}
const void Matrix::Display(){
for(int i=0;i<rows;i++){
for(int j=0;j<columns;j++)
cout << (*this)(i,j) << " ";
cout << endl;
}
}
Matrix::~Matrix()
{
delete matrix;
}
Моя основная программа запускается:
PreProcess test1(argv[1],argv[2]);
//test1.SortedOrder();
Matrix test(10,10);
test.Display();
И когда я запускаю это без строки комментария, я получаю:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 -1371727776 32698 -1 0
0 0 0 0 6332656 0 -1 -1 0 0
6332672 0 0 0 0 0 0 0 0 0
0 0 0 0 -1371732704 32698 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Я действительноне имею понятия, что происходит в памяти, чтобы вызвать это, на заметку, если я заменю memset на:
for(int i=0;i<rows*columns;i++)
*(matrix+i) &= 0x0;
Тогда это работает отлично, это также работает, если я не открываю файл,Если это поможет, я использую 64-битную версию GCC 4.2.4 в Ubuntu. Я предполагаю, что есть некоторые функции memset, которые я не совсем понимаю.