2014-01-25 28 views
0

我需要一些幫助來完成幾天內到期的任務。有人問我要做到以下幾點:需要移動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]; 

我在一個嚴重的損失,但我想還算完成這個任務(即獲得技巧和提示,而不是全面的答案)。儘快讓我知道問題所在,我可以解決它!

+2

首先,你應該縮進代碼,以便它的可讀性。那麼,你確定'field'是一個有效的數組,而'(unsigned int)row-1'會產生一個有效的索引嗎? – 2014-01-25 19:56:30

+0

你還能幫我嗎? – Michformer

+0

@ H2CO3-謝謝。我感到厭倦了打字 –

回答

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 (((row < LENGTH)&&(row >= 0))||((column < WIDTH)&&(column >= 0))) 

,這將是真正的始終監守的||條件。左邊部分或右邊部分都是真的,所以所有的條件都是真實的,並且當行== -1或者是== -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; 
} 
+0

但是當我第一次輸入行時,我說了2.我指出,while應該終止,當它達到0. – Michformer

+0

沒有while(行> = 0)意味着完全如它聽起來,而行大於零或等於零時,您將進入循環。嘗試將條件更改爲while(((row 0))||((column 0))) – Dabo

+0

如何防止行和列不到0?我添加了一個條件,明確指出應該保持在LENGTH或WIDTH和0. – Michformer