1

私はイタリア人なので、英語が下手で申し訳ありません。また、この質問の投稿に間違いがあった場合は申し訳ありませんが、これは私の最初の質問なので、親切にしてください、ありがとう!

私はこのインライン関数を書いています。フォーラムにはこのようなタイトルの質問がたくさんあることは知っていますが、誰も助けてくれません!

コードは次のとおりです。

inline int dapotare (int* i_node,int* j_node,int* q_infr,int *value,double *D,double *Q,int level,int nStart,int nEdge,int nInfrastructureTypes,int *risultato)
{int in_esame,attivi=0,inattivi=0,scope,stop;
int *predecessore = new int [nStart] ;
int **numInattivi= new int* [nStart];
int *comulatore = new int [nStart];;
int *BS = new int [nStart];
bool daCentrale=false;              //se true significa che esiste una y_{i,j}^q=1 dove i è il nodo centrale

for(int i=0;i<nStart;i++)
    numInattivi[i] = new int [nStart];

for(int i=0;i<nStart;i++)
    for(int j=0;j<nStart;j++)
        numInattivi[i][j]=0;
for(int i=0;i<=level;i++)
    if(value[i]==1)
        {attivi++;
        if(i_node[i]==nStart-1)
            {daCentrale=true;
            cout<<"il nodo centrale ha almeno un arco uscente!"<<endl;
            }
        }
    else
        {numInattivi[i_node[i]][j_node[i]]++;
        if(numInattivi[i_node[i]][j_node[i]]==nInfrastructureTypes && numInattivi[i_node[i]][j_node[i]]==nInfrastructureTypes)
            inattivi++;
        }
if(attivi>=nStart-1||attivi+inattivi==nEdge*2||daCentrale/*||inattivi>=nEdge-nStart+1*/)
    {risultato[0]=1;
    risultato[1]=attivi;
    risultato[2]=inattivi;
    for(int actual=0;actual<nStart;actual++)
        delete []numInattivi[actual];
    delete []predecessore;
    delete []comulatore;
    delete []BS;
    return 1;
    }

//definisco i predecessori dei nodi
for(int i=0;i<nStart;i++)                       
    predecessore[i]=-1;
for(int i=0;i<=level;i++)
    if(value[i]==1)
            {if(predecessore[i_node[i]]!=-1)
                {cout<<i_node[i]<<" ha almenno due archi uscenti!"<<endl;
                risultato[0]=1;
                risultato[1]=attivi;
                risultato[2]=inattivi;
                for(int actual=0;actual<nStart;actual++)
                    delete []numInattivi[actual];
                delete []numInattivi;
                delete []predecessore;
                delete []comulatore;
                delete []BS;
                return 1;
                }
            else
                {predecessore[i_node[i]]=j_node[i];
                }
            }
    else
            predecessore[i]=-1;

//controllo che il grafo sia aciclico
for(int i=0;i<=level;i++)                       //controllo che il grafo sia aciclico
    {in_esame=predecessore[i_node[i]];
        for(int j=0;j<level&&in_esame!=-1;j++)  //se predecessore[in_esame]==-1 significa che non ho incontrato cicli
            if(predecessore[in_esame]==i_node[i])
                {cout<<"STAMPA DEI PREDECESSORI:"<<endl;
                for(int actual=0;actual<level;actual++)
                    cout<<"predecessore["<<actual<<"]= "<<predecessore[actual]<<endl;
                cout<<"in_esame="<<in_esame<<endl;
                cout<<i_node[i]<<" crea un ciclo!"<<endl;
                risultato[0]=1;
                risultato[1]=attivi;
                risultato[2]=inattivi;
                //cin>>stop;
                for(int actual=0;actual<nStart;actual++)
                    delete []numInattivi[actual];
                delete []predecessore;
                delete []comulatore;
                delete []BS;
                return 1;
                }
            else
                in_esame=predecessore[in_esame];
    }
//definisco il comulatore di ciascun nodo e controllo che nessun nodo del grafo parziale sia sovraccaricato
for(int i=0;i<nStart-1;i++)     //inizializziamo comulatore
        comulatore[i]=-D[i];
for(int i=0;i<nStart-1;i++)     //definiamo BS
        {BS[i]=0;
        for(int j=0;j<nStart-1;j++)
            if(predecessore[j]==i)  //j è figlio di i
                BS[i]++;
        }
for(int i=0;i<nStart-1;i++)
    cout<<"D["<<i<<"]= "<<D[i]<<endl;
for(int i=0;i<nStart-1;i++)
    cout<<"predecessore["<<i<<"]= "<<predecessore[i]<<endl;
for(int i=0;i<nStart-1;i++)
    cout<<"BS["<<i<<"]= "<<BS[i]<<endl;
cout<<"Prima del comulatore"<<endl;
for(int i=0;i<nStart-1;i++)
        {for(int j=0;j<nStart-1;j++)
            {for(int actual=0;actual<=level;actual++)
                {if(i_node[actual]==j&&value[actual]==1&&BS[j]==0)
                    {comulatore[predecessore[j]]+=comulatore[j];
                    BS[predecessore[j]]--;
                    BS[j]=-1;
                    }
                }
            }
        }
for(int i=0;i<nStart-1;i++)
    cout<<"comulatore["<<i<<"]= "<<comulatore[i]<<endl;
for(int actual=0;actual<=level;actual++)
    {if(comulatore[i_node[actual]]>Q[q_infr[actual]]&&value[actual]==1)
        {cout<<i_node[actual]<<" è sovraccaricato: comulaotre["<<i_node[actual]<<"]= "<<comulatore[i_node[actual]]<<" Q[q_infr]="<<Q[q_infr[actual]]<<endl;
        risultato[0]=1;
        risultato[1]=attivi;
        risultato[2]=inattivi;
        for(int actual=0;actual<nStart;actual++)
            delete []numInattivi[actual];
        delete []predecessore;
        delete []comulatore;
        delete []BS;
        return 1;
        }
    }

risultato[0]=0;             //Tutto ok! Non ci interessa il valore degli inattivi e inattivi se non c'è niente da potare
risultato[1]=0;
risultato[2]=0;
for(int actual=0;actual<nStart;actual++)
    delete[] numInattivi[actual];
cout<<"superato il for"<<endl;
delete[] numInattivi;
cout<<"superato numInattivi"<<endl;
delete[] predecessore;
cout<<"superato il predecessore"<<endl;
delete[] comulatore;
cout<<"superato comulatore"<<endl;
delete[] BS;
cout<<"superato BS"<<endl;
return 0;
}

そして、実行時に返されるエラーは次のとおりです。

  *** glibc detected *** ./main: free(): invalid next size (fast): 0x09cb7d48 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb6567ee2]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb678f51f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdaPv+0x1b)[0xb678f57b]
./main[0x8057312]
./main[0x805591a]
./main[0x804a9ab]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb650b4d3]
./main[0x804abd5]
======= Memory map: ========
08048000-0805a000 r-xp 00000000 07:00 2360       /home/luca-kun/Desktop/LOG/BranchAndBound/main
0805a000-0805b000 r--p 00011000 07:00 2360       /home/luca-kun/Desktop/LOG/BranchAndBound/main
0805b000-0805c000 rw-p 00012000 07:00 2360       /home/luca-kun/Desktop/LOG/BranchAndBound/main
09cb3000-09cd4000 rw-p 00000000 00:00 0          [heap]
b5843000-b5846000 rw-p 00000000 00:00 0 
b5846000-b5848000 r-xp 00000000 07:00 590098     /lib/i386-linux-gnu/libutil-2.15.so
b5848000-b5849000 r--p 00001000 07:00 590098     /lib/i386-linux-gnu/libutil-2.15.so
b5849000-b584a000 rw-p 00002000 07:00 590098     /lib/i386-linux-gnu/libutil-2.15.so
b584a000-b584b000 rw-p 00000000 00:00 0 
b584b000-b584e000 r-xp 00000000 07:00 590114     /lib/i386-linux-gnu/libdl-2.15.so
b584e000-b584f000 r--p 00002000 07:00 590114     /lib/i386-linux-gnu/libdl-2.15.so
b584f000-b5850000 rw-p 00003000 07:00 590114     /lib/i386-linux-gnu/libdl-2.15.so
b5850000-b589f000 r-xp 00000000 07:00 297406     /usr/lib/openmpi/lib/libopen-pal.so.0.0.0
b589f000-b58a0000 r--p 0004e000 07:00 297406     /usr/lib/openmpi/lib/libopen-pal.so.0.0.0
b58a0000-b58a2000 rw-p 0004f000 07:00 297406     /usr/lib/openmpi/lib/libopen-pal.so.0.0.0
b58a2000-b58a4000 rw-p 00000000 00:00 0 
b58a4000-b58ed000 r-xp 00000000 07:00 297407     /usr/lib/openmpi/lib/libopen-rte.so.0.0.0
b58ed000-b58ee000 r--p 00048000 07:00 297407     /usr/lib/openmpi/lib/libopen-rte.so.0.0.0
b58ee000-b58f0000 rw-p 00049000 07:00 297407     /usr/lib/openmpi/lib/libopen-rte.so.0.0.0
b58f0000-b58f1000 rw-p 00000000 00:00 0 
b58f1000-b58f2000 r-xp 00000000 07:00 300602     /usr/lib/libblacsCinit-openmpi.so.1.1
b58f2000-b58f3000 r--p 00000000 07:00 300602     /usr/lib/libblacsCinit-openmpi.so.1.1
b58f3000-b58f4000 rw-p 00001000 07:00 300602     /usr/lib/libblacsCinit-openmpi.so.1.1
b58f4000-b5987000 r-xp 00000000 07:00 297402     /usr/lib/openmpi/lib/libmpi.so.0.0.2
b5987000-b5988000 r--p 00093000 07:00 297402     /usr/lib/openmpi/lib/libmpi.so.0.0.2
b5988000-b5995000 rw-p 00094000 07:00 297402     /usr/lib/openmpi/lib/libmpi.so.0.0.2
b5995000-b599e000 rw-p 00000000 00:00 0 
b599e000-b59b3000 r-xp 00000000 07:00 300611     /usr/lib/libpord-4.9.2.so
b59b3000-b59b4000 r--p 00014000 07:00 300611     /usr/lib/libpord-4.9.2.so
b59b4000-b59b5000 rw-p 00015000 07:00 300611     /usr/lib/libpord-4.9.2.so
b59b5000-b5a27000 r-xp 00000000 07:00 521780     /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b5a27000-b5a28000 r--p 00071000 07:00 521780     /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b5a28000-b5a29000 rw-p 00072000 07:00 521780     /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b5a29000-b5a5a000 r-xp 00000000 07:00 300598     /usr/lib/libblacs-openmpi.so.1.1
b5a5a000-b5a5b000 r--p 00030000 07:00 300598     /usr/lib/libblacs-openmpi.so.1.1
b5a5b000-b5a5c000 rw-p 00031000 07:00 300598     /usr/lib/libblacs-openmpi.so.1.1
b5a5c000-b6040000 r-xp 00000000 07:00 300606     /usr/lib/libscalapack-openmpi.so.1.8.0
b6040000-b6041000 r--p 005e3000 07:00 300606     /usr/lib/libscalapack-openmpi.so.1.8.0
b6041000-b6043000 rw-p 005e4000 07:00 300606     /usr/lib/libscalapack-openmpi.so.1.8.0
b6043000-b6095000 rw-p 00000000 00:00 0 
b6095000-b60c0000 r-xp 00000000 07:00 297404     /usr/lib/openmpi/lib/libmpi_f77.so.0.0.1
b60c0000-b60c1000 r--p 0002a000 07:00 297404     /usr/lib/openmpi/lib/libmpi_f77.so.0.0.1
b60c1000-b60c2000 rw-p 0002b000 07:00 297404     /usr/lib/openmpi/lib/libmpi_f77.so.0.0.1
b60c2000-b60c3000 rw-p 00000000 00:00 0 
b60c3000-b60ff000 r-xp 00000000 07:00 300610     /usr/lib/libmumps_common-4.9.2.so
b60ff000-b6100000 r--p 0003b000 07:00 300610     /usr/lib/libmumps_common-4.9.2.so
b6100000-b6101000 rw-p 0003c000 07:00 300610     /usr/lib/libmumps_common-4.9.2.so
b6101000-b61ff000 r-xp 00000000 07:00 568549     /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b61ff000-b6200000 r--p 000fe000 07:00 568549     /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b6200000-b6201000 rw-p 000ff000 07:00 568549     /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b6201000-b6202000 rw-p 00000000 00:00 0 
b6202000-b64d3000 r-xp 00000000 07:00 298969     /usr/lib/atlas-base/atlas/libblas.so.3gf.0
b64d3000-b64d7000 rw-p 002d1000 07:00 298969     /usr/lib/atlas-base/atlas/libblas.so.3gf.0
b64d7000-b64ee000 r-xp 00000000 07:00 590108     /lib/i386-linux-gnu/libpthread-2.15.so
b64ee000-b64ef000 r--p 00016000 07:00 590108     /lib/i386-linux-gnu/libpthread-2.15.so
b64ef000-b64f0000 rw-p 00017000 07:00 590108     /lib/i386-linux-gnu/libpthread-2.15.so
b64f0000-b64f2000 rw-p 00000000 00:00 0 
b64f2000-b6695000 r-xp 00000000 07:00 590099     /lib/i386-linux-gnu/libc-2.15.so
b6695000-b6697000 r--p 001a3000 07:00 590099     /lib/i386-linux-gnu/libc-2.15.so
b6697000-b6698000 rw-p 001a5000 07:00 590099     /lib/i386-linux-gnu/libc-2.15.so
b6698000-b669c000 rw-p 00000000 00:00 0 
b669c000-b66b8000 r-xp 00000000 07:00 554764     /lib/i386-linux-gnu/libgcc_s.so.1
b66b8000-b66b9000 r--p 0001b000 07:00 554764     /lib/i386-linux-gnu/libgcc_s.so.1
b66b9000-b66ba000 rw-p 0001c000 07:00 554764     /lib/i386-linux-gnu/libgcc_s.so.1
b66ba000-b66e4000 r-xp 00000000 07:00 590110     /lib/i386-linux-gnu/libm-2.15.so
b66e4000-b66e5000 r--p 00029000 07:00 590110     /lib/i386-linux-gnu/libm-2.15.so
b66e5000-b66e6000 rw-p 0002a000 07:00 590110     /lib/i386-linux-gnu/libm-2.15.so
b66e6000-b67be000 r-xp 00000000 07:00 527383     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b67be000-b67bf000 ---p 000d8000 07:00 527383     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b67bf000-b67c3000 r--p 000d8000 07:00 527383     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b67c3000-b67c4000 rw-p 000dc000 07:00 527383     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
b67c4000-b67cb000 rw-p 00000000 00:00 0 
b67cb000-b68f2000 r-xp 00000000 07:00 300609     /usr/lib/libdmumps-4.9.2.so
b68f2000-b68f3000 r--p 00126000 07:00 300609     /usr/lib/libdmumps-4.9.2.so
b68f3000-b68f4000 rw-p 00127000 07:00 300609     /usr/lib/libdmumps-4.9.2.so
b68f4000-b68f5000 rw-p 00000000 00:00 0 
b68f5000-b6909000 r-xp 00000000 07:00 521548     /lib/i386-linux-gnu/libz.so.1.2.3.4
b6909000-b690a000 r--p 00013000 07:00 521548     /lib/i386-linux-gnu/libz.so.1.2.3.4
b690a000-b690b000 rw-p 00014000 07:00 521548     /lib/i386-linux-gnu/libz.so.1.2.3.4
b690b000-b690c000 rw-p 00000000 00:00 0 
b690c000-b70d3000 r-xp 00000000 07:00 298970     /usr/lib/atlas-base/atlas/liblapack.so.3gf.0
b70d3000-b70d7000 rw-p 007c6000 07:00 298970     /usr/lib/atlas-base/atlas/liblapack.so.3gf.0
b70d7000-b71e4000 rw-p 00000000 00:00 0 
b71e4000-b72fd000 r-xp 00000000 07:00 300909     /lib/libCoinUtils.so.3.8.5
b72fd000-b7300000 rw-p 00118000 07:00 300909     /lib/libCoinUtils.so.3.8.5
b7300000-b734d000 r-xp 00000000 07:00 300939     /lib/libOsi.so.1.10.2
b734d000-b734f000 rw-p 0004d000 07:00 300939     /lib/libOsi.so.1.10.2
b734f000-b74b8000 r-xp 00000000 07:00 300887     /lib/libClp.so.1.11.5
b74b8000-b74bb000 rw-p 00169000 07:00 300887     /lib/libClp.so.1.11.5
b74bb000-b759d000 r-xp 00000000 07:00 300885     /lib/libCgl.so.1.7.2
b759d000-b759f000 rw-p 000e1000 07:00 300885     /lib/libCgl.so.1.7.2
b759f000-b768b000 r-xp 00000000 07:00 300877     /lib/libCbc.so.3.7.5
b768b000-b7690000 rw-p 000ec000 07:00 300877     /lib/libCbc.so.3.7.5
b7690000-b7691000 rw-p 00000000 00:00 0 
b7691000-b76cd000 r-xp 00000000 07:00 300943     /lib/libOsiClp.so.1.11.5
b76cd000-b76ce000 rw-p 0003c000 07:00 300943     /lib/libOsiClp.so.1.11.5
b76ce000-b76da000 r-xp 00000000 07:00 262019     /lib/libOsiCbc.so.3.7.5
b76da000-b76db000 rw-p 0000b000 07:00 262019     /lib/libOsiCbc.so.3.7.5
b76f1000-b76f7000 rw-p 00000000 00:00 0 
b76f7000-b76f8000 r-xp 00000000 00:00 0          [vdso]
b76f8000-b7718000 r-xp 00000000 07:00 590111     /lib/i386-linux-gnu/ld-2.15.so
b7718000-b7719000 r--p 0001f000 07:00 590111     /lib/i386-linux-gnu/ld-2.15.so
b7719000-b771a000 rw-p 00020000 07:00 590111     /lib/i386-linux-gnu/ld-2.15.so
bf951000-bf972000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)

誰でも私を助けることができますか?私の質問に答えてくれる皆さん、ありがとう!

4

2 に答える 2

0

このコードは本当に混乱しています。そうは言っても、かなりの数の奇妙なことがわかります。

1) 割り当てているのは誰risultatoですか? それに3つのintが割り当てられていますか?

2)コードはこれを行います

if(numInattivi[i_node[i]][j_node[i]]==nInfrastructureTypes &&
   numInattivi[i_node[i]][j_node[i]]==nInfrastructureTypes)

同じことを2回チェックすることが役立つと本当に思いますか?

3) ループfor(int i=0;i<=level;i++)level+1要素を使用しておりvalue、 、i_nodeおよびj_node十分な大きさですか?

4)あなたは漏れていますnumInattivi(常にではありません)。単に使用するのではなく、これらすべての明示的な割り当てとポインターをいじるのはなぜstd::vectorですか? 同じ速度ですが、はるかに使いやすくなっています。

5)predecessoreノード番号で索引付けされているように見えますが、同じループ内でori=0,1,...,levelの代わりに直接索引付けされることがあります。これは正しいです?i_node[i]j_node[i]

6) プログラムの残りの部分が同じように書かれている場合、おそらくどこでもメモリが混乱している可能性があり、これを適切に実行する望みはありません。この関数でエラーが発生したという事実は何の意味もありません...メモリで悪いことをすると、後で実行された数百万の命令がクラッシュする可能性があります。

于 2013-08-22T20:16:07.033 に答える