3

解析情報を保持する構造体を作成しようとしていますが、データが入力された構造体を返すメソッドを作成したいと思います。これはこれまでのところですが、Parser.c:3:errorというエラーが発生します。 :期待される'='、'、'、';'、'asm'または'<strong>属性'の前に'parseString' </ p>

Parser.h

    #include <stdio.h>
    #include <string.h>

    typedef struct 
    {
       char* myArguments;
       char* myProgramName;
           int myNumArguments;

    }ParserData;


    ParserData parseString(int argc, char** argv);

Parser.c

    #include "Parser.h"

    ParserData parseString(int argc, char **argv)
    {
         ParserData tempData;

         tempData.myNumArguments = argc;

         return tempData; 
    }

Mish.h

    #include "Parser.h"

    ParserData myParserData;

Mish.c

   #include <stdio.h>
   #include <string.h>
   #include <sys/types.h>
   #include <unistd.h>
   #include <sys/wait.h>
   #include "Mish.h"

   #define MAXLINE 1024


   int main(int argc, char *argv[], char **environ)
   {
       char buf[MAXLINE];
       pid_t pid;
           int status;

       printf("mish>"); //Print shell

       myParserData = parseString(argc, argv);

       while (fgets(buf, MAXLINE, stdin) != NULL) 
       {
       buf[strlen(buf) - 1] = 0; /* replace newline with null */

       if ( (pid = fork()) < 0)
       {
          printf("fork error");
       }
       else if (pid == 0) /* child */
       { 
          execlp(buf, argv[1], (char *) 0);
          printf("couldn't execute: %s", buf);
          return(127);
       }

       /* parent */
       if ( (pid = waitpid(pid, &status, 0)) < 0)
       {
          printf("waitpid error");  
          printf("%% ");
       }

       }

  return(0);
    }
4

2 に答える 2

2

これが1つのアプローチです(main.c):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct {
    char* myArguments;
    char* myProgramName;
    int myNumArguments;
} ParserData;

ParserData * parseString(int argc, char** argv);

int
main(int argc, char const *argv[])
{
    ParserData *foo = NULL;

    foo = parseString(argc, (char **)argv);
    if (foo) {
        fprintf(stderr, "myNumArguments: %d\n", foo->myNumArguments);
        free(foo);
    }

    return EXIT_SUCCESS; 
}

ParserData *
parseString(int argc, char **argv)
{
    ParserData *tempData;

    tempData = malloc(sizeof(ParserData));
    tempData->myNumArguments = argc;

    return tempData;
}

コンパイルする:

$ gcc -Wall main.c -o foo

走る:

$ ./foo 
myNumArguments: 1
$ ./foo bar
myNumArguments: 2

char *これにより、構造内の2つのコードとメモリ管理のエラーチェックが大幅に削減されます。うまくいけば、ヘッダーファイルと実装ファイルに何を分割するかを理解するのに役立つでしょう。

于 2012-10-20T09:47:31.087 に答える
0

これはコードの問題ではなく、ファイルの問題でした。.hファイルにMish.h.gchとParser.h.gchがあることに気づきました。.hと.h.gchを削除し、.hファイルを再作成してから、「gcc -o mish Parser.c Mish.c」でコンパイルすると、正常にコンパイルされました。私の推測では、新しいコードが適切に更新されていないという問題があったと思います...

于 2012-10-20T23:13:56.770 に答える