2014-01-25 3 views
0

Мне нужна помощь с назначением, которое должно состояться через несколько дней. Я попросил сделать следующее:Необходимо переместить обновленные значения в motion.c и изменить направление

motion.c:

Эта внешняя функция принимает вид: ИНТ движения (интермедиат NodeID, внутр строка, столбец INT, INT направление) Начиная с строки и столбца поля, указанного в аргументах функции, эта процедура помещает nodeid в это поле. Затем, основываясь на целочисленном направлении (0-3), движение перемещает одно пятно в соответствующем направлении , приращает nodeid и откладывает обновленный узел в следующей позиции в этом направлении. Движение продолжает помещать целые числа в поле до тех пор, пока оно не поместит целое число на краю поля.

main.c:

* Ваше задание написать программу C, что сначала считывает в одной строке ввода, которая содержит целое число образцов. main затем читает в образцах строки тестовых данных. Каждый образец линия тестовых данных содержит четыре целых числа , соответствующее: NodeID направления столбца строки Для каждого образца тестовых данных вашей программы выполняет следующие действия:

1) Очистить поле (т.е. заполнить массив поля с нулями) ,

2) Вызовите движение с использованием тестовых данных образца в качестве аргументов.

3) Вызов print_field распечатать результирующего поля на стандартный вывод *

Вот код 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, вы можете выбрать другое направление. Как?), и даже если я добавил целое число без знака в мою строку и столбец, чтобы избежать ниже 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' приводит к действительному индексу? –

+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))) 

, который будет верно всегда becuase из || состояние. либо левая часть, либо правая часть, будет истинна, поэтому все условие будет истинным, и вы войдете в цикл, если либо строка == -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; 
} 
+0

Но когда я впервые ввел строку, я сказал 2. И я указал, что while должен заканчиваться, когда он достигает 0. – Michformer

+0

нет while (row> = 0) означает точно так, как он звучит, а строка больше нуля или равно нулю, вы войдете в цикл. Попробуйте изменить условие на while (((строка 0)) || ((column 0))) – Dabo

+0

Как я могу предотвратить строку и столбец ниже 0? Я добавил условие, в котором четко указано, что он должен оставаться между LENGTH или WIDTH и 0. – Michformer