Преобразование кода C в C++, double* в вектор и 2D-вектора в double*C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Преобразование кода C в C++, double* в вектор и 2D-вектора в double*

Сообщение Anonymous »

Я пытаюсь преобразовать некоторый исследовательский код, написанный на C кем-то, кого я не знаю, и совершенно без документации, в C++.
По сути, преобразование объектов T* и T** в векторы и многое другое. дружественные контейнеры.

Atm У меня есть две переменные,

double* data
double* references


Здесь, на SO, я видел трюк, который позволяет легко назначать обычный вектор двойному*, например:

references = &(*m_DataMaxPoints)[0];


так что ничего страшного.

Однако данные* должны быть установлены из std::vector< std::vector>* m_Data;

Я не знаю, как мне это назначить.
Я попробовал &(* m_Data)[0][0];, но я действительно не знаю, что мне здесь делать.
Любые советы будут приветствоваться.. :(

Редактирование 1: Исходная обработка данных* в C-программе

Данные double* объявляются в main()< /p>

int main(int argc, char *argv[])
{
FILE *infile;

int verbose_flag = FALSE;

double *data = NULL, *reference = NULL, *maximum = NULL;
int *cumsizes = NULL;
int nobj = 0, nruns = 0;
int k;
double volume = 0;
double time_elapsed;

read_input(stdin, "stdin", &data, &nobj, &cumsizes, &nruns);


read_input анализирует числа из текстового файла в массивы.

#define PAGE_SIZE 4096 // allocate one page at a time
#define DATA_INC (PAGE_SIZE/sizeof(double))
#define SET_INC 128 // assume 128 datasets (can grow)

int read_input(FILE *infile, const char *filename, double **datap, int *ncolsp, int **cumsizesp, int *nrunsp)
{
char b[2];
double number;

int newline; // last input was newline
int datai; // the current element of (*datap)
int col; // the column being read
int set = *nrunsp; // the current data set
int ncols = *ncolsp; // the number of columns

int datasize;
int setsize;

datai = (set == 0)
? 0
: ncols * (*cumsizesp)[set-1];

setsize = (set == 0)
? 0
: ((set-1) / SET_INC + 1) * SET_INC;

*cumsizesp = realloc(*cumsizesp, setsize * sizeof(int));

datasize = (datai == 0)
? 0
: ((datai - 1) / DATA_INC + 1) * DATA_INC;

*datap = realloc(*datap, datasize * sizeof(double));

// remove leading whitespace
fscanf (infile, "%*[ \t\n]");

if (feof(infile)) {
warnprintf("%s: file is empty.", filename);
return -1;
}

do {
newline = 0;
if (set == setsize) {
setsize += SET_INC;
*cumsizesp = realloc(*cumsizesp, setsize * sizeof(int));
}

(*cumsizesp)[set] = (set == 0) ? 0 : (*cumsizesp)[set-1]; // beginning of data set

while (newline == 0) {
col = 0; // beginning of row
while (newline == 0) {
if (fscanf(infile, "%lf", &number) != 1) {
char buffer[64];

fscanf(infile, "%60s", buffer);
errprintf(
"could not convert string `%s' to double, exiting...",
buffer);
}

if (datai == datasize) {
datasize += DATA_INC;
*datap = realloc(*datap, datasize * sizeof(double));
}
(*datap)[datai++] = number;

#if DEBUG > 2
fprintf(stderr, "set %d, row %d, column %d, x = %g\n",
set, (*cumsizesp)[set], col, number);
#endif
col++; // new column

fscanf(infile, "%*[ \t]");
newline = fscanf(infile, "%1[\n]", b);
}

if (!ncols)
ncols = col;
else if (col != ncols) {
if ((*cumsizesp)[0] == 0)
errprintf ("reference point has dimension %d"
" while input has dimension %d",
ncols, col);
else
errprintf("row %d has different length (%d)"
" than previous rows (%d), exiting...",
(*cumsizesp)[set], col, ncols);
}

(*cumsizesp)[set]++;

fscanf (infile, "%*[ \t]");
newline = fscanf (infile, "%1[\n]", b);
}
#if DEBUG > 1
fprintf (stderr, "Set %d, %d rows in total\n", set, (*cumsizesp)[set]);
#endif
set++; // new data set

fscanf (infile, "%*[ \t\n]");

} while (!feof(infile));

*ncolsp = ncols;
*nrunsp = set;

return 0;
}


Я пытаюсь как можно меньше конвертировать в C++, чтобы упростить его использование и внедрить его в более крупный проект, создав класс-оболочку для этого интерфейса. .

Итак, анализ файлов и распределение данных выполняются с помощью векторов (они не обязательно должны быть указателями).

После синтаксического анализа я бы предпочел преобразовать векторы в массивы в стиле C, чтобы можно было вызвать функцию исходного кода без необходимости добавлять вектор для поддержки всего этого, потому что я не понимаю, как читать его на чистом C (реализация многоцелевого эволюционного алгоритма).

Исходный код наконец вызывает:
volume = hv(data, nobj, cumsizes[nruns-1], reference);


Пока я хотел бы это сделать:

double* data = &(*m_Data)[0][0]; // my 2d vector
double* references = &(*m_DataMaxPoints)[0]; // 1d vector
int cumsizes = m_Data->at(0).size();
m_Volume = hv(data, Objectives(), cumsizes, references);


Подробнее здесь: https://stackoverflow.com/questions/518 ... -to-double
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»