простой вопрос по С/С++ (спасибо!, закрыто)

laptew

Я хочу применить готовую функцию, описанную в книге Numerical recipes in C, но в силу того, что новичок в С, не могу этого сделать ) Буду очень признателен за помощь.
Функция минимизации функции многих переменных:
 
void amoeba(float **p, float y[], int ndim, float ftol, float (*funkfloat [] int *nfunk) 
//Multidimensional minimization of the function funk(x) where x[1..ndim] is a vector in ndim
//dimensions, by the downhill simplex method of Nelder and Mead. The matrix p[1..ndim+1]
//[1..ndim] is input. Its ndim+1 rows are ndim-dimensional vectors which are the vertices of
//the starting simplex. Also input is the vector y[1..ndim+1], whose components must be preinitialized
//to the values of funk evaluated at the ndim+1 vertices (rows) of p; and ftol the
//fractional convergence tolerance to be achieved in the function value (n.b.!). On output, p and
//y will have been reset to ndim+1 new points all within ftol of a minimum function value, and
//nfunk //gives the number of function evaluations taken.

Затруднее следующее: не знаю, как правильно написать main чтобы заработала хотя бы на простейшем примере. Конкретно не понятно, как я должен задать funk(x т.е. саму минимизируемую функцию, а также кака определить **p. Пугает наверно то, что очень плохо орудую с указателями.
Если не сложно, приведите возможный пример задания функции для минимизации и последующего использования его в amoeba(...)

ppplva

#include <stdlib.h>
const int ndim = 3;

float my_funk(float x[])
{
return x[0]*x[0] + x[1]*x[1] + x[2]*x[2];
}

void amoeba(float **p, float y[], int ndim, float ftol, float (*funkfloat [] int *nfunk)
{
}

int main(void)
{
int i;
float **p;
float *y;
float ftol = 0.1;
int nfunk;
p = mallocndim + 1) * sizeof(float;
for (i = 0; i < ndim + 1; ++i)
p[i] = malloc(ndim * sizeof(float;
// fill p
y = mallocndim + 1) * sizeof(float;
for (i = 0; i < ndim + 1; ++i)
y[i] = my_funk(p[i]);
amoeba(p, y, ndim, ftol, my_funk, &nfunk);
return 0;
}

SPARTAK3959

Только
p=mallocndim+1)*sizeof(float*;
наверно все-таки.

laptew

Спасибо! Тем не менее все равно не компилируется: выдаются ошибки
line 7 - error C2440: '=': cannot convert 'void *' to 'float **'
line 9 - error C2440: '=': cannot convert 'void *' to 'float *'
line 11 - error C2440: '=': cannot convert 'void *' to 'float *'
 int main(void)
1 {
2 int i;
3 float **p;
4 float *y;
5 float ftol = 0.1;
6 int nfunk;
7 p = mallocndim + 1) * sizeof(float*;
8 for (i = 0; i < ndim + 1; ++i)
9 p[i] = malloc(ndim * sizeof(float;
10 // fill p
11 y = mallocndim + 1) * sizeof(float;
12 for (i = 0; i < ndim + 1; ++i)
13 y[i] = my_funk(p[i]);
14 amoeba(p, y, ndim, ftol, my_funk, &nfunk);
15 return 0;
16 }

В чем может быть проблема? :confused:

Maurog

стандартная ошибка
результат malloc-а всегда надо приводить к нужному типу указателя.

p = (float**)mallocndim + 1) * sizeof(float*;

laptew

как?

Elina74

вот так:
7: p = (float**)mallocndim + 1) * sizeof(float*;
9: p[i] = (float*)malloc(ndim * sizeof(float;
11: y = (float*)mallocndim + 1) * sizeof(float;

laptew

спасибо!

ppplva

стандартная ошибка: в первом сообщении 2 раза упоминается C, а компилируют, похоже, как C++.
Оставить комментарий
Имя или ник:
Комментарий: