私はここで小さな問題に取り組んでおり、私のコードはほとんど機能します。
ここに私の問題があります。
次のようにフロートを使用してフィールドのツリーを割り当てようとしています:
float ** PermLaster;
float ** VarLaster;
その後、callocを使用します
PermLaster= (float **) calloc(AntPermLast, sizeof(float*));
VarLaster= (float **) calloc(AntVarLast, sizeof(float*));
次に、ネストされた for で再度 calloc を実行します。
for (StegLastAnt= 0; StegLastAnt < sizeLastM;StegLastAnt++)
{
AktLast = inLastP[StegLastAnt];
if (StegLastAnt > 0)
{
OldAktLast=inLastP[StegLastAnt-1];
}
if (((int(inLastP[7*(sizeLastM-1)+StegLastAnt+7])== 0)||(int(inLastP[7*(sizeLastM-1)+StegLastAnt+6])== 0)) && (AktLast != OldAktLast))
{
PermLaster[NumPerm] = (float *) calloc(AntAktuell*6, sizeof(float));
AntLastVekt[NumPerm]=AntAktuell;
NumPerm++;
AntAktuell=0;
}
if ((int(inLastP[7*(sizeLastM-1)+StegLastAnt+7])== 1) && (AktLast != OldAktLast) && (int(inLastP[7*(sizeLastM-1)+StegLastAnt+6]) != 0))
{
VarLaster[NumVar] = (float *) calloc(AntAktuell*6, sizeof(float));
AntLastVekt[NumPerm+NumVar]=AntAktuell;
NumVar++;
AntAktuell=0;
}
AntAktuell++;
}
これまでのところエラーはありません。
次に、すべての要素が割り当てられます。
for (StegLastAnt= 0; StegLastAnt < sizeLastM;StegLastAnt++)
{
AktLast = inLastP[StegLastAnt];
if (StegLastAnt > 0)
{
OldAktLast=inLastP[StegLastAnt-1];
}
if (((int(inLastP[7*(sizeLastM-1)+StegLastAnt+7])== 0)||(int(inLastP[7*(sizeLastM-1)+StegLastAnt+6])== 0)) && (AktLast != OldAktLast))
{
PLastP = PermLaster[NumPerm];
RadPos=StegLastAnt-AntAktuell;
for (StegLastAnt2 = 0;StegLastAnt2<AntAktuell;StegLastAnt2++)
{
PLastP[StegLastAnt2*6+0]=float(inLastP[1*(sizeLastM-1)+RadPos+1]);PLastP[StegLastAnt2*6+1]=float(inLastP[2*(sizeLastM-1)+RadPos+2]);PLastP[StegLastAnt2*6+2]=float(inLastP[3*(sizeLastM-1)+RadPos+3]);PLastP[StegLastAnt2*6+3]=float(inLastP[4*(sizeLastM-1)+RadPos+4]);PLastP[StegLastAnt2*6+4]=float(inLastP[5*(sizeLastM-1)+RadPos+5]);PLastP[StegLastAnt2*6+5]=float(inLastP[6*(sizeLastM-1)+RadPos+6]);
RadPos++;
}
NumPerm++;
AntAktuell=0;
PLastP=nullptr;
}
if ((int(inLastP[7*(sizeLastM-1)+StegLastAnt+7])== 1) && (AktLast != OldAktLast) && (int(inLastP[7*(sizeLastM-1)+StegLastAnt+6]) != 0))
{
VLastP = VarLaster[NumVar];
RadPos=StegLastAnt-AntAktuell;
for (StegLastAnt2 = 0;StegLastAnt2<AntAktuell;StegLastAnt2++)
{
VLastP[StegLastAnt2*6+0]=float(inLastP[1*(sizeLastM-1)+RadPos+1]);VLastP[StegLastAnt2*6+1]=float(inLastP[2*(sizeLastM-1)+RadPos+2]);VLastP[StegLastAnt2*6+2]=float(inLastP[3*(sizeLastM-1)+RadPos+3]);VLastP[StegLastAnt2*6+3]=float(inLastP[4*(sizeLastM-1)+RadPos+4]);VLastP[StegLastAnt2*6+4]=float(inLastP[5*(sizeLastM-1)+RadPos+5]);VLastP[StegLastAnt2*6+5]=float(inLastP[6*(sizeLastM-1)+RadPos+6]);
RadPos++;
}
NumVar++;
AntAktuell=0;
VLastP=nullptr;
}
AntAktuell++;
}
入力からの読み取り、およびデバッグを行っていますが、正常に動作します。何が起こっているのかを確認し、デバッグしやすくするために、意図的に余分な for ループを避けています (見栄えは悪くなりますが)。正常に動作します。入力される値を確認しましたが、正しい値です。破損したアドレスでも問題ありません。
次に、多くのコードの後、それを解放します。
for (StegLastAnt= 0; StegLastAnt < AntPermLast;StegLastAnt++)
{
free(PermLaster[StegLastAnt]);
}
ここでは、バナナが行き、ヒープの破損について不平を言います。
for (StegLastAnt= 0; StegLastAnt < AntVarLast-1;StegLastAnt++)
{
free(VarLaster[StegLastAnt]);
}
free(PermLaster), free(VarLaster);
フィールドが通過した関数はすべて、const float への const ポインター const ポインターとして "PermLaster" を持っていました。アドレスは変更されておらず、内部フィールドの値も変更されていません。メモリは問題ないようですが、なぜこのようなことが起こっているのでしょうか? サブフィールドに異なるサイズを使用した可能性があります (アプリケーションに使用する必要があり、それを回避する方法はありません)。代わりに realloc を使用する方がよいでしょうか? new と delete を使用して C++ に切り替えますか?
もう 1 つ、ポインター PermLaster へのポインターは、渡される関数を介して制限として宣言されます。おそらくそれには問題がありますか?
より多くの構造体またはクラスを使用すると言う人もいると思いますが、問題をそれ以上に大きくしないようにしています。
ここで良い提案をしてくれてとても感謝しています。
ジョン