助言求む – 固定ページ 3 – プログラミング – Home

通知
すべてクリア

[解決済] 助言求む

固定ページ 3 / 5

...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

アーカイブ関連と、CImage関連は全部無視でいいんじゃないか?
なんか変だよ。全体的な傾向が。


返信引用
***
 ***
(@***)
ゲスト
結合: 22年前
投稿: 18
 

おっと・・・ヘッダ情報を読み込むのを忘れていました。

void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
if ( m_pImage != NULL )
{
delete m_pImage;
m_pImage = new CImage();
}

ar.Read(m_pImage->header,HEADER_SIZE);
ar.Read(m_pImage->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
}
}

もし、どうしてもファイルポインタを使いたいということであれば・・・

void C**Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
if ( m_pImage != NULL )
{
delete m_pImage;
m_pImage = new CImage();
}

CFile* fp = ar.GetFile();

if( fp->GetLength() < HEADER_SIZE ) {
return;
}

fp->Seek( HEADER_SIZE, CFile::begin );

int i;
unsigned short *tmp;
for ( i=0, tmp=m_pImage->pImage;i<IMAGEDATA_SIZE; i++, tmp++) {
fp->Read(tmp,sizeof(unsigned short));
}
}
}


返信引用
***
 ***
(@***)
ゲスト
結合: 22年前
投稿: 18
 

あ、そういえばC**Viewクラスからも使いたいとか言ってましたね。

そのときは
((C**Doc*)GetDocument())->m_pImage
と使ってください。そうすればC**ViewクラスからC**Docクラスの
publicなメンバが参照できますから。
あ、余分なお世話かもしれませんが使うときはNULLかどうか確認したほうが
いいですよ。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

>あらかじめ、C**Docクラスにメンバー変数として、「CImage *m_pImage」をpublicで
>宣言しておきます。

>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます。

ここのところがよくわからないのですが、詳しく説明してもらえませんか?


返信引用
***
 ***
(@***)
ゲスト
結合: 22年前
投稿: 18
 

なにがわからないのか具体的に示してください。
あなたの頭の中まで私たちは見ることができませんから。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

すいません。せっぱ、つまってるもんで・・つい。
CImage *m_pImageはpublicで宣言したらエラーがでるのと、あと
>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます
これを書く場所と書き方がいまいち分かりません・・


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

m_pImage=NULL;
delete m_pImage;でいいのですか?


返信引用
***
 ***
(@***)
ゲスト
結合: 22年前
投稿: 18
 

>すいません。せっぱ、つまってるもんで・・つい。
>CImage *m_pImageはpublicで宣言したらエラーがでるのと、あと
たぶん、CImageが定義されているであろうヘッダファイルをincludeしてない
からだと思います。

>>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
>>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます
>これを書く場所と書き方がいまいち分かりません・・
「コンストラクタとデストラクタという意味がまったくわかりません」
といっているみたいですがその認識で正しいですか?

>m_pImage=NULL;
こっちは正しいです。

>delete m_pImage;でいいのですか?
こっちは私が示したとおりのコーディングがされていません。
「・・・でなかったら」という文章を使っているので最低限「if」は必要なんじゃないですか?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>あらかじめ、C**Docクラスにメンバー変数として、
>「CImage *m_pImage」をpublicで宣言しておきます。
.hファイルで、
  class C**Doc
  {
  public:
    CImage *m_pImage;
  }
とする、ということです。

>C**Docのコンストラクタでm_pImageにNULLを代入しておきます。
クラス名と関数名が同じもの、それがコンストラクタです。
C**Doc::C**Doc() という関数はあるんですよね? あなたが今変数宣言をしている関数で
す。そこで、
  C**Doc::C**Doc()
  {
    m_pImage = NULL;
  }
とする、ということです。

>C**Docのデストラクタでm_pImageがNULLでなかったらdeleteをするようにしておきます。
「クラス名::~クラス名()」という関数、それがデストラクタです。そこで、
  C**Doc::C**Doc()
  {
    if( m_pImage )
      delete m_pImage;
  }
とする、ということです。

基本的な語句の意味、変数のスコープなどについてもう一度おさらいすることを強くお勧
めします。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

すいません。書く場所はわかります・・


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

C**Doc::C**Doc()
:m_pImage(NULL)
{

}

C**Doc::~C**Doc()
{
if(m_pImage) delete m_pImage;
}


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

ありがとうございます。やってみます。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

CImageが定義されているヘッダファイルをincludeしているのですが、
// アトリビュート
public:
  CImage *m_pImage;

こうすると、エラーが大量におきます・・


返信引用
***
 ***
(@***)
ゲスト
結合: 22年前
投稿: 18
 

CImageが定義されているヘッダファイルの中身を全部表示してください。

たぶん、

#if !defined(_IMAGE_H_)
#define _IMAGE_H_

<CImageクラスが宣言されているところ>

#endif

これがないだけだと思いますが。


返信引用
ゆば
 ゆば
(@ゆば)
ゲスト
結合: 22年前
投稿: 32
Topic starter  

// image.h image class
#define HEADER_SIZE 7904
#define IMAGEDATA_SIZE 65536

ヘッダファイルはこうなっています・・
class CImage

{

public:
char *header;
unsigned short *pImage;

public:

CImage();
~CImage();

};


返信引用
固定ページ 3 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました