[C++] funkcja, która modyfikuje tablice na poziomie binaryny


(Ryś) #1

Witam! mam taki problem, otóż chciałbym napisać program w C++, który umożliwi modyfikowanie tablic np. tablica ma wartość 000010 , funkcja ta by zamieniała wartość na 111111.

oto mój kod

float tab[10];

void *wsk = static_cast(&tab);

Chiałbym aby ta funkcja przyjmowała właśnie ten argument typu *void, liczbę oznaczającą liczbę bajtów oraz wartość określająca co przypisać każdemu bajtowi.

Proszę o pomoc ponieważ nie mam pojęcia jak napisać taką funkcję.


(Wojtekbogocki) #2

A dokładniej? O co chodzi? Ma przypisywać każdemu polu tablicy wartość 1?

edit.

Dobra chyba zakumkałem prosz:

void func(int *ptr, int size, int na_co)

{

     for(int i = 0; i < size; ++i)

     {

          *ptr[i] = na_co;

     }

     delete[] ptr;

     return;

}

Funkcja zamienia pierwsze pól przyjmowanej tablicy <*ptr> na - żeby obsłużyć inne typy niż int wystarczy przeciążyć funkcję/użyć szablonu :slight_smile:

Pisane z pamięci i po dwóch kawach więc mogą być błędy :stuck_out_tongue:

O to chodziło? :slight_smile:


([alex]) #3

WOJEK64 , odradzam ci udzielać porad z zakresu C/C++ bez użycia kompilatora, to co podałeś to są totalne bzdury.

typedef unsigned char byte;float tab[10];unsigned size=sizeof(tab)/sizeof(*tab);byte *wsk=reinterpret_castbyte*(tab);unsigned i=0;isize;++i) wsk[i]=0; [/code]

(Wojtekbogocki) #4

Dobra dobra wyluzuj po prostu nie załapałem o co mu chodzi.


([alex]) #5

WOJEK64 , nie to że nie załapałeś o co chodzi, to się akurat zdarza, a to że podajesz fragmenty kodu który nie może się skompilować i to widać na pierwszy rzut oka, nawet nie wspominam o tym że po naprawieniu błędów ten kod nie da się użyć w jakikolwiek sposób.


(Wojtekbogocki) #6

Kilka błędów (jak mówiłem byłem po kilku kawach...) no ale się zrekompensuję :stuck_out_tongue:

Poprawiony, działający kod:

#include 


using namespace std;


void init(int *ptr, int size, int na_co)

{

    for(int i = 0; i < size; ++i)

    {

        ptr[i] = na_co;

    }

    delete[] ptr;

}


int main()

{

    int tab[6];


    init(tab, 6, 2);

    for(int i = 0; i < 6; ++i)

    {

        cout << tab[i];

    }

    cin.get();

    return 0;

}

funkcja init() inicjuje podaną jej tablicę określonymi, jednolitymi wartościami :slight_smile:


([alex]) #7

Tak tylko że zwalniasz tablicę mieszczącą się na stosie, kolejne przydzielenie danych i będzie bajzel nie z tej ziemi.


(Razi) #8

Zrzuć do char *:

int tab[10];

char *c=(char*)tab;

W ten sposób masz dostęp do poszczególnych bajtów. pamiętaj o Little-endianowości.

Ja w podobny sposób napisałem klasę obsługującą nawet kilkuset bajtowe liczby i mogącą je sumować :smiley: Niezbyt optymalne, bo to trwało prawie sekundę. Takie rzeczy to w Assembnelrze.


(Wojtekbogocki) #9

Yup, o wydajność dba się na końcu :smiley:


([alex]) #10

WOJEK64 , widzę że nadal nie rozumiesz, nawet po tym jak powiedziałem wprost. Zwalniasz za pomocą delete fragment stosu !!


(Wojtekbogocki) #11

Sorry ale nie mogę cię załapać :?. Tzn w moim kodzie:

najpierw:

  1. tworzymy tab[]

  2. tworzymy *ptr i przypisujemy do adresu tab[]

  3. za pomocą *ptr odwołujemy się do tab[] i wstawiamy tam co chcemy

  4. usuwamy *ptr

  5. pracujemy dalej

Nie widzę dziur w stosie a kod jest tak prosty jak tylko się da, więc nie bardzo rozumiem na czym miałyby polegać ewentualne optymalizacje...

Mógłbyś mi dokładniej wytłumaczyć na czym polega problem?


(Sawyer47) #12

]

"Usuwasz" to na co wskazuje ptr za pomocą operatora delete[]. Tylko, że nie alokowałeś tego operatorem new[]. Nie mam teraz czasu szukać co pisze na ten temat standard, ale podejrzewam, że zachowanie jest niezdefiniowane.


(Wojtekbogocki) #13

Dobra, thx nr47 , nie wiem czemu ale zawsze tak robię z tablicami i wszystko działa :smiley: Thx :slight_smile:

Temat do zamknięcia, za dużo tu off-topu :smiley:


([alex]) #14

Działa dopóki nie będzie większego projektu. Skoro nie przydzielasz pamięci pod tablice dynamicznie to nie ma sensu (a nawet niebezpiecznie) ją zwalniać.


(Wojtekbogocki) #15

No właśnie się za taki wziąłem (o ile RPG'a w Allegro można tak nazwać :wink:) i zobaczymy co będzie, mam nadzieję nauczyć się czegoś nowego :smiley: