Здравствуйте, я новичок в C ++, и я хочу преобразовать свой код из pascal в C ++, поэтому это моя попытка:
void decomp(int x, int *t[], int *l){
int p = 2;
int l = 0;
do{
if (x % p == 0){
x = x / p;
t[l] = p;
l += 1;
}
else { p += 1; }
} while (x != 1);
}
И это правильная функция - паскаль, если кому-то нужно это понимать:
procedure decomp(x:integer; var t : tab; var l : integer);
var
p : integer;
begin
l : = 0;
p: = 2;
repeat
if (x mod p = 0) then
begin
x : = x div p;
l: = l + 1;
t[l]: = p;
end
else
p: = p + 1;
until(x = 1);
end;
Проблема в том, что компилятор выдает мне сообщение об ошибке: t [l] = p в li имеет эту ошибку: выражение должно иметь целочисленный или незаданный тип перечисления, а в разделе = i возникает эта ошибка: значение типа int не может быть присвоено сущности типа int *
PS функция должна вернуть массив и его размер (var t: tab; var l: integer)
2 ответа
Этот:
int *t[]
- это массив указателей на int, вам нужны массивы int. Итак, когда вы пытаетесь назначить t[l]=p
, вы назначаете int
на int *
, отсюда и ошибка. а для l
вам нужна ссылка, а не указатель, поэтому код может быть таким:
void decomp(int x, int t[], int &l){
int p = 2;
l = 0;
do{
if (x % p == 0){
x /= p;
t[l++] = p;
}
else { ++p; }
} while (x != 1);
}
Вы заменяете параметр l
локальной переменной l
. Замените int l = 0;
только на *l = 0;
. Вам придется разыменовать l
везде, где вы его используете.
Еще лучше передать l
по ссылке, а не по указателю. Это будет больше похоже на var l: integer
в коде Паскаля.
void decomp(int x, int *t[], int &l)
Тогда вам не придется везде разыменовывать l
как указатель.
Также t
- это массив указателей. Вы пытаетесь присвоить указателю целое число. Я не уверен, как решить эту проблему с помощью имеющегося у вас кода. Возможно, это не обязательно должен быть массив указателей:
void decomp(int x, int t[], int &l)
{
int p = 2;
l = 0;
do
{
if (x % p == 0)
{
x = x / p;
t[l] = p;
l += 1;
}
else
{
p += 1;
}
} while (x != 1);
}
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.