在 Visual Studio 中执行 C 程序时,表达式必须具有指向对象类型 ERROR 的指针
Posted
技术标签:
【中文标题】在 Visual Studio 中执行 C 程序时,表达式必须具有指向对象类型 ERROR 的指针【英文标题】:Expression must have pointer to object type ERROR while executing C Program in Visual Studio 【发布时间】:2015-04-14 01:21:13 【问题描述】:我正在尝试在 Visual Studio 中构建以下代码,并在最后 10 行中得到以下错误:错误:表达式必须具有指向对象类型的指针。
有人可以看看并告诉我这里缺少什么。
代码如下:
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct emptyPeak
unsigned int t;
int accel;
peaks[10];
struct ts0
int dt;
int N;
float NValid;
double t0;
int data[36];
int v[36];
;
struct emptyPeakConstant
int minSeparation_ms;
int minLocalRange;
float minRangeFraction;
int localRangeHalfWidth_ms;
;
int findAccExtrema()
int tStart = 10, tEnd = 5;
unsigned int candidate_t;
int type = 0;
int NPeaks=2;
int n, m, L;
struct emptyPeak peaks;
struct emptyPeakConstant pc;
struct ts0 ts0copy;
pc.minSeparation_ms = 325;
pc.minLocalRange=696;
pc.minRangeFraction=0.62;
pc.localRangeHalfWidth_ms=250;
if(ts0copy.dt==0 || ts0copy.N<3 || ts0copy.NValid<3)
return 0;
int findMaxima;
if(type == 0 || type == 2)
findMaxima = 1;
else
findMaxima=0;
int findMinima;
if(type == 1 || type == 2)
findMinima = 1;
else
findMinima=0;
L=round(pc.localRangeHalfWidth_ms/ts0copy.dt);
int minAcc=ts0copy.data[0];
int maxAcc=ts0copy.data[0];
int mnAcc=0;
int K=0;
for(n=0;n<=ts0copy.N-1;n++)
if(~ts0copy.v[n])
continue;
if(ts0copy.data[n] > maxAcc)
maxAcc=ts0copy.data[n];
if(ts0copy.data[n] < minAcc)
minAcc=ts0copy.data[n];
mnAcc=mnAcc+ts0copy.data[n];
K=K+1;
if(K==0)
return 0; // Instead of return in the matlab code
mnAcc=mnAcc/K;
float thresholdMaxima = minAcc + pc.minRangeFraction*(maxAcc - minAcc);
float thresholdMinima = maxAcc - pc.minRangeFraction*(maxAcc - minAcc);
for(n=1;n<=ts0copy.N-2;n++)
candidate_t=ts0copy.t0 + n*ts0copy.dt;
if(candidate_t<tStart || candidate_t > tEnd || ~ts0copy.v[n])
continue;
int hasMaxima;
if(findMaxima && (ts0copy.data[n] >= thresholdMaxima) && (ts0copy.data[n] >=ts0copy.data[n-1]) && (ts0copy.data[n] >= ts0copy.data[n+1]))
hasMaxima = 1;
else
hasMaxima = 0;
int hasMinima;
if(findMinima && (ts0copy.data[n] <= thresholdMinima) && (ts0copy.data[n] <=ts0copy.data[n-1]) && (ts0copy.data[n] <= ts0copy.data[n+1]))
findMinima = 1;
else
findMinima = 0;
if(!hasMaxima && !hasMinima)
continue;
int maxDelta = 0;
for(m=n-L;m<=n+L;m++)
if(m<0 || m>(ts0copy.N-1))
continue;
unsigned int delta = abs(ts0copy.data[m] - ts0copy.data[n]);
if(ts0copy.v[m] && delta > maxDelta)
maxDelta=delta;
if(maxDelta < pc.minLocalRange)
continue;
if(NPeaks == 0 || (candidate_t - peaks[NPeaks-1].t) > pc.minSeparation_ms)
NPeaks=NPeaks+1;
else if(abs(ts0copy.data[n]-mnAcc) < abs(peaks[NPeaks-1].accel-mnAcc))
continue;
peaks[NPeaks-1].t = candidate_t;
peaks[NPeaks-1].accel=ts0copy.data[n];
return NPeaks;
【问题讨论】:
struct emptyPeak peaks;
at findAccExtrema
隐藏peaks
的全局名称
删除您的 MATLAB 标签,因为这与 MATLAB 无关。
【参考方案1】:
代码中存在一些问题(不一定能解决实际问题)。
1) 你真的想做吗
struct emptyPeak
unsigned int t;
int accel;
peaks[10];
?
或者你的意思是
struct emptyPeak
unsigned int t;
int accel;
peaks[10];
2) 如果您确实正确声明了上述结构,那么您是否还打算在函数 findAccExtrema() 中声明一个变量:
struct emptyPeak peaks;
因为现在您正在对一个结构进行操作,它不是一个数组,就好像它是一个数组一样。这可能就是您遇到问题的原因。
【讨论】:
以上是关于在 Visual Studio 中执行 C 程序时,表达式必须具有指向对象类型 ERROR 的指针的主要内容,如果未能解决你的问题,请参考以下文章
visual studio 2008 在编写C程序语言时,为啥调试窗口自动瞬间关闭?
在 C# Visual Studio 中执行所有测试脚本时执行代码