Как я могу передать свой массив 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 внутри и обработать весь массив за один вызов.