Я пытаюсь создать программу, которая будет помещать все действительные числа в массив — с упорядочением чисел, выполняемых в отдельной функции — в порядке убывания, и распечатывать их.
Ниже приведена программа, которая у меня пока есть, но, по словам компилятора, есть две проблемы с ней:
(i) В строке 22 ("return N[t];"
), Я получил «error: invalid types 'double*[double]' for array subscript
».
(ii) В строке 28 («cout << sort_array(Q[100]) << " " "
), Я получил «error: cannot convert 'double' to 'double*' for argument '1' to 'double* sort_array(double*)'
».
Я не совсем понимаю, почему возникают эти две ошибки, но я бы хотел помочь в их устранении.
#include <iostream>
#include <cstdlib>
using namespace std;
double *sort_array (double *N) {
double t;
int size=100, a, b;
for (t=0; t<size; t++)
*N = rand()%250;
for (a=1; a<size; a++) {
for (b=size-1; b>=a; b--) {
if (N[b-1] < N[b]) {
t = N[b-1];
N[b-1] = N[b];
N[b] = t;
}
}
}
return N[t];
}
int main()
{
double Q[100];
cout << sort_array(Q[100]) << " ";
cout << endl;return 0;
}
Проблема заключается в sort_array(Q[100])
заявление. Это говорит компилятору вызвать sort_array
с 101-м двойным в Q
массив (который на самом деле выходит за пределы). Вы действительно хотели просто пройти Q
вместо Q[100]
,
Однако обратите внимание, что при передаче массивов в стиле C double*
например, теряет информацию о длине и не является каноническим C ++. Вместо этого вы можете использовать vector
нести массив и размер с ним.
РЕДАКТИРОВАТЬ: И так как вы изменяете данные на месте, ваша функция вообще не должна ничего возвращать. Измените его на void и просто пропустите возврат в конце. Затем вам придется перебирать вектор / массив, чтобы распечатать каждый из элементов. cout
не предоставляет встроенную возможность печати агрегатов.
Наконец книга из Полное руководство и список книг C ++ может помочь вам освоить концепции C ++.
Первая ошибка, потому что N[t]
это double
(это означает, что N
«), но ваша функция возвращает double*
, Ваша функция на самом деле не должна ничего возвращать. Сортирует данные, на которые указывает N
так что возвращать ничего не нужно. Вы должны, вероятно, переключиться на void
возвращаемое значение
Вторая ошибка заключается в том, что Q[100]
это double
(это означает «101-й элемент Q
что в любом случае является ошибкой, так как последний элемент Q
является Q[99]
, так как индексы массива в C ++ начинаются с 0, а не с 1), но ваша функция ожидает double
, Я предполагаю, что вы на самом деле хотите сделать следующее:
sort_array(Q)
передать указатель на первый элемент напрямую.
Помните, что при передаче массивов вам нужно только передать адрес первого элемента массива. В этом случае, Q
, что эквивалентно &Q[0]
но легче написать.