0

나는 내가 멀티 어레이 인쇄를 실행하고 경우를 제외하고 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; 
} 

모든 일에 테스트하려면 다음 코드를 썼다. 문제는 다음과 같습니다.

인쇄 부분을 주석 처리하면 p1[0],p1[1],p2[0],p2[1],C[i][j]은 내가 원하는 완벽하고 정확한 결과를 제공합니다.

2. 그러나 일반 루프를 사용하여 인쇄하면 작동하지 않습니다. 그러나, 그러나, 만약에 for 루프에서 p1[0],p2[1]을 3과 같은 구체적인 숫자 (행렬 차원이 3 일 때)로 변경하면 다시 작동합니다.

3.It이 컴파일되지만 for 루프 인쇄 부분이 txt에 기록되지 않습니다. 표준 인쇄물로 변경했을 때 (단 한 줄뿐만 아니라 전체 방법을 의미 함), 터미널에서도 볼 수 없었습니다. 하지만 위에서 언급했듯이 p [0] p [1]을 3으로 변경하면 작동합니다. 즉, txt 또는 터미널에서 볼 수 있습니다.

이전에는 C++에서 이상한 상황을 만난 적이 없지만, 그래서 누군가가 나를 도울 수 있기를 바랍니다!

참고로 저는 Visual Studio 2010을 컴파일러로 사용합니다.

도움 주셔서 감사합니다.

+1

정확히 작동하지 않는 항목은 무엇입니까? – Borgleader

+0

컴파일되지만 for 루프 인쇄 부분이 txt에 기록되지 않습니다. 표준 인쇄물로 변경하면 (단 한 줄뿐만 아니라 전체 방법을 의미 함) 터미널에서도 볼 수 없습니다. 그러나 위에서 언급했듯이 p [0] p [1]을 3으로 변경하면 작동합니다. 즉 txt 또는 터미널에서 볼 수 있습니다. – Cancan

답변

0

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; 
} 
1

우리는 findmatrixsizenormalmultiplication이 무엇을 알고하지 않습니다.

그러나 내가 생각하는대로 (로컬 데이터에 대한 포인터를 반환한다고 생각하면) p1, p2C이라는 개체가 저장소를 공유합니다.

p1 == p2을 확인하십시오.

+0

자세한 내용은 여기에서 전체 코드를 참조하십시오. https : //www.dropbox.com/s/faf20aoxecjylty/matrix_multiplication.cpp – Cancan

+0

길기 때문에 여기에 모두 넣지 않았습니다. 다음은 입력 파일입니다. https://www.dropbox.com/s/witjs2m766n7got/inputmatrix.txt – Cancan

+1

예, 예상대로입니다. 'Asize'는 지역 배열이고, return Asize는 0 번째 원소에 대한 포인터를 반환합니다. 그러나 Asize를위한 저장 공간은 함수가 반환 되 자마자 해제됩니다. 포인터는 곧 겹쳐 쓰여지는 스택의 일부를 가리 킵니다. 로컬 데이터에 포인터를 반환하는 것은 항상 나쁜 생각입니다. – ach