int型の整数とchar型ポインタポインタとint型ポインタを入力して16進数表記のchar型文字列と文字列の長さを出力するDP_intfwrite関数と、char型のstrポインタとint型のsize変数から成るDP_STR_hashcal構造体を宣言してそれらをDP_intfwrite関数に入力して出力結果をprintfで表示するmain関数を下記のように書きました。
そうしたら、DP_intfwrite関数内で16進数表記のchar型文字列をDP_STR_hashcal.strに格納する段階で書き込み違反が起きてしまいました。
デバッガでDP_STR_hashcal.strの内容を見た所、DP_intfwrite関数を呼び出す前の時点で「 = CXX0030: エラーです: 式を評価できません」という内容になっていました。
NULLを代入した後もNULLポインタにならずこの内容のままだったので定義か宣言の時点で間違っているのだと思うのですが、どこが間違っているのかが分かりません。
一体どのような間違いをしてしまっているのでしょうか?どなたかよろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <commctrl.h>
#include <shlwapi.h>
#include <math.h>
#define DEF_DP_Hassh_Size 16
#define DEF_DP_Int_Size 9
#define DEF_DP_Absolute_Int_Size 8
#define DEF_DP_Int_Plus '0'
#define DEF_DP_Int_Minus '1'
#define DEF_DP_Int_NumBase 16
#define DEF_DP_FileSignature_Word "|GM1"
#define DEF_DP_FileSignature_Size 4
#define DEF_DP_FileVersion_Word "0.10"
#define DEF_DP_FileVersion_Size 4
#define DEF_DP_MaterialChunk_ChunkType_Word "/MTL"
#define DEF_DP_MaterialChunk_ChunkType_Size 4
#define DEF_DP_MaterialChunk_IntDataNum 5
#define DEF_DP_SinATileChunk_ChunkType_Word "\ATL"
#define DEF_DP_SinATileChunk_ChunkType_Size 4
#define DEF_DP_SinATileChunk_AbsIntDataNum 1
#define DEF_DP_SinATileChunk_IntDataNum 4
#define DEF_DP_SinNTileChunk_ChunkType_Word "\NTL"
#define DEF_DP_SinNTileChunk_ChunkType_Size 4
#define DEF_DP_SinNTileChunk_AbsIntDataNum 1
#define DEF_DP_SinNTileChunk_IntDataNum 4
#define DEF_DP_SinPanrmChunk_ChunkType_Word "\PNR"
#define DEF_DP_SinPanrmChunk_ChunkType_Size 4
#define DEF_DP_SinPanrmChunk_AbsIntDataNum 1
#define DEF_DP_SinPanrmChunk_IntDataNum 3
#define DEF_DP_SinFogChunk_ChunkType_Word "\FOG"
#define DEF_DP_SinFogChunk_ChunkType_Size 4
#define DEF_DP_SinFogChunk_AbsIntDataNum 1
#define DEF_DP_SinFogChunk_IntDataNum 3
char DP_DigitNumStr[DEF_DP_Int_NumBase]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
typedef struct{
char *str;
int size;
}DP_STR_hashcal;
int DP_intfwrite(int i_num,int i_abslt,char **i_p_writedata,int *i_p_writesize){
int size,numbase,digitnum,roop1;
static char writestr[DEF_DP_Int_Size];
//+-判定
if(i_num < 0)
writestr[0] = DEF_DP_Int_Minus;
else
writestr[0] = DEF_DP_Int_Plus;
//16進数変換
for(roop1=DEF_DP_Int_Size-1;roop1>0;roop1--){
numbase = (int)pow((double)DEF_DP_Int_NumBase,(double)(roop1-1));
digitnum = (i_num/numbase)%DEF_DP_Int_NumBase;
if(roop1==DEF_DP_Int_Size-1 && digitnum > DEF_DP_Int_NumBase-1 )
return FALSE;
writestr[DEF_DP_Int_Size-roop1] = DP_DigitNumStr[digitnum];
}
//文字列返す
for(roop1 = i_abslt;roop1<DEF_DP_Int_Size;roop1++)
*i_p_writedata[roop1-i_abslt] = writestr[roop1];
//書き込み内容を返す
if(i_abslt == TRUE)
size = DEF_DP_Absolute_Int_Size;
else if(i_abslt == FALSE)
size = DEF_DP_Int_Size;
else
return FALSE;
i_p_writesize = &size;
return TRUE;
}
// メイン関数
int main( void )
{
DP_STR_hashcal test;
int a,b;
int errorcheck;
test.size = 0;
test.str = NULL;
while(1){
printf("16進数に変換する10進数->");
scanf("%d",&a);
printf("\n");
printf("絶対数出力の適用?(yes->1:no->0)->");
scanf("%d",&b);
printf("\n");
errorcheck = DP_intfwrite(a,b,&test.str,&test.size);
if(errorcheck==TRUE)
printf("str:%s◆size:%d\n",test.str,test.size);
else
printf("error\n");
}
return 0;
}