Ustawienie wartości dla Void*

0

Rozwiązuję zadania ćwiczeniowe z Thinking in C++ i mam mały problem:

Zdefiniuj tablicę liczb całkowitych. Pobierz adres początku tej tablicy i użyj rzutowania static_cast w celu przekształcenia go do typu void. Napisz funkcję, która pobiera argument typu void , liczbę oznaczającą liczbę bajtów i wartość określającą wartość która powinna zostać przypisana każdemu bajtowi.

Nie bardzo wiem jak przypisać bajty do typu void*. Na pewno autor nie oczekiwał tego, żebym z powrotem to zamieniał na int...
Jakaś sugestia ? Nie chcę gotowego rozwiązania

#include <iostream>

using namespace std;

void Func(void* tab, int count, int l)
{
        for(int i=0;i<count;++i)
        {
                tab[i] = l;
        }
}

int main()
{
        int tab[10];
        for(int i=0;i<10;++i)
                tab[i] = i*i;
        void* ptr = static_cast<void*>(tab);
        Func(ptr, 10, 25);

        for(int i=0;i<10;++i)
                cout << tab[i] << '\n';

        return 0;
}
0

Najprościej za pomocą memset ;) A jak chcesz ręcznie to zrzutuj to na coś co ma 1 bajt (np. na char)

0

Tu mam segfault. Dobry tok ?

void Func(void* tab, int count, unsigned char val)
{
        unsigned char* buff = reinterpret_cast<unsigned char*>(&tab);
        for(int i=0;i<count;++i)
        {
                buff[i] = val; 
        }
}
0

reinterpret_cast<unsigned char*>(tab);

0

No dzięki, ugrzęzłem na kolejnym zadaniu (ostatnim) :>

Zadeklaruj wskaźnik do funkcji przyjmującej argument int i zwracającej wskaźnik do funkcji, która przyjmuje argument typu char o zwraca wartość typu float.
Próbowałem zTypeDefować wskaźnik do funkcji, ale nie dałem rady. Wywala się na tym, że void* nie da się "odpalić". Jakaś rada ?

 #include <iostream>

using namespace std;

float Func2(char c)
{
        return static_cast<float>(c);
}

void*  Func(int a)
{
        float (*Fn)(char) = &Func2;
        return reinterpret_cast<void*>(Fn);
}

int main()
{
        void* (*Fn)(int) = &Func; 
        cout << (*(*Fn)(5)) << '\n';
        return 0;
}
0

Trochę się musiałem pobawić, ale udało się.
Funkcje:

float A(char a)
{
    return 0;
}

float (*B(int a))(char a)
{
    float (*fun)(char) = A;

    return fun;
}

Deklaracje wskaźników:

int main ()
{
    auto p1 = B;  //możliwe tylko w C++0x
    float (*(*p2)(int))(char) = B;

    return 0;
}

//że też nigdy nie musiałem używać tak popapranych konstrukcji :D

0

wydaję mi się że nie jest zgodne z zadaniem.
W funkcji B, miałeś zwrócić wskaźnik do funkcji A ?
A zwracasz floaty :>

0

a nie sorry.
Swoją drogą poryte zadanie jak na sam pcozątek ksiązki :>

0

Dlaczego uzyłes auto? czyzby C++ 0x weszlo w obieg?

0

Jeszcze nie, ale np. MSVC++ już to wspiera. Zresztą podałem to tylko jako alternatywę.

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