Problem makro

0

Cześć stworzyłem makro do wyswietlania bitow z liczby makro ma działać dla róznych typów zmiennych

#define DISPLAY_BITS(value){\
    int i;\
    int x=sizeof(value);\
    for(i=x*8-1;i>=0;i--)\
    {\
         if((value&((unsigned long long int)1<<i))==0)\
        {\
            printf("0");\
        }else\
        {\
            printf("1");\
        }\
    }\
}


Dla zmiennych typu unsigned long ** i ** unsigned short działa poprawnie natomiast dla unsigned int wyswietla zawsze tą samą wartość

00000000000000000000000000000100

1

Możesz pokazać jak wywołujesz to makro? Bo SOA #1

0

unsigned int x;
scanf("%u",&x);
DISPLAY_BITS(x);

0

A jak dasz spację przed %u będzie to samo?
scanf(" %u",&x);

0

Tak dzieje się to samo

0

A jaką wartość wprowadzasz do programu?

0

1,2, 10 ,20 dla każdego to samo czyli 00000000000000000000000000000100

0

4 to EOF w ASCII.
https://pl.wikibooks.org/wiki/C/scanf

Funkcja zwraca EOF jeżeli nastąpi koniec danych lub błąd odczytu zanim jakiekolwiek konwersje zostaną dokonane lub liczbę poprawnie wczytanych pól (która może być równa zero).

Nie zostają Ci śmieci w stdin po poprzednim scanf'ie? Np. znaki przejścia do nowej linii, przecinki itp.?

0

Nie sądze , wyświetliłem sobie zmienną x - scanf działa poprawnie . Dodatkowo dla innych typów zmiennych znajdujących się w tym samym bloku if else if wszystko działa jak należy.

0

Pokaż może więcej kodu, bo testowałem to makro u siebie i wszystko zdaję się działać poprawnie.

1

Zmień nazwę zmiennej w makro tak aby ciężko było o kolizję nazw z tymi w programie. Teraz "gryzą się".

0

Tak wyglada main


int main() 
{
    

    int type;
    int error;


    printf("Enter data type : ");
    error=scanf("%d",&type);
    if(error==0)
    {
        printf("Incorrect input");
        return 1;
    }
    
    printf("Enter an integer : ");
    if(type==0)
    {
        unsigned int x;
        error=scanf("%u",&x);
        if(error==0)
        {
            printf("err");
            return 1;
        }
        DISPLAY_BITS(x);
    
    }else if(type==1)
    {
        unsigned short y;
        error=scanf("%hu",&y);
        if(error==0)
        {
            printf("err");
            return 1;
        }
        DISPLAY_BITS(y);
    }else if(type==2)
    {
        unsigned long z;
        error=scanf("%lu",&z);
        if(error==0)
        {
            printf("err");
            return 1;
        }
        
        DISPLAY_BITS(z);
        
    }else
    {
        printf("errror");
        return 2;
    }
    
    
    return 0;
}
0

Tak problemem była nazwa zmiennej x.

1 użytkowników online, w tym zalogowanych: 0, gości: 1