- PR -

各画像データに識別番号を付加し配列へ格納する方法

1
投稿者投稿内容
freebird
常連さん
会議室デビュー日: 2006/11/07
投稿数: 22
投稿日時: 2006-11-13 20:51
こんばんわ。

画像ファイルを、fread関数を用いて1024Byteずつ画像データを抽出し、各データに対して連番を付加し格納しています。

コンパイラはVC++.NET 2003です。

以下にプログラムを示します。

//パケット格納構造体
struct SPkt{
UINT SeqNum;
char SendPkt_Buf[1500];
}SendPkt;

int n;
char PktBuff[1500]
UINT SeqNumber = 0
UINT c = 0;

void SendPkt_Buf(UINT SeqNumber, char *PktBuf, int n, int c){

struct SPkt Pkt_Array[100];

Pkt_Array[c].SeqNum = SeqNumber;
memmove(Pkt_Array[c].SendPkt_Buf,PktBuf,n);
→@
}

while((n = fread(PktBuf,1,1024,fp)) != 0) {

//連番カウント
SeqNumber++;

SendPkt_Buf(SeqNumber,PktBuf,n, c);

//配列要素カウント
c++;
}

上記は、SPkt構造体に連番と画像データを格納するというプログラムを構築しました。
しかし、矢印@の場所にブレイクポイントを置き、格納されているか確認したところ、

Pkt_Array[0].SeqNumに1
Pkt_Array[0].SendPkt_Bufに画像データ
が格納されるのはよいのですが、

次のフェーズで同様の場所を確認したところ、
Pkt_Array[0].SeqNumに3435973836
Pkt_Array[0].SendPkt_Bufにフフフフフフフフ・・・・・

が格納されてしまいます。

Pkt_Array[0].SeqNum 1
Pkt_Array[1].SeqNum 2
Pkt_Array[3].SeqNum 3




Pkt_Array[0].SendPkt_Buf 画像データ(バイナリファイル)
Pkt_Array[1].SendPkt_Buf 画像データ(バイナリファイル)



という風に、格納したいのですが・・・

なにか方法はありますでしょうか?

よろしくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-11-13 22:04
引用:
コード:
void SendPkt_Buf(UINT SeqNumber, char *PktBuf, int n, int c){

struct SPkt Pkt_Array[100];

Pkt_Array[c].SeqNum = SeqNumber;
memmove(Pkt_Array[c].SendPkt_Buf,PktBuf,n);
→@
}



ローカル変数である、Pkt_Arrayに対して、ごにょごにょやっててもダメじゃね?。
後で、アクセスしたらセグるような気がする。
それとも、C++/CLI?そうは見えないけど。

先に、ちゃんと動的メモリ確保(mallocとか)を勉強した方がいいと思うよ。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-13 23:21
引用:

かずくんさんの書き込み (2006-11-13 22:04) より:
それとも、C++/CLI?そうは見えないけど。


VS2003 と書いてあるので、Managed C++ ですね、きっと。


SendPkt_Buf が再帰呼び出しされているけど、そんな必要あるのかな?ループで回せばすむ話じゃ?

ちげ。when の上で切れてるのか。。。もちっと、わかりやすく書こうよ(×_×;)

_________________
Jitta@わんくま同盟
Microsoft MVP for Visual Developer ASP/ASP.NET 2006/10-2007/9

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-11-13 23:22 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-11-14 09:48
引用:

Jittaさんの書き込み (2006-11-13 23:21) より:
引用:

かずくんさんの書き込み (2006-11-13 22:04) より:
それとも、C++/CLI?そうは見えないけど。


VS2003 と書いてあるので、Managed C++ ですね、きっと。



書き方がよく無かったですね。
__gcが見当たらないので、マネージ化しているようには見えない(.NETの管理下には置かないモジュール)という方がよかったかな。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-14 09:59
引用:

かずくんさんの書き込み (2006-11-14 09:48) より:
引用:

Jittaさんの書き込み (2006-11-13 23:21) より:
引用:

かずくんさんの書き込み (2006-11-13 22:04) より:
それとも、C++/CLI?そうは見えないけど。


VS2003 と書いてあるので、Managed C++ ですね、きっと。



書き方がよく無かったですね。
__gcが見当たらないので、マネージ化しているようには見えない(.NETの管理下には置かないモジュール)という方がよかったかな。


ですね。
VS2003だけでは、VCの場合マネージドもアンマネージドのプロジェクトが作成できますから、
VS2003=MC++ではないです。

ですので、freebirdさん、
どのプロジェクトでプログラミングしているのかを明記したほうがいいでしょう。

明記例)
WindowsXP SP2/Visual Studio 2003 - Win32 Application(MFC(SDI))
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-11-14 10:26
関数内で宣言されたスタック変数の値が、関数終了後に保持されておらず、再度関数を呼び出したときに不定となるのは、C++の仕様どおりの動作。保持したいならstatic変数にするか、グローバル変数として宣言する必要があります。まずは、C++の文法の基礎をおさらいしてください。特に変数の宣言とスコープに関して・・・・。

#ソースコードを記述するときには、BBコードを使ってください。
#スコープの概念が無い辺り、Perl出身者ですかね?
1

スキルアップ/キャリアアップ(JOB@IT)