kobo様
ご回答ありがとうございます。
私も独学なので、アホなことばかりしております><
引用:
②から Forで繰り返し処理をされているのかなと思いますが
③で開放したあと①でメモリ確保をしていますが
callocの説明に「malloc関数とは異なり、この関数ではメモリの0クリアを行います。」
とあり、mallocでは何かのデータが入っているかもしれないのが原因の1つではないかとおもったりしました。
①より 要るかいらないか分かりませんが文字列の最後は「0」で終わるようにしましょう的な事を
どっかで聞きかじっているので
buffer=malloc(lstrlen(TreeName) + Len(Ex"\n"))
↓
buffer=calloc(lstrlen(TreeName) + Len(Ex"\n") +1 )
のほうが安全ぽいなぁと思いました。
上の画像をご覧いただければ見えやすくなると思いますが、
ツリービューをもちいたテキストエディタで、内容をアーカイブ保存しようとしていますので、
Forループでノードの内容すべてを保存しようとしております。
mallocもcallocも試したのですが、同じだったのです……
あ!NULL文字!!
確かに+1がいるかも知れません。
後でABのテキスト見なおしてみます!!
とりあえず、いじり回って気がついたことと解決と疑問と続きの質問をば。
まず、私の
コード:
buffer=malloc(lstrlen(TreeName) + Len(Ex"\n"))
lstrcat(buffer,TreeName)
lstrcat(buffer,Ex"\n")
ですが、連結かつ連結!となっています。
そりゃゴミつくわね……
コード:
buffer=malloc(lstrlen(TreeName) + Len(Ex"\n"))
lstrcpy(buffer,TreeName)
lstrcat(buffer,Ex"\n")
とするのが正解でした。
しかし、確保しているメモリ以上に連結してエラーが出なかったのはちょっと困りましたね……
もしかして、
引用:
※たまに、Heap block at ○○ modified at ×× past requested size of △と出ます(メモリが足り無い?)
※たまに、Invalid address specified to RtlFreeHeap(○○,☓☓ )と出ます(変なところに書き込まれている?)
これがそのエラーだったのかな……?
とりあえず、これで、おそらく、ファイルの保存はできたと思います。
保存は出来ました。
しかし、デバグ時に必ず、
Heap block at ○○ modified at ×× past requested size of △
が連発します。
なので、size of △の△をmallocするときに加えました。
エラーは消えますが、もちろん値が変わった時(例:△=3だった時にmallocで3を加えた。今度は△=6だとエラーが出る)に、
同じエラーが出るので、ちょっと腹が立ち、*2にするとエラーも出ず、値もしっかりファイルに保存されました。
何故*2にしたら保存されるのかが謎です。
あと、malloc、calloc関数ですが、これは上書きされるのかなぁ……?
みたいな疑問も。
Dim a As *Byte
a=malloc(10)
lstrcpy(a,"test data")
a=calloc(11)
lstrcpy(a,"test dataA")
free(a)
のようなプログラムだと、どうなっているのかな……みたいな。
メモリAが確保されたまま、違うメモリBを確保し、メモリBだけ解放されてる……
となっているのでしょうか。
……そうならないためのreallocなのかなぁ
さて、再度質問させて頂きます。
書き込んだデータを読み込むと、先と同様、いらぬ文字が付加されます。
保存したデータ
↓
読み込んだデータ
ツリーのノードを読み込む処理は、以下の様な感じです。
コード:
'ツリー名を確認
ReadByte=SearchOneTextPointFormFile(hFile,Ex"\n",StartPoint)
If ReadByte=0 Then
Exit Do
End If
TreeName=calloc(ReadByte)
'ファイルポインタを動かす
SetFilePointer(hFile,StartPoint,0,FILE_BEGIN)
If ReadFile(hFile,TreeName,ReadByte,VarPtr(ReadFileLen),ByVal 0)=FALSE Then
MessageBox(hMainWnd,Ex"ファイルの値が読み出せません\r\nError:TreeName","Error",MB_OK or MB_ICONWARNING)
free(NodeInfo)
free(TreeName)
Exit Do
End If
'検索開始ポイントをずらす
StartPoint=StartPoint+ReadByte+1
SearchOneTextPointFormFile関数は以下のように定義しています。
コード:
Function SearchOneTextPointFormFile(hFile As HFILE,Text As BytePtr,SearchStartPoint As Long) As Long
Dim temp[0] As Byte
Dim Count As Long
Dim ReadFileLen As DWord
Dim SearchPointLog As Long
'ファイルのポインタの位置を記録
SearchPointLog=SearchStartPoint
'ポインタを動かす
SetFilePointer(hFile,SearchStartPoint,0,FILE_BEGIN)
Do
If ReadFile(hFile,temp,1,VarPtr(ReadFileLen),ByVal 0)=FALSE or ReadFileLen=0 Then
Exit Do
End If
If lstrcmp(temp,Text)=0 Then
SearchOneTextPointFormFile=Count
'ポインタを戻す
SetFilePointer(hFile,SearchPointLog,0,FILE_BEGIN)
Exit Function
End If
Count++
Loop
SearchOneTextPointFormFile=0
'ポインタを戻す
SetFilePointer(hFile,SearchPointLog,0,FILE_BEGIN)
End Function
よろしくお願いいたします。