C - program zamieniający znak na bity

0

Witam. Za zadanie mam napisać program zamieniający podany znak na jego postać bitową. Niestety, program nie daje się skompilować. Zlikwidowałem wszystkie błędy, które udało mi się znaleźć. Proszę o pomoc w znalezieniu tych błędów oraz wyjaśnienie, dlaczego jest tam błąd. Kod programu:

Plik1.c:

#include "bitowe.h"
#include <stdio.h>

int main()
{
        char c;
        int i;
	int j;
        printf("Podaj jakis znak: \n");
        scanf("%d", &u.i);
        for (j=3; j>=0; j--)
                {
                        for (i=7; i>=0; i--)
                                {
                                        printf("%d", get_bit(u.z[j],i));
                                }
                }
return 0;
}

Plik2.h:

#ifndef bitowe_h
#define bitowe_h

int get_bit(char c, int n)
{
	union U{char z[4]; int i; float f;}u;
}

#endif

Plik3.c:

int get_bit(char c, int n)
	{
		int maska=1>>n;
		return((maska&c)<<n);
	}

A takim komunikatem wita mnie gcc:

In file included from xd.c:1:0:
bitowe.h: In function ‘get_bit’:
bitowe.h:6:37: warning: unused variable ‘u’ [-Wunused-variable]
  union U{char z[4]; int i; float f;}u;
                                     ^
xd.c: In function ‘main’:
xd.c:10:22: error: ‘u’ undeclared (first use in this function)
         scanf("%d", &u.i);
                      ^
xd.c:10:22: note: each undeclared identifier is reported only once for each function it appears in
xd.c:6:14: warning: unused variable ‘c’ [-Wunused-variable]
         char c;
              ^
In file included from xd.c:1:0:
bitowe.h: In function ‘get_bit’:
bitowe.h:7:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

0

Tutaj:

scanf("%d", &u.i);

u nie istnieje.

Twoja unia powinna być zadeklarowana na zewnątrz funkcji i wtedy można utworzyć zmienną typu tej unii w main.
Zacznij też używać sensownych nazw zmiennych - U', z, i, f` itd. nikomu nic nie mówi.

0

u wywalone poza funkcję. Program się kompiluje, ale niestety wywala albo ciąg zer, albo ciąg zer z jedynką na końcu (a powinien być kod ASCII). Co do zmiennych - kod programu pisaliśmy na zajęciach wg tego, co zapisywał prowadzący. Problem polega na tym, że teraz nie mam zielonego pojęcia, co się dzieje wewnątrz programu.
Wg specyfikacji program ma najpierw wczytywać znak, potem liczbę całkowitą, a potem cokolwiek innego i wypisywać (za pomocą biblioteki) kolejne bity tego, co wczytano.

1

Trochę dziwna ta struktura - ma zmienną float f z której nie korzystasz, tablicę znaków, gdzie program prosi o wpisanie jednego oraz int do którego wpisujesz znak :D

Funkcję get_bit możesz uprościć do:

return (c >> n) & 1;
// Albo jak potrzebujesz zmiennej maska to:
int maska = c >> n;
return maska & 1;

I teraz tak, albo znak podany przez użytkownika wczytujesz do inta albo do chara bo w pętli używasz znaków z tablicy ale nigdy tam nic nie wpisywałeś. Undefined Behaviour.
Niestety nie wiem co prowadzący chce wam pokazać ale kod można uprościć do:

int get_bit(char c, int n);

int main()
{
    char c;
    printf("Podaj jakis znak: \n");
    scanf("%c", &c);

    for (int i = 7; i >= 0; i--)
    {
        printf("%d", get_bit(c, i));
    }

    return 0;
}

int get_bit(char c, int n)
{
    //int maska = c >> n;
    return (c >> n) & 1;
}

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