开发者

c++: issue with main()? - a function-declaration is not allowed here before '{' token

I'm getting two compile errors:

/home/sater/projects/MotionManager/videoProcess.cpp:11:1: error: a function-definition is not allowed here before ‘{’ token
/home/sater/projects/MotionManager/main.cpp:85:1: error: expected ‘}’ at end of input

I checked to make sure that all parentheses and brackets were matched, but can't find the root of this problem. Could you please take a look at my code to see if I'm misunderstanding something? I'm new to c++ and am coming from mostly web programming and scripting experience but I'm a learn by doing sort of person so please excuse any mistakes due to not having "read my book" because I don't have one. A simple explanation or link to more information about my failure would be helpful.

It seems like there must be some problem in the way I call the processVideoFile function, but I can't figure out what I did wrong. Thanks for spending the time to take a look.

main.cpp

    #include <iostream>
#include <stdio.h>
#include <string>
#include <time.h>
#include "parseMotion.cpp"
#include "resumepause.cpp"
#include "videoProcess.cpp"

using namespace std;

bool DEBUG = true;

int main(int argc, char **argv) {
    //Useful directory strings
    string camDir [3];
    camDir[0]= "cam01(Outside)/";
    camDir[1]= "cam02(Upper)/";
    camDir[2]= "cam03(Lower)/";

    string latestWD = "/Store/SecurityStorage/LatestVideos/";
    string archiveWD = "/Store/SecurityStorage/VideoArchive/";

    int threadStatus [3];
    threadStatus[0] = 0;
    threadStatus[1] = 0;
    threadStatus[2] = 0;
    //-50 paused
    //-1 couldn't connect initially to camera
    //0 Not yet started
    //1 Started successfully
    //2 lost connection to cam - retrying

    deque<string> fileDeque;
    deque<int> fileTimingDeque;



    int exitTrig = -1;
    int counter = 0;

    FILE *MotionIOStream = popen("motion 2>&1", "r");
    if(!MotionIOStream){
      exitTrig = 1;
    }
    while( exitTrig < 0 )
    {      
      //Set maximum length, fgets: get one line
      char buffer[1024]; 
      string lineOutput;
      lineOutput = fgets(buffer, sizeof(buffer), MotionIOStream);

      //check mysqldb for pause/resume
      int rpResult;
      rpResult = checkSchedule(threadStatus);
      if(rpResult != 0)
      {
    return rpResult;
      }

      //process video - fork
      int pid;
      pid = processVideoFiles(fileDeque, fileTimingDeque);
      if(pid == 0)
      {
    return 0;
      }

      //cout << "Starting to parse" << endl;
      parseMotionOutput(lineOutput, threadStatus, fileDeque, fileTimingDeque);

      counter++;
      //[3] Thread 3 started
      if( counter > 20 )
      {
    exitTrig = 2;
    pclose(MotionIOStream);
    system("killall motion");
    return 0;
      }
    }
    //Handle error returns here.
    //case 1: "Couldn't start motion."
    //case 2: ""
    return 0;
}

Here is videoProcess.cpp:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <boost/xpressive/xpressive_static.hpp>

using namespace boost::xpressive;

int processVideoFiles( std::deque<std::string> &fileDeque, std::deque<int> &fileTimingDeque )
{

  std::time_t secondsNow;
  secondsNow = std::time(NULL);

  int nextFileSeconds = fileTimingDeque.front();
  int diff = secondsNow - nextFileSeconds;
  if( diff > 120)
  {
    //Should fork
    int pid = fork();
    if(pid == 0){
      //Is child
      std::string filePath = fileDeque.front();
      mark_tag wd(1), camDir(2), dateDir(3), fileName(4);
      // /Store/SecurityStorage/LatestVideos/cam03(Lower)/2011-07-21/01-20110721112236.avi
      sregex pathRegex =  (wd= "/Store/SecurityStorage/LatestVideos/") >> (camDir= ("cam0" >> range('1', '3') >> '/') ) >> (dateDir= ( repeat<4,4>(range('0', '9')) >> '-' >> '0' | '1' >> range( '0', '9' ) >> '/') ) >> (fileName= ( repeat<2,2>(range('0','9')) >> '-' >> repeat<14,14>(range('0','9')) >> '.' >> "avi" ) ) ;
      smatch pathWhat;
      if( regex_search(filePath, pathWhat, pathRegex) )
      {
    std::cout << "The working directory for this file is:" << pathWhat[wd] << std::endl;
    std::cout << "The camera directory for this file is:" << pathWhat[camDir] << std::endl;
    std::cout << "The date directory for this file is:" << pathWhat[dateDir] << std::endl;
    std::cout << "The filename of this file is:" << pathWhat[fileName] << std::endl;
      }else
      {
    std::cout << "Error: Couldn't match the file path regex." << std::endl;
    return 0;
      }

      //mplayer $filepath -vo jpeg -ao null -frames 25
      std::string commandString = "mplayer " + filePath + " -vo jpeg -ao null -frames 25";
      const char* commandChar = commandString.c_str();

      int commandResult = system(commandChar);
      if(commandResult != 0)
      {
    std::cout << "Couldn't create jpeg files for some reason" << endl;
      }else
      {
    return 0;
      }

      //Last steps
      fileDeque.pop_front();
      fi开发者_运维问答leTimingDeque.pop_front();
    }
      return pid;
  }else
  {
    return 1;
  }
}


The main definition seems correct, so there has to be an error in one of the included files. Including a .cpp file is not recommended practice, btw., and not doing that makes these kinds of errors much easier to debug.


As larsmans suggests, this is caused by some stale definition on the previous headers. Try removing them and leaving just one of them to see which one introduces the error. Also, another trick could be to use cpp directly to produce just one big file, and then edit it into an editor with syntax highlighting to see where you're missing a bracket, etc.:

cpp -Iinclude_dirs main.cpp > output_file.cpp


It seems like you have forgot to put ; after a class declaration somewhere, or forgot to put a matching }. The error is most likely in one of your header files that you haven't shown.


Where is the header <deque> included?

Also, can you put the other two files you are including, in particular the resumepause.cpp file

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜