我需要一些帮助才能在几天内完成作业。我被要求做以下事情:
motion.c:
此外部函数采用以下形式: int motion(int nodeid,int row,int column,int direction) 从函数参数中指定的字段的行和列开始,此例程放置nodeid 在该领域的位置。然后,基于方向整数(0-3),运动在适当的位置移动一个点 方向,递增nodeid,并将更新的nodeid存放在该方向的下一个位置。运动 继续在字段上放置整数,直到它在字段边缘放置一个整数。
main.c中:
*你的任务是编写一个C程序,它首先读入包含整数的单行输入 样本。然后,main读取测试数据的样本行。每个测试数据样本行包含四个整数 对应于: nodeid行列方向 对于每个测试数据样本,您的程序执行以下操作:
1)清除字段(即用零填充字段数组)。
2)使用样本测试数据作为参数调用动作。
3)调用print_field将结果字段打印到stdout。*
这是motion.c的代码。到目前为止我做了:
#include <stdio.h>
#include "motion.h"
int motion (int nodeid, int row, int column, int direction) {
nodeid = field [row][column];
while (((row < LENGTH)&&(row >= 0))||((column < WIDTH)&&(column >= 0)))
{
if (direction == 0)
{
nodeid++;
nodeid = field [row][(unsigned int)column + 1];
column++;
}
else if (direction == 1)
{
nodeid++;
nodeid = field [row][(unsigned int)column - 1];
column--;
}
else if (direction == 2)
{
nodeid++;
nodeid = field [(unsigned int)row - 1][column];
row--;
}
else if (direction == 3)
{
nodeid++;
nodeid = field [(unsigned int)row + 1][column];
row++;
}
}
return 0;
}
这是针对main.c:
#include <stdio.h>
#include "motion.h"
int main() {
int samples;
int i;
int j;
int k;
printf ("How many samples do you want?\n");
scanf ("%d", &samples);
for (i = 0; i < samples; i++)
{
printf ("Indicate nodeid, row, column and direction\n");
scanf ("%d %d %d %d", &nodeid, &row, &column, &direction);
for(j = 0; j < LENGTH; j++)
{
for(k = 0; k < WIDTH; k++)
{
field[j][k] = 0;
}
}
motion (nodeid, row, column, direction);
printf ("\n%d", print_field(field, row, column));
}
return 0;
这是我的头文件:
#define WIDTH 12
#define SAMPLES 8
enum direction {Right, Left, Up, Down};
int field [LENGTH][WIDTH];
int column;
int row;
int nodeid;
int direction;
int motion (int nodeid, int row, int column, int direction);
int print_field (int field[][ WIDTH ], int row, int column);
在motion.c中,我被要求在我的数组中移动参数nodeid,无论是向右,向左,向上还是向下。每次我移动nodeid时,我都会增加nodeid,并根据我的方向,增加或减少我的行或列。麻烦的是,一旦我做了一个动作,我不知道如何切换方向:我的意思是,虽然我在main.c中为动作函数分配一个方向,但我不知道如何在下一个动作中改变它round(例如你选择向南移动然后只要满足motion.c中的for循环条件,你可以选择另一个方向。怎么样?)即使我在我的行和列中添加了一个无符号整数,以避免继续低于0,我仍然会受到分段违规。这是我的意思的一个例子:
How many samples do you want?
1
Indicate nodeid, row, column and direction
1 2 1 2
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400746 in motion (nodeid=1, row=0, column=1, direction=2)
at motion.c:21
21 nodeid = field [(unsigned int)row - 1][column];
我正在遭受严重损失,但我希望公平地完成这项任务(即得到提示和提示,而不是完整的答案)。请尽快告诉我问题在哪里,以便我可以解决它!
答案 0 :(得分:0)
运行时确切地说明了发生的事情:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400746 in motion (nodeid=1, row=0, column=1, direction=2)
at motion.c:21
21 nodeid = field [(unsigned int)row - 1]
在运动功能中,while中的条件是
while (((row < LENGTH)&&(row >= 0))||((column < WIDTH)&&(column >= 0)))
这将是真的总是因为||条件。左侧部分或右侧部分都为真,因此所有条件都为真,并且当行== -1或者collumn == -1时,您将进入循环。 这是工作代码
int motion(int nodeid, int row, int column, int direction)
{
nodeid = field[row][column];
while (((row < LENGTH) && (row >= 0)) &&((column < WIDTH) && (column >= 0)))
{
nodeid++;
if (direction == 0)
{
field[row][column ++] = nodeid;
}
else if (direction == 1)
{
field[row][column-- ] = nodeid;
}
else if (direction == 2)
{
field[ row --][column] = nodeid;
}
else if (direction == 3)
{
field[row++][column] = nodeid;
}
}
return 0;
}