热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

#新手#LNK2005(xx函数在obj中已定义)书上的FFT算法程序报错

错误如下:e:\programfiles\microsoftvisualstudio12.0\vc\include\stdio.h(211):参见“fopen”的声明1>
 错误如下:
 e:\program files\microsoft visual studio 12.0\vc\include\stdio.h(211) : 参见“fopen”的声明
1>fftm1源.obj : error LNK2005: "void __cdecl fft1(double (* const)[1024],int)" (?fft1@@YAXQAY0EAA@NH@Z) 已经在 fft1.obj 中定义
1>fftm1源.obj : error LNK2005: "void __cdecl initial(void)" (?initial@@YAXXZ) 已经在 fft1.obj 中定义
1>fftm1源.obj : error LNK2005: "unsigned long __cdecl inverseq(unsigned long,unsigned long)" (?inverseq@@YAKKK@Z) 已经在 fft1.obj 中定义
1>E:\aa\research分类\8.code\C\ji2fft\Debug\ji2fft.exe : fatal error LNK1169: 找到一个或多个多重定义的符号


fftm1源.cpp程序如下:
#define N 1024
#include"fft1.cpp"
void functf(double A[2][N]);

int main()
{
unsigned long int i;
static double A[2][N];
FILE *fp;
fp = fopen("fftm1.d","w");
system("cls");
functf(A);
fprintf(fp, "The original data,AK:\n");
printf("The original data,AK:\n");
for (i = 0; i < N; i++)
fprintf(fp, "%4lu:%15.9f%16.9%ei\n", i, A[0][i], A[1][i]);
fft1(A, 1);
fprintf(fp, "FFT,dtrect transform(AK->xj),xj:\n");
printf("FFT,dtrect transform(AK->xj),xj:\n");
for (i = 0; i < N;i++)
fprintf(fp, "%4lu:%15.9f%16.9%ei\n", i, A[0][i], A[1][i]);
fft1(A, -1);
fprintf(fp, "FFT,inverse transform(x->A),AK:\n");
printf("FFT,inverse transform(x->A),AK:\n");
for (i = 0; i < N; i++)
fprintf(fp, "%4lu:%15.9f%16.9%ei\n", i, A[0][i], A[1][i]);
fclose(fp);
printf("OK!\n");
return 0;
}

void functf(double A[2][N])
{
unsigned long int i;
double dt, tt, A0, A1;
dt = 0.1;
tt = (double)N*dt;
A0 = exp(-tt);
for (i = 0; i < N; i++)
{
tt = (double)i*dt;
A1 = exp(-tt);
A[0][i] = (A1 + A0 / A1)*dt;
A[1][i] = 0.0;
}
}

fft1.cpp程序如下:
#include
#include
#include
#ifndef N //'if not defined'的缩写,防止头文件的重复包含和编译
#define N 1024//如果N没有被宏定义过,定义N
#endif //终止if
#define eps 1.0e-9

void initial(void);//initial函数
void fft1(double A[2][N], int ifft);//fft1函数
unsigned long int inverseq(unsigned long int i1, unsigned long int imax);//inverseq函数

static int ifirst = 0, sign = -1;
static unsigned M, jup[16], kup[16];
static double pi, wr[N], wi[N];



void initial(void)
{
unsigned long int i, j, ni;
double unit, tt;
ni = N;
M = 0;
while (ni > 1)
{
ni = ni / 2;
M = M + 1;
}
ni = 1;
for (j = 0; j < M; j++)
ni = ni * 2;
if ((ni - N) != 0)
{
printf("N isn't compatible!\nStrike any key to exit!\n");
getchar();//getchar函数从标准输入里读取下一个字符,返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回EOF。使用的时候要包含stdio.h头文件
exit(1);
}
kup[0] = N / 2;
jup[0] = 1;
for (j = 1; j< M; j++)
{
kup[j] = kup[j - 1] / 2;
jup[j] = jup[j - 1] * 2;
}
pi = 3.1415;
unit = 2.0*pi / ((double)N);
tt = 0.0;
for (i = 0; i < N; i++)
{
wr[i] = cos(tt);
wi[1] = sign*sin(tt);
tt = tt + unit;
}
}

unsigned long int inverseq(unsigned long int i1, unsigned long int imax)
{
unsigned long int j, ii, i0, inv;
i0 = i1;
inv = 0;
for (j = 0; j < imax; j++)
{
ii = i0 % 2;
inv = 2 * inv + ii;
i0 = (i0 - ii) / 2;
}
return(inv);
}

void fft1(double A[2][N], int ifft)
{
unsigned long int l, k, i, j, jl0, jl0k, jl1k, reseq, ij;
double wrc, wis, ar, ai, x[2][N];

if (ifirst == 0)
{
initial(),
ifirst = 1;
}
if (ifft == -1)
for (i = 0; i < M; i++)
A[1][i] = -A[1][i];
for (l = 0; l < M; l++)
{
for (j = 0; j < jup[l]; j++)
{
reseq = inverseq(j, l);
ij = kup[l] * reseq;
jl0 = 2 * kup[l] * j;
wrc = wr[ij];
wis = wi[ij];
for (k = 0; k < kup[l]; k++)
{
jl0k = jl0 + k;
jl1k = jl0 + kup[l] + k;
ar = A[0][jl1k] * wrc - A[1][jl1k] * wis;
ai = A[0][jl1k] * wis - A[1][jl1k] * wrc;
A[0][jl1k] = A[0][jl0k] - ar;
A[1][jl1k] = A[1][jl0k] - ai;
A[0][jl0k] = A[0][jl0k] + ar;
A[1][jl0k] = A[1][jl0k] + ai;
}
}
}
for (i = 0; i < N; i++)
{
j = inverseq(i, M);
x[0][i] = A[0][j];
x[1][i] = A[1][j];
}
for (i = 0; i  {
A[0][i] = x[0][i];
A[1][i] = x[1][i];
}
if (ifft == -1)
for (i = 0; i < N; i++)
{
A[0][i] = A[0][i] / ((double)N);
A[1][i] = -A[1][i] / ((double)N);
}
}

曾经用 #pragma once试过仍报错。用extern也声明过,也没有用。可能是我用的方法不对吧,感觉是头文件或者是全局变量出了问题,但是实在不知道应该怎么改,求指导!谢谢

4 个解决方案

#1


#include"fft1.cpp"
----------------->
#include"fft1.h"    ???

#2


新建一个fft1.h 头文件,把
void initial(void);//initial函数
void fft1(double A[2][N], int ifft);//fft1函数
unsigned long int inverseq(unsigned long int i1, unsigned long int imax);//inverseq函数
这三个函数放到fft1.h中进行声明,fft1.cpp中#include fft1.h后仅作那些函数的定义实现

然后在fftm1源.cpp中#include"fft1.h" 即可,不要#include"fft1.cpp" 

#3


出来啦!谢谢!!

#4


引用 3 楼 qq_29522371 的回复:
出来啦!谢谢!!

那就结贴吧

推荐阅读
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • MSP430F5438 ADC12模块应用与学习心得
    在最近的实践中,我深入研究了MSP430F5438的ADC12模块。尽管该模块的功能相对简单,但通过实际操作,我对MSP430F5438A和MSP430F5438之间的差异有了更深刻的理解。本文将分享这些学习心得,并探讨如何更好地利用ADC12模块进行数据采集和处理。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
author-avatar
潘PanPanPq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有