Вот код, который я сейчас использую
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, это const int.
Есть ли способ, которым я могу это исправить?
Отредактировано для большего количества кода
заголовочный файл
#ifndef KNAPSACK_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
#включают
#включают
#включают
использование пространства имен 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;
}
weight
объявлен как float weight[40000]
в class Knapsack
,
Затем вы используете элемент weight
в качестве индекса в memoize
в knaptable()
функция:
memoize[i][y]= max(memoize[i+1][y], (memoize[i+1][y-weight[i]]+price[i]));
// ^^^^^^^^^
И для записи, это строка, для которой ошибка произведена g ++ 4.6.1; это не указывает на линию, где memoize
объявлен
Не обязательно связано, но вы не используете ваши массивы / указатели правильно. Вы создаете свой первый уровень указателей, когда вы звоните float** memoize = new float*[MAXSIZE]
но тогда у вас просто есть массив указателей, а не двойной массив. Вам нужно инициализировать каждый из memoize[i]
как массив, а также.
Это, как говорится, не похоже, что вы должны выделять память для вашего memoize
массив в любом случае. Просто объявите это как
float memoize[SIZE][SIZE];
Таким образом, вам не придется беспокоиться об очистке памяти или о чем-то еще, и это имеет гораздо больше смысла.
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]
это поплавок. Это твоя проблема.
Как только вы исправите это, вы обнаружите, что у вас все еще есть проблема, вы выделяете массив указателей, но вам также нужно выделить второе измерение для каждого из этих указателей, прежде чем вы можете использовать этот массив.
Что-то вроде:
float** memoize = new float*[MAXSIZE];
for(size_t i = 0; i < MAXSIZE; ++i)
{
memoize[i] = new float[MAXSIZE];
}
я думаю, может быть, вам просто нужно выделить память для второго указателя, что-то вроде
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);
}