Мне пришлось преобразовать программу C++ в C, которая была выполнена. Вопрос в том, эквивалентны ли представленные коды и пропустил ли я что-нибудь.
Оба представленных кода являются полными и должны компилироваться. Оба дают одинаковые ответы при запуске. Но я новичок в C++, и я не знаю, пропустил ли я что-то в своем преобразовании, которое могло бы быть важным.
Еще один вопрос, в коде C++, int x и int y были объявлены глобальными, у меня их нет, и я не думаю, что мне нужно что-то подобное, но я действительно не знаю, что они делают, Руководство?
#include <iostream>
// a point on the integer grid
struct Point
{
// constructor
Point()
{
x = y = 0;
}
// add point componentwise
void add(const Point &p)
{
x += p.x;
y += p.y;
}
// print to standard output
void print() const
{
std::cout << "[" << x << "," << y << "]" << std::endl;
}
// data
int x, y;
};
int main()
{
const int N = 200;
Point *A = new Point[N], sum;
for (int i=0; i < N; ++i) {
sum.print();
A[i].x = i; A[i].y = -i;
sum.add(A[i]);
}
sum.print();
delete [] A;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct //constructor
{
int x;
int y;
} Point;
void add(const Point * p, Point * sum)
{
(*sum).x += (*p).x;
(*sum).y += (*p).y;
}
void print(const int x, const int y)
{
printf("[%d,%d]\n", x, y);
}
int main()
{
int i = 0;
const int N = 200;
Point *A = malloc(N*sizeof(Point)), sum;
if(!A)
{
printf(stderr, "malloc() failed to allocate memory!");
abort();
}
sum.x =0;
sum.y = 0;
for (i = 0; i <N; i++)
{
print (sum.x, sum.y);
A[i].x = i; A[i].y = -i;
add(&A[i], &sum);
}
print(sum.x, sum.y);
free(A);
return 0;
}
Это справедливо эквивалентно функционально (кроме проблемы с конструктором, см. Ниже). Но по какой-то причине он содержит ряд несоответствий и "нелогичных" стилистических решений.
"Стандартный" подход приблизить метод C++ с помощью функции C состоит в том, чтобы реализовать C++ неявный this
параметр через явный параметр. Это заставит вашу функцию add
выглядеть следующим образом
void add(Point *this, const Point *p)
{
this->x += p->x;
this->y += p->y;
}
Обратите внимание, что в версии C++ вы также можете использовать синтаксис this->x
с левой стороны (а не просто x
), что только подчеркивало бы сходство. Очевидно, моя версия выше такая же, как ваша, но организована в том, что я считаю более "традиционной".
Вы забыли определить "конструктор" для вашей версии Point
в C. В коде C++ объекты Point
начинаются с инициализации до нуля. В C-коде эти объекты начинают свою жизнь с мусора в x
и y
. Позже вы назначаете окончательные значения x
и y
, что делает проблему без инициализации непоследовательной, но все же она есть.
Конечно, если вы решите реализовать функцию "конструктор", вам придется вызывать ее вручную для каждого элемента массива, а в C++ он автоматически вызывается для вас.
По какой-то причине вы решили "разобрать" объект в параметры x
и y
для функции print
. Зачем? Опять же, тот же подход с явным this
параметром может использоваться для print
и он будет выглядеть следующим образом
void print(const Point *this)
{
printf("[%d,%d]\n", this->x, this->y);
}
В текущей версии
void print(const int x, const int y)
const
классификаторы, применяемые к параметрам не достичь практически ничего полезного и не способствуют эквивалентностям в C++ версии (то есть эти const
классификаторы не эквивалентны, что завершающий const
в C++ версии).
Но, в любом случае, это чисто стилистические предложения.
Заметим также, что на языке C++
const int N = 200;
определяет константу, а на языке C она не определяет константу. В C он определяет, что по существу является "немодифицируемой переменной". Но это совершенно не обязательно для вашего кода, так как ваш код не заботится о том, является ли N
константой или нет. (Я не знаю, заботитесь ли вы о подобной педантичной эквивалентности.)
Это зависит от уровня "эквивалентности", который вы ищете. В версии C у вас нет функции, эквивалентной конструктору Point, и вы избегаете инициализации по умолчанию в массиве точек, ваша функция печати C работает на int
вместо объекта Point, и я вижу некоторые несоответствия const
такие как Дело в том, что ваш C add
функцию принимает указатель неконстантных Point
на правой стороне в то время как C++ версия принимает ссылку на константную Point
.
Point
вместо использованияstruct