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

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ę.

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:

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]

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

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.

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:

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

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.

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

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

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?

]

“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.

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:

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ć.

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