Member 13119529 Ответов: 1

Как я могу передать свой массив struct по ссылке в C


Эта программа должна выполнять численное интегрирование для f (x) = e^-x^2 в пределах отрицательной бесконечности до бесконечности, используя как правило Симпсона, так и правило трапеции. Мне нужна помощь, чтобы выяснить, как передать мой массив struct for n как в мою функцию trap, так и в функцию simp.

Спасибо!

#include <stdio.h>
#include <math.h>

union Data1
{
    double x1;
};
union Data2
{
    double x2;
};
struct array
{
    int n[7];
    int sums[7];
    int sumt[7];
};

double f(double x);
double simp(int n, double x1, double x2);
double trap(int n, double x1, double x2);

int main()
{
    union Data1 data1;
    union Data2 data2;
    struct array array1 = {{1,10,25,50,100,1000,10000},{0},{0}};
    int i;
    FILE *f;

    f = fopen("data.dat", "a");

    data1.x1 = -INFINITY;
    data2.x2 = INFINITY;


    printf ("Both integration techniques will run for the following intervals: 1, 10, 25, 50, 100, 1000, 10000\n");


    for(i=0;i<7;i++)
    {
    array1.sums[i] = simp(array1.n[i],data1.x1,data2.x2);
    array1.sumt[i] = trap(array1.n[i],data1.x1,data2.x2);
    }


    printf("For the trap rule:\n");
    printf("\t\tN\t\t\tSum\n");
    for(i=0;i<7;i++)
    {
       printf("\t\t%d\t\t\t%d\n",array1.n[i],array1.sumt[i]);
    }

    printf("For the simpson rule:\n");
    printf("\t\tN\t\t\tSum\n");
    for(i=0;i<7;i++)
    {
       printf("\t\t%d\t\t\t%d\n",array1.n[i],array1.sums[i]);
    }

    fprintf(f, "For the simpson rule:\n");
    fprintf(f,"\t\tN\t\t\tSum\n");
    for(i=0;i<7;i++)
    {
       fprintf(f,"\t\t%d\t\t\t%d\n",array1.n[i],array1.sums[i]);

    }
    fprintf(f,"For the trap rule:\n");
    fprintf(f,"\t\tN\t\t\tSum\n");
    for(i=0;i<7;i++)
    {
       fprintf(f,"\t\t%d\t\t\t%d\n",array1.n[i],array1.sumt[i]);
    }
    fclose(f);

    return 0;

}

double f(double x)
{
    double y;

    y = exp(-pow(x,2));

    return y;
}

double simp(int n, double a, double b)
{
    int i;
    double dx, x, sum;

    dx = (b-a)/n;
    sum = f(a)+ f(b);
    for(i=1;i<n;i++)
    {
        x = a + dx*i;
        sum += 2*(1+i%2)*f(x);
    }
    sum*=dx/3;
    return sum;
}

double trap(int n, double a, double b)
{
    int i;
    double dx, x, sum;

    dx=(b-a)/n;
    sum = f(a)+f(b);
    for(i=1;i<n;i++)
    {
        x = a + dx*i;
        sum += 2*f(x);
    }

    sum *= dx/2;
    return sum;
}


Что я уже пробовал:

Я пробовал обычные указатели, но они не работали.

nv3

Попробуй

пустота симп (структура, массив* pArray, двойной х1, х2 двойной);

и назвать его

симп (&ампер;массив1, данных1.Х1, данных2.Х2);

Кстати, я не понимаю, чего вы добиваетесь этими союзами. Просто используйте простые двойные переменные.

Member 13119529

Профсоюзы существуют только потому, что мы обязаны использовать их для проекта. Я мог бы запрограммировать весь этот проект без структур и союзов, но наш профессор настоял на их использовании, хотя мы никогда не изучали их в классе. Когда я добавляю код, как вы сказали, я получаю следующую ошибку: "ожидаемый' struct array *', но аргумент имеет тип 'int'"

nv3

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

1 Ответов

Рейтинг:
1

allenchenhh

на самом деле решение nv3 в порядке, но есть небольшой недостаток,аргумент n должен быть добавлен к

функция, как это,

void simp (struct array* pArray, int n, double x1, double x2);

и назвать его

симп (&ампер;массив1, Н данных1.Х1, данных2.Х2);

я думаю, что таким образом вы решите свою проблему.