Ошибка функции для отображения битов

Я реализовал эту функцию для отображения битов числа (я хотел видеть все 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 в моем коде или чего-то подобного ...

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

Eric Postpischil 13.10.2018 14:02

Я уверен, что 10 будет напечатан с кодом, который вы нам не показываете ... :-)

alk 13.10.2018 14:07

Ладно, отредактировал пост прямо сейчас!

Kannon 13.10.2018 14:07

Этот printf("%ld", afisare(aux)); вызывает неопределенное поведение, поскольку afisare() ничего не делает с return.

alk 13.10.2018 14:09

Так что же мне вернуть, если мне уже есть что показать? Если я нажимаю return 0, он пишет 0 перед текстом, который я хочу показать. Извините, я только начинаю программировать ..

Kannon 13.10.2018 14:12

@kannon Лучше предоставлять обновления по вашему вопросу, чем просто обновлять основной контекст. Возможно, отредактируйте вопрос и добавьте тег UPDATE: с новой информацией. Причина этого в том, что для людей, которые прокомментировали или ответили, вы меняете контекст, и их ответ и комментарии становятся запутанными и даже бесполезными. Хорошо продвигать вопрос таким образом, чтобы помочь другим, кто столкнется с вашим исходным вопросом через шесть месяцев, разобраться во всех комментариях.

Hogstrom 13.10.2018 16:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

  return 42;
}

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

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

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

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

Чтобы не печатать результат afisare(), передайте его в printf() с помощью нет.

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

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

void afisare(unsigned long aux1) {

и отбросьте инструкцию return.

Хотя это помогло мне избавиться от 10, как я могу избавиться от 42? То есть, я не хочу показывать другие буквы или цифры.

Kannon 13.10.2018 14:15

@Kannon: Тогда не передавайте afisare(aux) вызову printf!

alk 13.10.2018 14:16

Тогда к чему? Если у меня есть «newVar = afisare (aux);» а затем я распечатываю это, он все равно покажет возврат функции. Как еще можно этого избежать?

Kannon 13.10.2018 14:23

Не печатать?

Kevin 13.10.2018 14:23

Я должен это распечатать. Я бы не стал с этим бороться, если бы не нужно было его печатать.

Kannon 13.10.2018 14:26

Зачем тебе это печатать? Вы уже распечатали биты в функции.

Kevin 13.10.2018 14:28

О, теперь я понимаю, как это работает. Спасибо большое, мой плохой!

Kannon 13.10.2018 14:30

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

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

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

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

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

Мне нравится, что некоторые люди объясняют лучше, чем некоторые учителя на этом сайте ❤️

Kannon 13.10.2018 14:50

@Kannon: Я живу ради такого комментария :)

chqrlie 13.10.2018 17:35

Другие вопросы по теме