2013-11-16 2 views
1

Я хочу сделать очередь, которая принимает несколько входов, пока они не обнаружат «сделано», а затем остановится.Переменная, используемая без инициализации (очередность)

Так как его вход:

Pea 1 
Pork 2 
Cheese 4 
done 

И затем он возвращается в меню. Вот мой код. Проблема в том, что я получаю сообщение об ошибке «Ошибка проверки времени выполнения №3» - переменная «myJob» используется без инициализации ». Любая идея, почему это может быть? Благодаря!

void multqueue(struct pqueue *pq, struct job myJob) { 
    struct job temp; 
    int i, j; 

    printf("Enter a name and save its priority: \n"); 
    scanf("%s", &myJob.name); 
    if (strcmp (myJob.name , "done") == 1){ 
     return;} 
    scanf("%d", &myJob.priority); 

    if (pq->front == -1) { 
     pq->front = 0; 
    } 
    pq->end++; 
    pq->node[pq->end] = myJob; 
    for (i = pq->front; i < pq->end; i++) { 
     for (j = i + 1; j <= pq->end; j++) { 

      // Prioritising the queue nodes by comparing priority 
      if (pq->node[i].priority > pq->node[j].priority) { 
       temp = pq->node[i]; 
       pq->node[i] = pq->node[j]; 
       pq->node[j] = temp; 
      } else if (pq->node[i].priority == 
       pq->node[j].priority) { 
      } 
     } 
    } 
    return; 
} 
+0

Просьба указать свои вопросы на языке программирования, который вы используете, - это поможет получить их нужным людям, которые могут ответить на них. –

ответ

1

Вы не показывают нам структуру данных, но эти две строки самостоятельно непоследовательно:

scanf("%s", &myJob.name); 
if (strcmp(myJob.name, "done") == 1) 

Если strcmp() вызов правильно, то вы должны быть только прохождение myJob.name в scanf(). Вы не ставите & перед именем массива символов. Если аргумент передан в scanf() как &myJob.name, вы должны прочитать один символ (%c).

Предупреждение об исполнении времени является интересным; большинство систем не обеспечивают такой уровень защиты. Я вижу, что это может смутить адрес передаваемого массива. Путаница заключается в том, что типы &myJob.name и myJob.name отличаются друг от друга, хотя значения адресов одинаковы.

Вы должны проверять scanf() является ли успешным:

if (scanf("%s", myJob.name) != 1) 
    ...oops — error of some sort... 

Если вы наберете «программист», имя задания будет только «Компьютер».

Кроме того, нет гарантии, что strcmp() когда-либо вернется 1. Он возвращает 0, если строки равны; он возвращает неопределенное положительное число, если первая строка приходит после второго при сортировке и неопределенное отрицательное число, если первая строка предшествует второй при сортировке. Таким образом, действительными сравнениями являются:

if (strcmp(myJob.name, "done") == 0) // name == done 
if (strcmp(myJob.name, "done") != 0) // name != done 
if (strcmp(myJob.name, "done") >= 0) // name >= done 
if (strcmp(myJob.name, "done") <= 0) // name <= done 
if (strcmp(myJob.name, "done") > 0) // name > done 
if (strcmp(myJob.name, "done") < 0) // name < done 
Смежные вопросы