2016-04-28 5 views
0

Ошибка, стоящая перед мной, - это компилятор, говорящий cannot convert ‘double*’ to ‘double’ in assignment. Мой код ниже.Несоответствие типа

double* initArray(int data[], int dimensionCount){ 
    //data: element 0= number of dimensions 
    //element 1 through inf define the size of each dimension 
    //dimensionCount keeps track of the current dimension being manipulated by the function 


    //Allocate dynamic memory for the current dimension 
    double* output; 
    output=new double[data[dimensionCount]]; 

    int i=dimensionCount; 

    while(i<data[dimensionCount]){ 
     if(!(output[i]= initArray(data, dimensionCount++))){ 
      std::cout<< "Error! Out of Memory!"; 
      break; 
     } 

    i++; 
    } 
//returning the generated array tacks on the generated dimension to the lower dimension preceding it 
return output; 
} 

Как output имеет arrayInit возвращает переменных типа double* типа double* и я не знаю, где он пытается преобразовать из double в double*. Я нашел this, но он, похоже, не применяется, поскольку data передается правильно, а intArray возвращает указатель на генерируемый массив, а не сам массив, поэтому не должно быть никакого несоответствия типов с output.

+0

'data []' скорее всего не так, как вы думаете, вы, вероятно, просто означаете «данные» в этом контексте. Обратите внимание, что 'initArray (int data [] ...' эквивалентно 'initArray (int * data ...' Однако это скорее C-ish C++. Вы должны обязательно получить более эффективный учебный материал. Примечание: если вы делаете это по какой-то причине, кроме академического любопытства, то, что вам нужно, скорее всего, уже реализовано и готово к использованию. –

+0

Чтобы подчеркнуть, 'new []' действительно * редко используется в реальном мире, 'std :: vector' делает все, что он делает и все больше и больше. –

+0

Я просто делаю это, чтобы попытаться понять: DI также пытается создать библиотеку, не используя ничего, кроме 'iostream' и' string'. Вы правы на данных, при ближайшем рассмотрении, не будет ли это элементом массива, который я пытаюсь ссылаться, без ключа, указывающего массиву, в какой ячейке я ссылаюсь? Я попробую изменить это на 'data' и посмотреть, как это работает. Спасибо! – Graf

ответ

1

Я играл с функцией больше и понял, что, хотя output является double* и не вступает в противоречие с тем, что возвращается initArray, output[i] просто обычный double, так как это то, что output указывает на. Несоответствие типа было результатом попыток установить output[i] на номер double*.

Чтобы решить эту проблему, я изменил функцию, чтобы вернуть double вместо double*, а затем убедился, что output был разыменовывается в новую переменную array. Это позволило вернуть нормальный массив функцией, предотвратив несоответствие типа, а также сделать фактический результат функции, которая намного удобнее использовать.

Вот код:

double initArray(int data[], int dimensionCount){ 
//data: element 0= number of dimensions 
//element 1 through inf define the size of each dimension 
//dimensionCount keeps track of the current dimension being manipulated by the function 


//Allocate dynamic memory for the current dimension 
double* output; 
output=new double[data[dimensionCount]]; 

int i=dimensionCount; 

while(i<data[dimensionCount]){ 
    if(!(output[i]= initArray(data, dimensionCount++))){ 
     std::cout<< "Error! Out of Memory!"; 
     break; 
    } 

    i++; 
} 
//returning the generated array tacks on the generated dimension to the lower dimension preceding it 
double array=*output; 
return array; 
} 
+0

Эта функция не возвращает массив, она возвращает «double» - и, кроме того, двойной, который на самом деле не был инициализирован никаким конкретным значением. Насколько я вижу, эта функция ничего не выполняет, кроме как утечки памяти и возврата мусора. И это предполагает, что он не застревает в бесконечной рекурсии и, ну, переполняет ваш стек! – Entropy

+0

Я думал, что массивы не типа. «Double» может хранить массив со значениями типа «double». Я перешел к работе над другими частями моей библиотеки и планировал отладить это, когда я не испортил его некоторое время (в надежде, что я получу новое представление о проблеме или что-то еще). Теоретически эта функция генерирует массив N-мерности. Указатель 'output' указывает на массив, и каждый цикл добавляет к нему измерение ... или это то, что я намеревался. Он этого не делает, поскольку это еще не сделано. : P – Graf

+0

Он также не предназначен для получения значения. Я собираюсь получить скелет массива, для которого я могу использовать для хранения N-мерных координат или векторов, чтобы я мог делать !! MATH !!. – Graf

0

Просто

return *output; 

будет делать трюк. Любая конкретная причина для использования другой переменной ?.

+0

Я думал, что это было более ясно. Я все еще участвую, и '* output' не сразу попадает в мою голову, тогда как' array = * output' напоминает мне, что '* output' является разыменованием' output'. – Graf

Смежные вопросы