1

これが私が現在使用しているコードです

template <class T>
float Knapsack<T>::knapTable()
{
  const int MAXSIZE = 40000;
  int temps = nObjects - 1;
  float** memoize = new float*[MAXSIZE];

  for(int y = 0; y < weight[nObjects]; y++)
    memoize[nObjects][y] = 0;

  for(int y = weight[nObjects]; y < knapCap; y++)
    memoize[nObjects][y] = price[y];

  for(int i = temps; i >= 1; i--)
  {
    for(int y = weight[i]; y < knapCap; y++)
      memoize[i][y]= max(memoize[i+1][y], (memoize[i+1][y-weight[i]]+price[i]));
  }

  return memoize[1][nObjects];

}

何らかの理由で、次のエラーが発生し続けます:knapsack.hpp:68:64:エラー:配列の添え字に対して無効なタイプ'float*[float]'。

これが次の行です。float**memoize= new float * [MAXSIZE];

何らかの理由で、コンパイラはMAXSIZEをfloatとして認識しているようですが、これはconstintです。

これを修正する方法はありますか?

より多くのコードヘッダーファイル用に編集#ifndefKNAPSACK_H#define KNAPSACK_H

#include <stdexcept>
#include <assert.h>
#include <iostream>
#include <limits.h>
using namespace std;

template <class T>
class Knapsack
{
  private:
    float knapPrice;
    int knapCap, nObjects;
    float weight[40000];
    float price[40000];
  public:

    Knapsack(): knapPrice(0), knapCap(0), nObjects(0) {}
    ~Knapsack() {knapPrice = 0; knapCap = 0;}

    float knapFull (int position, int currentCap);

    float knapTable ();

    float greedyKnap (int currentCap);

    float max(float noAdd,float addOb);

    void printPrice();
    //valueized and valued are modified versions of mergeSort and merge
    //designed to sort two arrays by a fraction of the two.
    void valueize(int ini, int last);

    void valued(int ini, int middle, int last);

    void fillWandP();

    void setNObjects(int n);

    void setKnapCap(int boom);
};
#include "knapsack.hpp"
#endif

メイン関数//これが影響するとは思わないが#include"sortClass.h"#include "knapsack.h" #include #include #include #include using namespace std;

//mergeSort main;
int main()
{
    Knapsack<float> a;
    float sacked = 0;

    int nO = 18;
    int cap = 700;
    a.setNObjects(nO);

a.setKnapCap(cap);

    a.fillWandP();

    for(int b = 0; b <3800000; b++)//for getting good times
  sacked = b;

    int startAll = clock()*1000000;
    sacked = a.knapFull(1, cap);
    int knapped = clock()*1000000;
    int boom = a.knapTable();
    int tabled = clock()*1000000;
    a.valueize(1, cap);
    int andDone = a.greedyKnap(cap);
    int greedified = clock()*1000000;
    cout<<startAll<<endl;

    greedified = greedified - tabled;
    tabled = tabled - knapped;
    knapped = knapped - startAll;
    cout<<"Recursion profit:"<<sacked<<" Time: "<<knapped<<endl;
    cout<<"Memoization profit:"<<boom<<" Time: "<<tabled<<endl;
    cout<<"Greedy profit: "<<andDone<<" Time: "<<greedified<<endl;



    return 0;
}
4

4 に答える 4

2

weightのように宣言さfloat weight[40000]class Knapsackます。

次に、関数weightのインデックスとしての要素を使用します。memoizeknaptable()

memoize[i][y]= max(memoize[i+1][y], (memoize[i+1][y-weight[i]]+price[i]));
//                                                  ^^^^^^^^^

そして、記録のために、それはエラーがg++4.6.1によって生成される行です。memoize宣言されている行を指していません。

于 2012-10-31T01:28:10.440 に答える
1

必ずしも関連しているわけではありませんが、配列/ポインタを正しく使用していません。呼び出すときに最初のレベルのポインターを作成しますfloat** memoize = new float*[MAXSIZE]が、その後は、二重配列ではなく、ポインターの配列だけが作成されます。memoize[i]それぞれを配列として初期化する必要もあります。

memoizeそうは言っても、とにかくアレイにメモリを割り当てる必要があるようには見えません。次のように宣言するだけです

float memoize[SIZE][SIZE];

そうすれば、メモリのクリーンアップなどについて心配する必要がなくなり、はるかに理にかなっています。

于 2012-10-31T01:06:57.460 に答える
1
  for(int i = temps; i >= 1; i--)
  {
    for(int y = weight[i]; y < knapCap; y++)
      memoize[i][y]= max(memoize[i+1][y], (memoize[i+1][y-weight[i]]+price[i]));
  }

y-weight[i]フロートです。これがあなたの問題です。

これを修正すると、まだ問題があることがわかります。ポインターの配列を割り当てていますが、その配列を使用する前に、それらのポインターのそれぞれに2番目の次元を割り当てる必要もあります。

次のようなもの:

float** memoize = new float*[MAXSIZE];

for(size_t i = 0; i < MAXSIZE; ++i)
{
  memoize[i] = new float[MAXSIZE];
}
于 2012-10-31T01:28:21.043 に答える
0

たぶん、2番目のポインタにメモリを割り当てる必要があると思います。

float** memoize = new float*[MAXSIZE];
    memoize=(float**)malloc(sizeof(float*)*MAXSIZE);
    for(int i=0;i<MAXSIZE;i++)
    {
        memoize[i]=(float*)malloc(sizeof(float)*MAXSIZE);
    }
于 2012-10-31T01:28:21.330 に答える