Функция возвращает 1 вместо значения? - PullRequest
1 голос
/ 16 июня 2020

Я пишу структуру данных очереди, и я не могу сохранить значение целого числа в массиве после того, как значение будет возвращено в стек. Функция pop делает именно то, что ей нужно, но почему main не получает эту информацию? Что мне не хватает? малло c?

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int QUE[20];
const int EMPTY = -1;
int position = -1;
int retrieve = 0;

//push, append to front of array
bool push(int num) {
    if (position >= 20) return false;
    position += 1;
    QUE[position] = num;
    return true;
}

//pop from top of array
bool pop() {

    if(QUE[retrieve] == 0) return false;
    int hold = QUE[retrieve];
    printf("%d",hold);
    retrieve ++;
    return hold;

}

// PEEK

// First in first out

int main() {
    push(12);
    push(90);
    push(22);

    int t;
    //why does pop equal 1
    while ((t = pop()) != 0) {
        printf("t = %d\n",t);

    }

}

Ответы [ 3 ]

2 голосов
/ 16 июня 2020

Вы пытаетесь передать два разных типа информации - логическое состояние «сообщение успешно выполнено» и целочисленное значение, извлеченное из очереди - в пределах одного и того же значения. Это плохо; и несоответствие привело к объявлению возвращаемого типа как bool, в результате чего результирующее значение t равно нулю или единице (как преобразование false или true, соответственно, в тип int ).

Попробуйте разделить действие на этапы тестирования и выборки, например:

bool anyItemInQueue()
{
    return _add_appropriate_condition_here_;
}

int main()
{
    ....

    while( anyItemInQueue() )
    {
        int t = pop();

        .... // use t here
    }
}

или передать другую переменную для получения другого значения:

bool pop(int *result)
{
    if( anyItemInQueue() )
    {
        *result = QUE[retrieve];
        ....                        // some housekeeping here
        return true;                // success status
    }
    return false;                   // failure status
}

int main()
{
    ....
    int t;
    while( pop( & t ) )      // point at t to receive the popped value
    {
        .... // use t here
    }
}
1 голос
/ 16 июня 2020

Ваш код имеет неопределенное поведение.

Рассмотрим, например, функцию push

//push, append to front of array
bool push(int num) {
    if (position >= 20) return false;
    position += 1;
    QUE[position] = num;
    return true;
}

и для простоты предположим, что массив QUE имеет только один элемент, который объявлено как

int QUE[1];

В этом случае очередь может содержать только одно переданное значение из-за емкости массива.

Итак, после первого вызова push like

push( 0 );

у вас будет, что position равно 0, а очередь содержит значение 0.

Если вызвать функцию второй раз, например,

push( 1 );

условие в функции

if (position >= 1) return false;

не будет оцениваться как истинное, потому что текущее значение position равно 0. В результате функция попытается записать значение 1 в недопустимое место массива QUE[1].

Массив содержит только один элемент, но функция позволяет записать еще один элемент.

Теперь давайте рассмотрим функцию pop

bool pop() {

    if(QUE[retrieve] == 0) return false;
    int hold = QUE[retrieve];
    printf("%d",hold);
    retrieve ++;
    return hold;

}

и ту же очередь, которая уже содержит только один элемент, равный 0 (см. Предыдущий вызов push( 0 )).

Поскольку условие оператора if

if(QUE[retrieve] == 0) return false;

оценивается как истинное (очередь действительно содержит значение 0, помещенное в очередь раньше), тогда функция вернет false, как если бы очередь пуста, хотя это не так. пусто.

Итак, эта функция недействительна.

Более того, в l oop в основном

while ((t = pop()) != 0) {
    printf("t = %d\n",t);

}

кажется, что вы пытаетесь вывести значения, хранящиеся в очередь. Однако функция не возвращает таких значений. Из-за возвращаемого типа bool, который является typedef для C стандартного типа _Bool, любое возвращаемое значение преобразуется либо в 0, либо в 1.

Таким образом, программа в целом неверна .

1 голос
/ 16 июня 2020

Это потому, что любое ненулевое значение преобразуется в bool true , а затем в целое число. Целочисленное значение bool true равно 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...