Распознавание целого числа как числа с плавающей точкой в ​​индексе двухмерного массива

Вот код, который я сейчас использую

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;
}

1

Решение

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 объявлен

2

Другие решения

Не обязательно связано, но вы не используете ваши массивы / указатели правильно. Вы создаете свой первый уровень указателей, когда вы звоните float** memoize = new float*[MAXSIZE] но тогда у вас просто есть массив указателей, а не двойной массив. Вам нужно инициализировать каждый из memoize[i] как массив, а также.

Это, как говорится, не похоже, что вы должны выделять память для вашего memoize массив в любом случае. Просто объявите это как

float memoize[SIZE][SIZE];

Таким образом, вам не придется беспокоиться об очистке памяти или о чем-то еще, и это имеет гораздо больше смысла.

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] это поплавок. Это твоя проблема.

Как только вы исправите это, вы обнаружите, что у вас все еще есть проблема, вы выделяете массив указателей, но вам также нужно выделить второе измерение для каждого из этих указателей, прежде чем вы можете использовать этот массив.

Что-то вроде:

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

for(size_t i = 0; i < MAXSIZE; ++i)
{
memoize[i] = new float[MAXSIZE];
}
1

я думаю, может быть, вам просто нужно выделить память для второго указателя, что-то вроде

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);
}
0
По вопросам рекламы [email protected]