maiaragomes
(usa Ubuntu)
Enviado em 12/06/2014 - 17:15h
luccan escreveu:
DMaiara escreveu:
O código-fonte é para que eu encontre a transformada de fourier do meu problema.
Daí, na função main declarei double ft_z[ip.ftMax+1], porém quando executo o programa, me aparece no terminal a mensagem anteriormente informada.
Obrigada!
Se possível copie e cole o código-fonte do seu programa aqui.
Coloque entre as tags [ code] e [ /code], sem espaço antes do "c".
Mas pelo que você relatou pode se detectar um possível erro:
Quando se declara uma matriz o valor entre os colchetes tem que ser conhecido. Por exemplo:
int main(){
double ft_z[10];
}
Repare que o valor entre os colchetes é conhecido. Um outro caso é se você usar a diretiva #define para representar algum valor, e depois colocar entre os colchetes.
#define NUM 10
int main(){
double ft_z[NUM];
}
Sem o código-fonte é difícil dizer onde realmente está o erro, então o escreva aqui segundo as recomendações, por favor.
******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <getopt.h>
#include <nrutil.h>
#include <sinft.h>
#include <complex.h>
#include <utils.h>
#include <io.h>
#include "main.h"
intPars ip;
/******************************************************************************/
void argListHelp (int argc, char **argv, char *filename){
int c;
while ((c = getopt(argc, argv, "hu")) != EOF)
switch (c) {
case 'h':
fprintf(stderr,"Usage: %s [options]\n",argv[0]);
fprintf(stderr,"-h : this help message\n");
fprintf(stderr,"-u : \n");
fprintf(stderr, "%s [arg1]\n", argv[0]);
fprintf (stderr," arg1 eh o identificador da execucao\n");
exit(1);
case 'u':
fprintf(stderr,"usage: \n");
fprintf(stderr, "%s [arg1] \n", argv[0] );
fprintf (stderr," arg1 eh o identificador da execucao\n");
exit(1);
default:
break;
}
if (argc == 1)
sprintf(filename, "%s", argv[0]);
else if (argc == 2)
sprintf(filename, "%s%s", argv[0], argv[1]);
else {
printf("argc =%d\n", argc);
nrerror("wrong number of input arguments");
}
}
/********************************************************************/
void setIntegrationPars (intPars *ip, char *arg){
int n;
ip->sampling = 64; // sampling time for data collection
ip->nStepsCycle = 1024;
ip->nCycles = atoi(arg);
ip->nMax=ip->nCycles*ip->nStepsCycle;
ip->ftMax=(rint) (1.0*ip->nMax/ip->sampling);
ip->tMax = ip->nCycles * ip->period; // Max time
ip->period = 1.0; // ip.period of drive
ip->dt = ip->period/ip->nStepsCycle; // time step
printf("period %lf dt %lf tMax %lf\n", ip->period, ip->dt, ip->tMax);
}
/********************************************************************/
void writeIntParsInfo(char *finfo, intPars *ip){
FILE *f;
f = fopen(finfo, "a");
printf ("tMax %lf\n", ip->tMax);
fprintf(f,"%s: %lf\n","time-step",ip->dt);
printf("%s: %lf\n","time-step",ip->dt);
fprintf(f,"%s: %lf\n","ip.period of drive",ip->period);
printf("%s: %lf\n","ip.period of drive",ip->period);
fprintf(f,"%s: %d\n","number of steps per drive ip.period",
ip->nStepsCycle);
fprintf(f,"%s: %lf\n","Max time",ip->tMax);
fprintf(f,"%s: %d\n", "output sampling",ip->sampling);
}
//*****************************************************************************
int main(int argc, char **argv){
char filenameC[50];
char finfo[100];
argListHelp(argc,argv, filenameC);
char *files[]={"serieT", "fft", "fftAmp", "fftInversa"};
int nFiles=3;
/* time-step, maximum time, sampling time, ...*/
setIntegrationPars (&ip, argv[1]);
writeIntParsInfo (finfo, &ip);
createOutputFiles(filenameC,files,nFiles);
double x_min =-ip.ftMax/2*ip.dt; // ?
double ft_z[ip.ftMax+1];
double om_0=2*PI/ip.period;
double T=ip.ftMax*ip.dt; // Intervalo de tempo total da transformada de Fourier
// serie temporal
int i;
double x= 0.0;
for (i=1; i<= ip.ftMax; i++){
// 0.03125=1/32
ft_z[i]=2*cos (om_0*x)+1.9*cos (1.03125*om_0*x);
if ((i % ip.sampling) ==0)
print2d(filenameC, "serieT", x, ft_z[i]);
x +=ip.dt;
}
// Transformada de Fourier; Fourier transform
realft (ft_z, ip.ftMax, 1);
// Output data
double om;
for (i=1; i<= ip.ftMax/2; i++){
om=2*PI*(i-1)/(ip.ftMax*ip.sampling*ip.dt);// Angular frequency
// Numerical Fourier transform
// Saida das partes real e imaginaria
print3d(filenameC, "fft", om, ft_z[2*i-1]*ip.dt, ft_z[2*i]*ip.dt);
// Amplitude da TF
double amp=sqrt (ft_z[2*i-1]*ft_z[2*i-1]+ft_z[2*i]*ft_z[2*i]);
print2d(filenameC, "fftAmp", om, 2*amp/ip.ftMax);
}
// Transformada de Fourier inversa; Inverse Fourier transform
realft (ft_z, ip.ftMax, 0);
//sinft( ft_z, ftMax);
for (i=1; i<= ip.ftMax; i++)
print2d(filenameC, "fftInversa", i*ip.dt*ip.sampling+x_min, 2*ft_z[i]/ip.ftMax);
return 0;
}
O código é esse.