Я реализовал эту функцию для отображения битов числа (я хотел видеть все 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 в моем коде или чего-то подобного ...
Я уверен, что 10 будет напечатан с кодом, который вы нам не показываете ... :-)
Ладно, отредактировал пост прямо сейчас!
Этот printf("%ld", afisare(aux)); вызывает неопределенное поведение, поскольку afisare() ничего не делает с return.
Так что же мне вернуть, если мне уже есть что показать? Если я нажимаю return 0, он пишет 0 перед текстом, который я хочу показать. Извините, я только начинаю программировать ..
@kannon Лучше предоставлять обновления по вашему вопросу, чем просто обновлять основной контекст. Возможно, отредактируйте вопрос и добавьте тег UPDATE: с новой информацией. Причина этого в том, что для людей, которые прокомментировали или ответили, вы меняете контекст, и их ответ и комментарии становятся запутанными и даже бесполезными. Хорошо продвигать вопрос таким образом, чтобы помочь другим, кто столкнется с вашим исходным вопросом через шесть месяцев, разобраться во всех комментариях.





Сделайте так, чтобы 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: Тогда не передавайте afisare(aux) вызову printf!
Тогда к чему? Если у меня есть «newVar = afisare (aux);» а затем я распечатываю это, он все равно покажет возврат функции. Как еще можно этого избежать?
Не печатать?
Я должен это распечатать. Я бы не стал с этим бороться, если бы не нужно было его печатать.
Зачем тебе это печатать? Вы уже распечатали биты в функции.
О, теперь я понимаю, как это работает. Спасибо большое, мой плохой!
Проблема в этой строке: printf("%ld", afisare(aux));
Вы вызываете afisare(aux), который печатает 9 бит и не имеет оператора return, поэтому возвращаемое значение неопределенно. Затем это возвращаемое значение печатается printf("%ld", ...). В это конкретное время суток в вашей системе есть значение 10, но это может быть что угодно. На самом деле это неопределенное поведение.
Вы можете исправить проблему, распечатав возвращаемое значение нет: просто вызовите функцию с afisare(aux);.
Вы также должны определить afisare как функцию void, поскольку она ничего не возвращает.
Включение предупреждений компилятора поможет диагностировать такие глупые ошибки (gcc -Wall -Wextra, clang -Weverything, cl /W4 ...).
Мне нравится, что некоторые люди объясняют лучше, чем некоторые учителя на этом сайте ❤️
@Kannon: Я живу ради такого комментария :)
Покажите полная программа, который воспроизводит проблему, и покажите вход, для которого программа терпит неудачу. См. Руководство по созданию Минимальный полный проверяемый пример.