![](/img/trans.png)
[英]Pointer to pointer argument variable and how they work? e.g. function(int **ptr)
[英]how to numerically integrate a variable that is being calculate in the program as a pointer (using e.g. trapezoidal rule) in c language
我有一個不是我編寫的代碼。 在這個復雜的代碼中,許多規則被應用於計算數量d(x)。 在代碼中使用了一個指針來計算它。
我想計算一個積分,例如:W = Int_0 ^ L d(x)dx?
我正在這樣做:
#define DX 0.003
void WORK(double *d, double *W)
{
double INTE5=0.0;
int N_X_POINTS=333;
double h=((d[N_X_POINTS]-d[0])/N_X_POINTS);
W[0]=W[0]+((h/2)*(d[1]+2.0*d[0]+d[N_X_POINTS-1])); /*BC*/
for (i=1;i<N_X_POINTS-1;i++)
{
W[i]=W[i]+((h/2)*(d[0]+2*d[i]+d[N_X_POINTS]))*DX;
INTE5+=W[i];
}
W[N_X_POINTS-1]=W[N_X_POINTS-1]+((h/2)*(d[0]+2.0*d[N_X_POINTS-1]+d[N_X_POINTS-2])); /*BC*/
}
而且我收到“細分錯誤”。 我想知道是不是要正確地將W作為指針進行計算,還是應該將其聲明為簡單的double? 我猜想細分錯誤即將到來。
另外一點,我是否正確使用了梯形規則?
任何幫助/提示,將不勝感激。
路易斯
我不知道該代碼從哪里來,但是它很丑陋,並且有一些硬編碼的限制(333點,增量為0.003)。 要使用它,您需要正確地對函數進行“采樣”並生成對(x,f(x))...
這里是解決您的問題的可能更清晰的解決方案。
讓我們考慮一下您的函數,並假設它可以工作(我相信它不會,這是一個非常晦澀的代碼……;例如,當您集成一個函數時,您期望得到一個數字;這個數字在哪里?也許是INTE5?沒有返回...如果是這樣,為什么還要對W數組進行最終更新呢?它沒有用,或者也許我們對W有一些有意義的東西?)。 您將如何使用它?
原型
void WORK(double *d, double *W);
表示該工作需要兩個指針。 這些指針必須是什么取決於代碼。 一看就知道確實需要兩個數組,每個數組都有N_X_POINTS個元素。 代碼從數組W中讀取和寫入,僅從d中讀取。 N_X_POINTS int是333,因此您需要傳遞至少333個double的函數數組:
double d[333];
double W[333];
然后,您必須正確填充它們。 我認為您需要用(x,f(x))填充它們,並通過適當的步驟對函數進行采樣。 但這當然沒有太大意義。 已經說過代碼是晦澀的(現在我不想嘗試對編碼器的意圖進行逆向工程……)。
無論如何,如果使用WORK(d, W)
調用,則不會出現段錯誤,因為數組足夠大。 結果將是錯誤的,但這很難跟蹤(再次,對不起,沒有“反向工程”)。
最后說明(也來自注釋):如果您有double a[N]
,則a
類型為double *
。
當您嘗試訪問不應訪問的內存部分時,通常會在C中發生分段錯誤錯誤。 我懷疑表達式d[N_X_POINTS]
是罪魁禍首(因為C中的數組的索引為零),但是沒有看到d
的定義,我不確定。
嘗試在printf
每一行代碼之前/之后放置內容豐富的printf
調試語句,以便縮小問題的可能根源。
這是一個簡單的程序,它在[0..10]范圍內集成$ f(x)= x ^ 2 $。 它應該向正確的方向發送信息。
#include <stdio.h>
#include <stdlib.h>
double int_trapezium(double f[], double dX, int n)
{
int i;
double sum;
sum = (f[0] + f[n-1])/2.0;
for (i = 1; i < n-1; i++)
sum += f[i];
return dX*sum;
}
#define N 1000
int main()
{
int i;
double x;
double from = 0.0;
double to = 10.0;
double dX = (to-from)/(N-1);
double *f = malloc(N*sizeof(*f));
for (i=0; i<N; i++)
{
x = from + i*dX*(to-from);
f[i] = x*x;
}
printf("%f\n", int_trapezium(f, dX, N));
free(f);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.