Я пытаюсь использовать const_iterators для просмотра списка элементов (элементов матрицы).
SparseMatrix matd(5,5,0); //5x5 matrix with 0 as default element.
//Follows elements insertion...
SparseMatrix<int>::const_iterator a,b;
a=matd.cbegin();
b=matd.cend();
while(a!=b){
cout<<*(a->data)<<endl;
++a;
}
Но что-то не так, как сообщает Вальгринд.
== 4662 == Использование неинициализированного значения размера 8
== 4662 == в 0x403A19: SparseMatrix :: findRow (int) const (SparseMatrix.h: 120)
== 4662 == по 0x40431A: SparseMatrix :: findNext (el const *) const (SparseMatrix.h: 439)
== 4662 == по 0x4030B3: SparseMatrix :: const_iterator :: operator ++ () (SparseMatrix.h: 593)
== 4662 == по 0x401D63: main (main.cpp: 121)
== 4662 ==
== 4662 == Недопустимое чтение размера 4
== 4662 == в 0x403A27: SparseMatrix :: findRow (int) const (SparseMatrix.h: 123)
== 4662 == по 0x40431A: SparseMatrix :: findNext (el const *) const (SparseMatrix.h: 439)
== 4662 == по 0x4030B3: SparseMatrix :: const_iterator :: operator ++ () (SparseMatrix.h: 593)
== 4662 == по 0x401D63: main (main.cpp: 121)
== 4662 == Адрес 0xa680020611a25ff не является стековым, malloc или (недавно) свободным
== 4662 ==
== 4662 ==
== 4662 == Процесс завершается с действием по умолчанию для сигнала 11 (SIGSEGV)
== 4662 == Ошибка общей защиты
== 4662 == в 0x403A27: SparseMatrix :: findRow (int) const (SparseMatrix.h: 123)
== 4662 == по 0x40431A: SparseMatrix :: findNext (el const *) const (SparseMatrix.h: 439)
== 4662 == по 0x4030B3: SparseMatrix :: const_iterator :: operator ++ () (SparseMatrix.h: 593)
== 4662 == по 0x401D63: main (main.cpp: 121)
, поскольку я использую findNext и findRow с обычными итераторами и другими методами класса, и они работают, я думаю, что что-то не так в operator ++ ():
const_iterator& operator++() { const element *tmp=e; e=sm->findNext(tmp); delete tmp; return *this; }
Конструктор копирования const_iterator:
const_iterator(const const_iterator& it) { e=it.e; }
Более того, const_iterators, созданные и используемые внутри метода класса, работают очень хорошо.
PS:
Код findRow
mrow* findRow(int i) const {
mrow *tmp = matrix;
while(tmp!=NULL){
if(tmp->idx == i) return tmp;
tmp=tmp->next;
}
return NULL;
}
Он проходит проверку if (tmp == NULL), поэтому он думает, что в памяти что-то есть, но затем говорит, что это неинициализировано, но я повторю это, если я использую обычный итератор, он работает.
Вот код для findNext
element* findNext(const element* e) const {
int r=e->i;
int c=e->j;
int riga,colonna;
riga=r;
while(riga!=-1){
if(riga==r) {
mrow *m=findRow(riga);
colonna=nextCol(m,c);
if(colonna!=-1) {
T* d=&((findCol(findRow(riga),colonna)->data));
return genElement(riga,colonna,d);
}
}
else{
colonna=nextCol(findRow(riga),-1);
if(colonna!=-1) {
T* d=&((findCol(findRow(riga),colonna)->data));
return genElement(riga,colonna,d);
}
}
riga=nextRow(riga);
}
return NULL;
}
Код для конструктора SparseMatrix (int, int, T)
SparseMatrix(int r, int c, T d){
rows=r;
cols=c;
def=d;
msize=0;
matrix=NULL;
}
Если вам нужно больше кода, просто спросите.
Кроме того, позвольте мне еще раз подтвердить, что я использую findRow и findNext для других целей, и они работают. Я думаю, что это что-то, связанное с константностью, но не могу понять, что.