0

私はあちこちを検索してきましたが、別の関数ではなく、構造体配列の初期化に関するものしか見つかりませんでした。これは私の古い宿題です。私の課題は、テキスト ファイルからコマンドを読み取り、それらを配列に格納して、コマンドを sketchpad というプログラムにパイプすることでした。テキストファイルに終了コマンドがあるため、構造体配列を別の関数で初期化/再初期化する必要があると実際に感じています(その終了コマンドの後には何もないと思いました)。調べてみると、2 つのテキスト ファイルを 1 つのファイルで連続して読むことができるという事実に対応するのを忘れていました。他にも方法はありますが、先生はクラスでそれに対応する方法を教えてくれました。しかし、私は自分のやり方でそれを行う方法を知りたいです。構造体配列を初期化/再初期化して、値を呼び出された場所に戻す関数をどのように呼び出しますか? ポインターを使用しますよね?どうすればそれを行うことができますか?

これが私のコードです:

void fileParsing(FILE * fp, FILE* pipe)
{
   /*defines and initializes the commands being searched and counted */
   int Figure =0;
   int draw =0;
   int End =0;
   int printFigure =0;
   int drawFigure =0;
   int translate =0;
   int child =0;
   int comment =0;
   int i, j;

   struct figure array_figure[19];  //WTF!!!! WHY 19?????
   //assigns absurd values to array to distinguish when to stop looking for coordinates
   for(i=0; i < FIGURE_MAX; ++i)
   {
      memset(array_figure[i].name, 0, LINE_LEN);
      for(j=0; j<POINTS_MAX; ++j)
      {
         array_figure[i].Coord[j].xcoor = fup_value;
         array_figure[i].Coord[j].ycoor =fup_value;
      }
   }
   //array_figure[15].name = "adsfsdf";

   //printf("\n%d",array_figure[0].Coord[0].xcoor);
   int count = 0;
   int count2 = 0;
   int drawCount = 0;
   int reset;
   //if(reset = 0; reset < 256; reset++);
   //strncpy(array_figure[count].name, "0", LINE_LEN);

   //printf("about to go into a while loop\n");

   while(fgets(line, LINE_LEN, fp)!=NULL)
   {
      sscanf(line, "%s%s%d%d", command, name, &x, &y);

      //looks for commands and organizes them accordingly
      if(strncmp(command, "Figure", 6) == 0)
      {
         printf("Found a Figure command\n");
         sscanf(line, "%s%s%d%d", command, name, &x, &y);

         originX = x;
         originY = y;

         //assigns name and initial point
         strncpy(array_figure[count2].name, name, LINE_LEN);
         array_figure[count2].Coord[count].xcoor = x; //change: count2 from '3' from array_figure[i]
         array_figure[count2].Coord[count].ycoor = y;
         //printf("%s: %lf, %lf\n", array_figure[count2].name, array_figure[count2].Coord[count].xcoor, array_figure[count2].Coord[count].ycoor);

         count++;
         //printf("%d\n", count);

         //fprintf(output, "%d  %d\n", x, y); //MIGHT BE NEEDED!
         //originX = x;
         //originY = y;
      }

      else if(strncmp(command, "draw", 5) == 0)
      {
         printf("Found a draw command\n");
         sscanf(line, "%s%d%d", command, &x, &y);
         //strncpy(array_figure[count].name, "0", LINE_LEN);

         //priFiguntf("%s\n", array_figure[2].name);

         //creates a new origin coordinate
         originX = array_figure[count2].Coord[count-1].xcoor;
         originY = array_figure[count2].Coord[count-1].ycoor;

         //assigns more coordinates
         array_figure[count2].Coord[count].xcoor = originX + x;
         array_figure[count2].Coord[count].ycoor = originY + y;
         //printf("%lf, %lf\n", array_figure[count2].Coord[count].xcoor, array_figure[count2].Coord[count].ycoor);
         //printf("%c\n", array_figure[count]);

         count++;
         //printf("%d\n", count);
      }

      else if(strncmp(command, "drawFigure", 10) == 0)
      {
         printf("Found a drawFigure command\n");
         sscanf(line,"%s%s\n", command, name);
         //if statement; iterates through to with strncmp to find figure name to draw

         //printf("%s\n", name);
         drawFigureCount= 0;
         //checks for which element matchs the specified name for drawing
         while(
            strncmp(array_figure[drawFigureCount].name, name, LINE_LEN) != 0 &&
            drawFigureCount < FIGURE_MAX)
            drawFigureCount++;

         if(drawFigureCount < FIGURE_MAX)
         {
            //printf("\tstartingX/Y assign\n");
            startingX = array_figure[drawFigureCount].Coord[0].xcoor;
            startingY = array_figure[drawFigureCount].Coord[0].ycoor;
            //printf("\tdone - startingX/Y assign\n");
            //sends coordinates to sketchpad
            for(i=1; i< POINTS_MAX; ++i)
            {
               if(array_figure[drawFigureCount].Coord[i].xcoor != fup_value &&
                  array_figure[drawFigureCount].Coord[i].ycoor != fup_value)
               {
                  //printf("\t\tdraw segment sent to output\n");
                  fprintf(pipe,
                     "drawSegment %ld %ld %ld %ld\n",
                     lround(startingX), lround(startingY),
                     lround(array_figure[drawFigureCount].Coord[i].xcoor),
                     lround(array_figure[drawFigureCount].Coord[i].ycoor)
                     );
                  //printf("\t\tdone - draw segment sent to output\n");

                  //printf("\t\tstartingX/Y update\n");
                  startingX = array_figure[drawFigureCount].Coord[i].xcoor;
                  startingY = array_figure[drawFigureCount].Coord[i].ycoor;
                  //printf("\t\tdone - startingX/Y update\n");

               } else break;
            }
            //printf("\tbroke out of the loop or the loop ended\n");
         }
      }

      //checks for "end" in the input file to know when to stop making coordinates for a figure
      else if(strncmp(command, "End", 3) == 0)
      {
         printf("Found a End command\n");
         //strncpy(array_figure[count].name, command, LINE_LEN);
         //printf("%s\n", array_figure[count].name);

         count2++;
         count = 0;
      }

      //organizes and prints coordinates to console
      else if(strncmp(command, "printFigure", 11) == 0)
      {
         //printf("Print Figure %s\n", name); **UNCOMMENT**
         while(strncmp(array_figure[printFigureCount].name, name, LINE_LEN) != 0 &&
            printFigureCount < FIGURE_MAX)
            printFigureCount++;

         if(printFigureCount < FIGURE_MAX)
         {
            for(i=0; i< POINTS_MAX; ++i)
            {
               if(array_figure[printFigureCount].Coord[i].xcoor != fup_value &&
                  array_figure[printFigureCount].Coord[i].ycoor != fup_value)
               {
                  //converts values to int for printing
                  int intConvertX = (int) array_figure[printFigureCount].Coord[i].xcoor;
                  int intConvertY = (int) array_figure[printFigureCount].Coord[i].ycoor;
                  //printf("%d %d\n", intConvertX, intConvertY); **UNCOMMENT**
               }
            }
         }
      }

      else if(strncmp(command, "translate", 9) == 0)
      {
         printf("Found a Translate command\n");
         //translate++;
      }
      /*else if(strncmp(command, "clearScreen", 11) == 0)
      {
      sscanf(line, "%s%s", command, clear);
      printf("%s\n", clear);

      }*/
      else if(strncmp(command, "child", 5) == 0)
      {
         sscanf(line, "%s%s", command, clear);
         printf("Found a child command\n");
         //printf("\t\t\tsending child\n");

         fprintf(pipe, "%s", &line[5]);
         printf("passed fprintf\n");

         if(strncmp(clear, "clearScreen", 11) == 0)
         {
            printf("%s\n", clear);
            fprintf(pipe, "%s", &clear[11]);
            break;
         }

         //printf("\t\t\tdone -- sending child\n");
      }
      else if(strncmp(command, "#", 1) == 0)
      {
         printf("Found a # command\n");
         //printf("%s", line); **COMMENT OUT**
      }
   }

"clearScreen"それがテキストファイルに表示されると言うたびに注意すると"child clearScreen"if(strncmp(clear, "clearScreen", 11) == 0). 後で壊れましたが、別の関数を呼び出して配列を再初期化したいので、関数を離れる必要はありません。

4

2 に答える 2

2

「初期化」の意味によって異なります。

構造体配列を次のように宣言している場合

struct figure array_figure[19];

要素のすべての値をデフォルトに戻したいだけの場合は、配列を関数に渡し、関数内で変更できます(技術的には、最初の要素へのポインターを渡します)。このような関数のシグネチャは、次のようになります。

void modify(struct figure *array_of_structs, unsigned int length_of_array)

そしてそれを次のように呼びます:

modify(array_figure, 19); // if 19 is the length, that is

完全に新しいアレイが必要な場合は、JonathanCruzが提案したように新しいアレイを割り当てる必要があります。

于 2012-10-30T23:46:04.740 に答える
0

初期化するには、malloc を使用して必要なメモリを割り当てます。malloc はポインターを返すので、それを関数に入れることができます。再初期化が必要な場合は、構造体を解放してやり直すことができます。

何かのようなもの:

typedef struct mystruct {
    // ...
}MyStruct;

MyStruct* getMyStruct() {
    return (MyStruct*) malloc(sizeof(MyStruct));
}

それらのリンクを確認してください。

http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/

http://www.cplusplus.com/reference/clibrary/cstring/memset/

于 2012-10-30T23:26:23.903 に答える