Ошибка использования цикла for для печати матрицы в моей программе

Я написал следующий код для тестирования в int main()

int main() {
int *p1 = findmatrixsize("inputmatrix.txt","A");//A function gets matrix size
cout << p1[0] << endl << p1[1] << endl;
int *p2 = findmatrixsize("inputmatrix.txt","B");
cout << p2[0] << endl << p2[1] << endl;

double **C = normalmultiplication("inputmatrix.txt","A", "B");
cout << C[0][0] << endl;

ofstream fout;
const string s="outputmatrix.txt";
fout.open(s);
for(int i=0;i<p1[0];i++){
for(int j =0;j<p2[1];j++){
fout << C[i][j] << " ";
}
fout<< endl;
}
fout.close();

return 0;
}

Все работает, кроме случаев, когда я выполняю многострочную печать. Вот проблема:

1. Если я закомментирую часть печати, p1[0],p1[1],p2[0],p2[1],C[i][j] дает мне идеальный и правильный результат, который я хочу.

2. Однако, когда я печатаю с использованием нормальных циклов, это не работает. Но, но, но, если я изменю p1[0],p2[1] в цикле for до конкретного числа, такого как 3 (когда размер моей матрицы равен 3), он снова работает.

3. Он компилируется, но часть для цикла печати не записывается в текст. Когда я изменил его на стандартную распечатку (не только одну строку, я имею в виду весь метод), я не смог увидеть их в терминале. Но, как я упоминал выше, когда я изменяю p [0] p [1] на 3, это работает, что означает, что я могу видеть их либо в txt, либо в терминале

Я никогда раньше не сталкивался с такой странной ситуацией в C ++, поэтому я надеюсь, что кто-нибудь может мне помочь!

К вашему сведению, я использую Visual Studio 2010 в качестве компилятора.

Спасибо за вашу помощь!

0

Решение

Мы не знаем что findmatrixsize а также normalmultiplication делать.

Но если они делают то, что я думаю, что они делают (и я думаю, что они возвращают указатели на свои локальные данные), объекты, на которые ссылается p1, p2 а также C поделиться хранилищем.

Проверить, если p1 == p2,

1

Другие решения

Проблема в том, как вы получаете результат от функций findmatrixsize и normalmultiplication: они сохраняют результат вычисления в стеке и возвращают указатель на него, но стек уничтожается вскоре после того, как эти функции завершат свою работу. Переопределите эти функции, чтобы место в памяти действовало за пределами этих функций. Например,

int p1[2];
findmatrixsize("inputmatrix.txt","A", p1)

и поместите результат внутри findmatrixsize в последний аргумент, например.

void findmatrixsize(const char* fileName, const char* matrixName, int* result)
{
// routine
result[0] = someValue1;
result[1] = someValue2;
}
0

По вопросам рекламы [email protected]