我一直在到处寻找,但我能找到的只是初始化一个结构数组的东西,而不是在另一个函数中。这是我以前的家庭作业。我的任务是从一个文本文件中读取命令,将它们存储到一个数组中,并通过管道将这些命令输入到一个名为sketchpad的程序中。我实际上觉得我应该在另一个函数中初始化/重新初始化我的结构数组,因为文本文件中有一个end命令(我以为那个end命令后面没有任何东西)。再看一遍,我忘了考虑到这样一个事实:你可以在一个文本文件中连续读取两个文本文件。还有其他的方法,老师在课堂上给我们展示了一种迎合它的方法。但我想知道如何按我的方式去做。如何调用初始化/重新初始化结构数组的函数,并将值发送回被调用的位置?我们使用指针,对吗?我们该怎么做呢?
下面是我的代码:
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)。之后我让它中断,但是我想让它调用另一个函数来重新初始化一个数组,这样我就不用离开这个函数了。
发布于 2012-10-31 07:46:05
取决于你所说的“初始化”是什么意思。
如果将结构数组声明为
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如果您想要一个全新的数组,则必须按照Jonathan Cruz的建议分配一个新的数组。
发布于 2012-10-31 07:26:24
要进行初始化,您可以使用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/
https://stackoverflow.com/questions/13149020
复制相似问题