Ошибка функции для отображения битов - PullRequest
0 голосов
/ 13 октября 2018

Я реализовал эту функцию для показа битов числа (я хотел видеть все 9 битов, даже если число можно представить в 2 битах), но после показа 2 чисел он прослушивается, и я вижу 10 перед битами.

#include <stdio.h>

unsigned long afisare(unsigned long aux1) {
    int nrBinar[100], i = 1, j;

    while (aux1 != 0) {
        nrBinar[i] = aux1 % 2;
        aux1 = aux1 / 2;
        i++;
    }

    int marime = 9;
    int lipsa = marime - ((i-1) % marime);
    if (lipsa != marime) {
        while (lipsa !=  0) {
            nrBinar[i] = 0;
            lipsa--;
            i++;
        }
    }

    for (j = i - 1; j > 0; j--) {
        printf("  %d", nrBinar[j]);
        if ((j - 1) % 3 == 0) { 
            printf("\n");
        }
    }
    //printf("\n");
}

int main() {
    unsigned long n, pi, aux;
    int tst;

    scanf("%ld %ld", &n, &pi);
    aux = n;
    tst = 0;

    printf("%ld", afisare(aux));

    while (tst != 1) {
        aux = aux | pi;
        if (aux == n) {
            tst = 1;
            printf("Coliziune!");
            break;
        }

        printf("%ld", afisare(aux));
        aux = aux & n;
        pi = pi >> 3;
    }
}

Ввод: 3 128 Ввод:

0 0 0
0 0 0
0 1 1

10 0 1 0
0 0 0
0 1 1

И т. Д.Ни одного 10 в моем коде, или что-нибудь в этом роде ...

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Проблема в этой строке: printf("%ld", afisare(aux));

Вы звоните afisare(aux), который печатает 9 битов и не имеет оператора return, поэтому возвращаемое значение не определено.Это возвращаемое значение затем печатается printf("%ld", ...).Это имеет значение 10 в вашей системе в это конкретное время дня, но это может быть что угодно.Это на самом деле неопределенное поведение .

Вы можете исправить проблему, напечатав возвращаемое значение , а не : просто вызовите функцию с помощью afisare(aux);.

Вы также должны определить afisare как void функцию, поскольку она ничего не возвращает.

Включение предупреждений компилятора поможет диагностировать такие глупые ошибки (gcc -Wall -Wextra, clang -Weverything, cl /W4...).

0 голосов
/ 13 октября 2018

Заставьте afisare() вернуть что-то, например, добавив окончательный

  return 42;
}

. В операторы печати main() добавьте новую строку и исправьте спецификатор преобразования:

  printf("%lu\n", afisare(aux));

Также исправлены спецификаторы преобразования, переданные в scanf():

  scanf("%lu %lu", &n, &pi);

Чтобы не выводить результат afisare() do not , передайте его printf().

printf("Before call to 'afisare()'\n");
afisare(aux);
printf("After call to 'afisare()'\n");

Затем вы могли бы также сделать afisare() void -функцию (функцию, не возвращающую ничего):

void afisare(unsigned long aux1) {

и удалить оператор return.

...