2016-04-29 2 views
0

私のコードは、* .mtxファイルから疎行列を読み取り、コンソールで行列を出力する必要があります(実際の場合は、疎な行列を返すようにします)。C++コードで値の代わりにアドレスを取得するのはなぜですか?

マイコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <fstream> 
#include <algorithm> 
using namespace std; 

struct MatriceRara 

{ 

    int *Linie, *Coloana, *Valoare; 


    int nrElemente, nrLinii, nrColoane; 

}; 


MatriceRara Read(const char* mtx) { 

const char * mtx_file = mtx; 

ifstream fin(mtx_file); 

MatriceRara matR; 
int nrElemente, nrLinii, nrColoane; 

// skip header: 
while (fin.peek() == '%') fin.ignore(2048, '\n'); 

// read parameters: 
fin >> nrLinii >> nrColoane >> nrElemente; 
matR.nrElemente = nrElemente; 
matR.nrLinii = nrLinii; 
matR.nrColoane = nrColoane; 
cout << "Number of rows: " << matR.nrLinii <<endl; 
cout << "Number of columns: " << matR.nrColoane << endl; 
cout << "Number of not null values: " << matR.nrElemente << endl; 


for (int i = 0; i< nrElemente; i++) 
{ 

    int *m ,*n,*data; 
    fin >> (int &) m >> (int &) n >> (int &) data; 
    matR.Linie = m; 
    matR.Coloana = n; 
    matR.Valoare = data; 
    //only for test: 
    cout<<matR.Linie << " " << matR.Coloana << " " << matR.Valoare <<endl; 



} 

//return matR; 
} 



int main() { 


MatriceRara a = Read("Amica.mtx"); 


} 

マイ出力:

Number of rows: 5 
Number of columns: 5 
Number of not null values: 8 
0x7fff00000001 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 
0x7fff00000000 0x7f4400000001 0x1 

あなたは私の出力で見ることができるように、それはアドレスではなく、値を印刷します。 ありがとうございました!

+1

あなたはポインタを出力しているので。 – drescherjm

+0

'int * m、* n、* data; fin >>(int&)m >>(int&)n >>(int&)data; 'は未定義の動作です。 – drescherjm

+0

@drescherjm私も願っています。私はOPがそのコードを最小限にしようとしたと思う。 – fjardon

答えて

4

ポインタはintへとあなたは以下のメンバーを宣言:

int *Linie, *Coloana, *Valoare; 

を次にあなたがこれらのポインタを印刷:

cout<<matR.Linie << " " << matR.Coloana << " " << matR.Valoare <<endl; 

ですから、あなたが尋ねたものを手に入れる:ポインタの値(例えばアドレス)

-4

タイプint *のすべての変数とクラスメンバーは、実際にはタイプintである必要があります。現在は、初期化されていないポインタですが、実際には整数であることを意図しています。

+0

最初にポインタとして宣言するのはなぜですか?ここでは、この例ではintへのポインタではなくint型である必要があります。元のコードでは、a)3つの初期化されていないポインタを宣言しました。 b)それらを使用します(初期化されていない未定義の場所ではありません)。 Linie、Coloana、Valoareもint型でなければなりません。現在のコードでは、初期化されていないポインタです。 – bipll

1

変数Linie,ColoanaおよびValoareがポインタであるためです。

*の前にポインタを逆参照する必要があります。

int value; 
value = *m; 

、あなたはここで再び、値を印刷したい場合:

cout<< *matR.Linie << " " << *matR.Coloana << " " << *matR.Valoare << endl; 
関連する問題