[1.2]似たようなソースコードを漁った結果, 動的メモリを確保してファイル内の何かを変更していることがおぼろげながら分かりました.
[1.3]特に関数lsmが何の演算をしているかということと, ptsが何を表している変数なのかが分かりません.
[2.1]環境 : Windows7, gcc
[3.1] C言語初心者です.こういった掲示板で質問するのは初めてなので何か不手際があったら申し訳ありません.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXPATH 256
int size_data(char *flname)
{
int i;
double x;
FILE *fp;
if((fp=fopen(flname, "r")) == NULL ){
fprintf(stderr, "Can't open: %s\n", flname);
exit(3);
}
for(i=0;fscanf(fp, "%le", &x)!=EOF ; i++);
fclose(fp);
return( 1 );
}
void lsm(double f[], double fs[], int start, int end)
{
int n,i;
double si=0, sf=0, sif=0, sii=0, a, b;
n = end - start + 1;
for( i=start ; i<=end ; i++){
si += i;
sf +=f[i] ;
sif += i * f[i];
sii += (double)i * i;
}
a = (n*sif - si *sf) / (n*sii - si*si);
b = (sf*sii - sif*si) / (n*sii - si*si);
for( i= start; i<= end; i++){
fs[i] = i*a +b;
}
}
int main(int argc, char *argv[])
{
char flname[MAXPATH];
int pts, m, n, i, j;
double *y, *ys;
FILE *fp;
if(argc != 4){
fprintf(stderr, "???\n");
return( 1 );
}
for( i=1; i<argc ; i++){
if(*argv[i] == '-'){
switch(*++argv[i]){
case 'p': pts = atoi(argv[++i]);
if(pts %2!=1 || pts ==1){
fprintf(stderr, "Illegal parameter\n");
return( 1 );
}
break;
default: fprintf(stderr, "Unknown parameter\n");
return( 1 );
}
}else{
strcpy(flname, argv[i]);
}
}
m = pts/2;
n = size_data(flname);
if( n < pts ){
fprintf(stderr, "Illegal parameter\n");
return( 1 );
}
y = (double *)malloc( n * sizeof(*y));
ys = (double *)malloc( n * sizeof(*ys));
if( y == NULL || ys == NULL ) {
fprintf(stderr, "Not enough memory\n");
return( 2 );
}
if((fp=fopen(flname, "r")) == NULL ){
fprintf(stderr, "Can't open: %s\n", flname);
return( 3 );
}
for( i=0 ; i<n ; i++ ){
fscanf(fp, "%le", &y[i]);
}
fclose(fp);
if( m == 1 ){
fscanf(fp, "%le", &y[i]);
}
fclose(fp);
if( m == 1 ){
ys[0] = y[0];
ys[n-1] = y[n-1];
}else{
lsm(y, ys, 0, m-1);
lsm(y, ys, n-m, n-1);
}
for( i=m ; i<n-m ; i++){
ys[i] = 0 ;
for( j=-m ; j<=m ; j++){
ys[i] += y[i+j];
}
ys[i] /= pts ;
}
for( i=0 ; i<n ; i++ ){
if( printf("%le\n", ys[i]) == EOF ){
fprintf(stderr, "Disk full\n");
return( 3 );
}
}
free(y);
free(ys);
return( 0 );
}