我需要一些幫助來完成幾天內到期的任務。有人問我要做到以下幾點:需要移動motion.c中的更新值並更改方向
motion.c:
這個外部函數的形式爲: INT運動(INT NODEID,詮釋行,詮釋列,詮釋方向) 在開始在函數參數中指定的字段的行和列,該例程將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中指定運動函數的方向,但我不知道如何在下一步改變它(例如,你選擇向南移動,然後只要滿足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];
我在一個嚴重的損失,但我想還算完成這個任務(即獲得技巧和提示,而不是全面的答案)。儘快讓我知道問題所在,我可以解決它!
首先,你應該縮進代碼,以便它的可讀性。那麼,你確定'field'是一個有效的數組,而'(unsigned int)row-1'會產生一個有效的索引嗎? – 2014-01-25 19:56:30
你還能幫我嗎? – Michformer
@ H2CO3-謝謝。我感到厭倦了打字 –