在 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 中如何看它执行的步骤,

visual studio 2008 在编写C程序语言时,为啥调试窗口自动瞬间关闭?

在 C# Visual Studio 中执行所有测试脚本时执行代码

visual studio 2012 启动出现如下错误,怎么处理

visual studio 2017调试时闪退。

有啥方法可以在 C#/Visual Studio 的断点上睡觉?