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

通知
すべてクリア

[解決済] 助言求む

固定ページ 2 / 5

気になったのですが
 気になったのですが
(@気になったのですが)
ゲスト
結合: 22年前
投稿: 1
 

for ( i=0; i<HEADER_SIZE; i++, tmp++) {
fp->Read( tmp, sizeof( unsigned short ) )
}
このるーぷおかしいのでは
CImage().pImageのサイズって[IMAGEDATA_SIZE]なのでは

fp->Read(c_image->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);

こうなるのではないですか?


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

>for ( i=0; i<HEADER_SIZE; i++, tmp++) {
> fp->Read( tmp, sizeof( unsigned short ) )
>}
>このるーぷおかしいのでは
>CImage().pImageのサイズって[IMAGEDATA_SIZE]なのでは
>
>fp->Read(c_image->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
>
>こうなるのではないですか?

そうです;;間違ってました・・でもまだ問題は解決しません・・


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

>このc_imageがどこで宣言されているかを教えてください。
>.cppで、関数の中(例えばnewの直前)で宣言していますか?
>それともどこか別の場所で宣言していますか?

CDocクラスのCDoc()のところです


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

CDoc::CDon()
{
.
.
CImage *cimage;
.
.
.
}

ってことですか?これじゃ保持できません。
変数のスコープや寿命などについてどの程度理解してますか?


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

誤字です。
>CDoc::CDon()
CDoc::CDoc()
でした。すいません。


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

>CDoc::CDon()
{
.
.
> CImage *cimage;
.
.
.
}

>ってことですか?これじゃ保持できません。
>変数のスコープや寿命などについてどの程度理解してますか?

あまりよくわからないです・・CImage *cimage;でそのクラスのものを使えるのではないのです
か?


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

euro2004さん、間違いです。CImage *cimage;は
{クラスの動作の定義を行います}というところで宣言しています。


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

そいません。言い方が悪かったです;;


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

>そいません。言い方が悪かったです;;

すいませんです(汗


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

>>ってことですか?これじゃ保持できません。
>>変数のスコープや寿命などについてどの程度理解してますか?

>あまりよくわからないです・・CImage *cimage;でそのクラスのものを使えるのではないので

か?

Cから修行してみては?


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

Serialize(CArchive& ar)にすべて書くことにしました。ですがデータが読めません。
これはどういうことでしょうか?#define HEADER_SIZE 7904、#define IMAGEDATA_SIZE
65536、 char *header;、unsigned short *pImage;は宣言しました
CFile* fp = ar.GetFile();
filePath = fp -> GetFilePath();

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

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

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


返信引用
適当
 適当
(@適当)
ゲスト
結合: 22年前
投稿: 2
 

読み込みファイルはどんなのですか


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

Serialize(CArchive& ar)ではなくダイアログを作ってフォルダを開いて読むプログラムだと
読めるんですよ。
でもファイル(右上の)から選択したいんでSerialize(CArchive& ar)で行いたいんですよ。
下のがフォルダをつかったものです。これだと読めます。

void C**View::OnOpendir()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
BROWSEINFO bi;
TCHAR szDir[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
// Shell の標準のアロケータを取得
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
// BROWSEINFO 構造体を埋める
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = m_hWnd; // オーナーウィンドウハンドルを設定
bi.pidlRoot = 0;
bi.pszDisplayName = 0;
bi.lpszTitle = タイトルです。;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
// フォルダの参照ダイアログボックスの表示
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
if (SHGetPathFromIDList(pidl,szDir))
{
m_folderName = szDir;
SetDlgItemText( IDC_DIRECTORY, m_folderName );
}
pMalloc->Free(pidl);
}
pMalloc->Release();
}
SetCurrentDirectory( m_folderName );
if( find.FindFile( GetWildCardFromDlg(), 0 )) {
find.FindNextFile();
m_fileName = find.GetFileName();
SetDlgItemText( IDC_SRCFILENAME, m_fileName );
DisplayImage( find.GetFilePath() );

}
}
CString C**View::GetWildCardFromDlg()
{
return ( *.MR );

}
int lastflag = 0;

そして別クラスで
void CImage::ReadDataFromFile(LPCSTR fileName)
{
CFile hFile;

hFile.Open( fileName, CFile::modeRead, NULL );

if( hFile.GetLength() < HEADER_SIZE ) {
hFile.Close();

return;

}

hFile.Seek( HEADER_SIZE, CFile::begin );

int i;

unsigned short *tmp;

for ( i=0, tmp=pImage; i<256*256; i++, tmp++ ) {

hFile.Read( tmp, sizeof( unsigned short ) );

}

hFile.Close();

}
となっています。
これをファイルから開けるようにしたいんです。教えて欲しいです。


返信引用
適当
 適当
(@適当)
ゲスト
結合: 22年前
投稿: 2
 

// C**Doc シリアライゼーション

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

こんなかんじじゃだめなんですか


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

アスキーファイル(テキストファイル)じゃなくてバイナリーファイルだったんだ・・・。

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

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

そしてシリアライズでは
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->pImage,sizeof(unsigned short)*IMAGEDATA_SIZE);
}
}
とします。
シリアライズの関数の中はこれだけで十分です。
他に余分なものはいらないはずです。
何に使うのかわからないフルパスの取得やファイルポインタを使用しての読み込みといった
複雑なプログラムよりはこの方が単純でわかりやすいと思います。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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