Запись указателя в переменную
От: MikelSV http://www.centerix.ru
Дата: 24.09.07 19:07
Оценка:
Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.
Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.

Хочется узнать самый простой способ
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Запись указателя в переменную
От: Nikopol  
Дата: 24.09.07 19:09
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.
MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.
MSV>Хочется узнать самый простой способ

unsigned long ndata;
edata = (unsigned long)&ndata;

Re[2]: Запись указателя в переменную
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 24.09.07 19:24
Оценка:
Здравствуйте, Nikopol, Вы писали:

N>Здравствуйте, MikelSV, Вы писали:


MSV>>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

N>
N>edata = (unsigned long)&ndata;
N>


Во-первых, стандарт не определеят размер unsigned long. Во-вторых, не следует забывать про выравнивание: http://www.rsdn.ru/Forum/?mid=2634604
Автор: Посторонним В.
Дата: 26.08.07
.
-- Андрей
Re: Запись указателя в переменную
От: bkat  
Дата: 24.09.07 19:42
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется.

А что за данные и почему хочется именно с memcpy?
Re: Запись указателя в переменную
От: SAV  
Дата: 24.09.07 19:46
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.


MSV>Хочется узнать самый простой способ


void mycpy(void* p, void* data, int len){
    for(int i = 0; i < len; i++) ((char*)p)[i] = ((char*)data)[i];
}
Re[2]: Запись указателя в переменную
От: bkat  
Дата: 24.09.07 19:54
Оценка:
Здравствуйте, SAV, Вы писали:

SAV>
SAV>void mycpy(void* p, void* data, int len){
SAV>    for(int i = 0; i < len; i++) ((char*)p)[i] = ((char*)data)[i];
SAV>}
SAV>


Если человек не смог воспользоваться стандартной функцией memcpy,
то и твоим велосипедом он тоже не сможет воспользоваться.
Re[2]: Запись указателя в переменную
От: MikelSV http://www.centerix.ru
Дата: 24.09.07 20:03
Оценка:
Здравствуйте, SAV, Вы писали:

SAV>Здравствуйте, MikelSV, Вы писали:


MSV>>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

MSV>>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.


MSV>>Хочется узнать самый простой способ


SAV>
SAV>void mycpy(void* p, void* data, int len){
SAV>    for(int i = 0; i < len; i++) ((char*)p)[i] = ((char*)data)[i];
SAV>}
SAV>



Люди, вы чего творите?

char *edata, *ndata;

Так работает:
memcpy(edata, &ndata, 4);

edata — буффер, ndata — новый буффер, адрес которого нужно вписать в edata (в первые 4 байта).


Вроде сделал:
*(unsigned int*)edata=*(unsigned int*)(char*)&ndata;
Просто я не мог просчитать это в памяти (своей головы). Обычный код таких проблем не вызывает.

>Если человек не смог воспользоваться стандартной функцией memcpy,

>то и твоим велосипедом он тоже не сможет воспользоваться.
Прошу не гнать.

А то что это велосипед это точно. Я хоть и большой любитель велосипедов, но я все-таки умудрился написать свою memcpy на ассемблере. Учись оптимизировать.

Я не хотел использовать memcpy, потому что она тормозила работу программы. Т.е. можно было обойтись одной строчкой c++ кода, без запуска функций.
Я, как большой любитель матриц (массивов по русски), пытался заставить новую матрицу( по логике более быструю) работать быстрее предыдущей. memcpy портила все дело. Щас новая матрица смогла вырваться вперед. И съэкономить 10% времени при заполнении данными. Мну счастлив.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[3]: Запись указателя в переменную
От: bkat  
Дата: 24.09.07 20:15
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Люди, вы чего творите?


Судя по всему это ты творишь.

MSV>char *edata, *ndata;


MSV>Так работает:

MSV>memcpy(edata, &ndata, 4);

Так работать не будет.
Почему ты решишь, что надо брать адрес у ndata?

MSV>edata — буффер, ndata — новый буффер, адрес которого нужно вписать в edata (в первые 4 байта).


Это ты откуда взял?

Вот простой пример как работать с memcpy
 char *dest;
 char *src;
 size_t buffSize=100;
 
 // выделяем память для обоих буферов
 dest = new char[buffSize];
 src = new char[buffSize];

 // тут заполняем твой src так, как тебе надо.

 // теперь копируем
 memcpy( dest, src, buffSize);


Вот пример в MSDN:
http://msdn2.microsoft.com/en-us/library/8k35d1fx(VS.71).aspx

По моему все просто до безобразия...
Re[4]: Запись указателя в переменную
От: MikelSV http://www.centerix.ru
Дата: 24.09.07 20:21
Оценка:
Здравствуйте, bkat, Вы писали:
B>Так работать не будет.
B>Почему ты решишь, что надо брать адрес у ndata?

Мне нужно.

MSV>>edata — буффер, ndata — новый буффер, адрес которого нужно вписать в edata (в первые 4 байта).

B>Это ты откуда взял?

Программа у меня такая. И логика еёйная.

B>По моему все просто до безобразия...



Все просто до безумия. Чего вы к memcpy привязались? Я же от нее избавиться хотел, она программу тормозила. (что конечно же заметно только при специальных нагрузках).

А как она работает я еще в 2003 году знал.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[3]: Запись указателя в переменную
От: SAV  
Дата: 24.09.07 20:22
Оценка:
вроде memcpy и реализуется на асме (проверьте в своей ОС). Если так, то какой более эффективный способ чем побайтовое копирование вы ожидаете?

Если велосипед не нравится — не катайтесь Меня вполне memcpy устраивает. Вероятно, просто недопонял вопрос.
Re[5]: Запись указателя в переменную
От: bkat  
Дата: 24.09.07 20:24
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Все просто до безумия. Чего вы к memcpy привязались? Я же от нее избавиться хотел, она программу тормозила. (что конечно же заметно только при специальных нагрузках).


Почитай вот это:
http://www.rsdn.ru/Info/Howtoask.xml

Тяжело понять что тебе надо.
Re[4]: Запись указателя в переменную
От: bkat  
Дата: 24.09.07 20:25
Оценка:
Здравствуйте, SAV, Вы писали:

SAV>Вероятно, просто недопонял вопрос.


не один ты такой
Re[5]: Запись указателя в переменную
От: MikelSV http://www.centerix.ru
Дата: 24.09.07 20:30
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, SAV, Вы писали:


SAV>>Вероятно, просто недопонял вопрос.


B>не один ты такой




Вопрос был в том (По ходу дела я как-то неправильно его задал).

char *edata, *ndata;

Как это:
memcpy(edata, &ndata, 4);

Заменить на это (Просто не понимал, как правильно это написать):
*(unsigned int*)edata=*(unsigned int*)&ndata;


Вопрос решен
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Запись указателя в переменную
От: Sashaka Россия  
Дата: 24.09.07 21:29
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.


MSV>Хочется узнать самый простой способ


union
{
char* p;
int n;
} u;

u.n=5;
Re[6]: Запись указателя в переменную
От: djs_ Россия  
Дата: 24.09.07 21:30
Оценка:
Здравствуйте, MikelSV, Вы писали:

А вы жалуетесь, что на вас не обращают внимания. Да каждый ваш вопрос — это просто праздник!
Их можно сразу постить в "Этюды для программистов".

MSV>Вопрос был в том (По ходу дела я как-то неправильно его задал).


MSV>char *edata, *ndata;


MSV>Как это:

MSV>memcpy(edata, &ndata, 4);

MSV>Заменить на это (Просто не понимал, как правильно это написать):

MSV>*(unsigned int*)edata=*(unsigned int*)&ndata;

Супер.
Вы же понимаете, что приводя edata, который (char *) к (unsigned_int *) и обратившись по этому адресу, вы скорее всего попортите чужую память?
Кроме того, вы используете указатель для хранения адреса на нужный вам указатель (масло маслянное).
Может в этом и есть тайный смысл, но почему бы в edata не хранить именно &ndata? Тогда edata = (char *)&ndata;

MSV>Вопрос решен
--
Спасибо
Re[7]: Запись указателя в переменную
От: MikelSV http://www.centerix.ru
Дата: 24.09.07 21:55
Оценка: 1 (1)
Здравствуйте, djs_, Вы писали:

_>Здравствуйте, MikelSV, Вы писали:


_>А вы жалуетесь, что на вас не обращают внимания. Да каждый ваш вопрос — это просто праздник!

_>Их можно сразу постить в "Этюды для программистов".

MSV>>Вопрос был в том (По ходу дела я как-то неправильно его задал).


MSV>>char *edata, *ndata;


MSV>>Как это:

MSV>>memcpy(edata, &ndata, 4);

MSV>>Заменить на это (Просто не понимал, как правильно это написать):

MSV>>*(unsigned int*)edata=*(unsigned int*)&ndata;

_>Супер.

_>Вы же понимаете, что приводя edata, который (char *) к (unsigned_int *) и обратившись по этому адресу, вы скорее всего попортите чужую память?
Хм, странно, но у меня все работает.
Не понимаю. Если вы про размеры типов данны, то об этом я знаю и учитываю в разработке.

Если предлагаете сделать так: *(char *)edata=*(char *)&ndata; То нужного эффекта не получается, так как копируется только один символ.

_>Кроме того, вы используете указатель для хранения адреса на нужный вам указатель (масло маслянное).

_>Может в этом и есть тайный смысл, но почему бы в edata не хранить именно &ndata? Тогда edata = (char *)&ndata;

Пардон, но нафига мне адрес на ndata? ndata — простой указатель на новый блок данных.

Структура матрицы: [unsigned int size][char *nextdata][ char[x] data ]
Здесь я решил сделать без использования структур. Да, код писать сложнее, но более интересно.

Фокус прост: char *data, *edata, *ndata; — указатели на начало, конец и для прочих нужд.
все данные пишутся в блок данных(3) матрицы. Когда место заканчивается выделяю еще буффер, а в предыдущий блок пишу указатель на созданный.

Для определенных задач это самая эффективная матрица. Думаю на этой матрице закончится мой многолетний труд над ними. Это самая мощная матрица из всех (ранее созданных).

MSV>>Вопрос решен

Но люди еще лезут
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[8]: Запись указателя в переменную
От: djs_ Россия  
Дата: 24.09.07 23:24
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Хм, странно, но у меня все работает.

MSV>Не понимаю. Если вы про размеры типов данны, то об этом я знаю и учитываю в разработке.

MSV>Если предлагаете сделать так: *(char *)edata=*(char *)&ndata; То нужного эффекта не получается, так как копируется только один символ.


А сколько нужно копировать?

_>>Кроме того, вы используете указатель для хранения адреса на нужный вам указатель (масло маслянное).

_>>Может в этом и есть тайный смысл, но почему бы в edata не хранить именно &ndata? Тогда edata = (char *)&ndata;

MSV>Пардон, но нафига мне адрес на ndata? ndata — простой указатель на новый блок данных.


Не знаю нафига...
Но вы писали буквально:

Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.
Проблема в том, что я не могу сделать это без memcpy, а так хочется.


MSV>Структура матрицы: [unsigned int size][char *nextdata][ char[x] data ]

MSV>Здесь я решил сделать без использования структур. Да, код писать сложнее, но более интересно.

Ничем не сложнее. Просто в общем случае код будет медленнее, ну и памяти поменьше будет использовать иногда.
А чтобы было еще интереснее и эффективнее (в отношении использования памяти) используйте не т.н. "линейный односвязный список", а xor-связный список.

MSV>Фокус прост: char *data, *edata, *ndata; — указатели на начало, конец и для прочих нужд.

MSV>все данные пишутся в блок данных(3) матрицы. Когда место заканчивается выделяю еще буффер, а в предыдущий блок пишу указатель на созданный.

Это что-то вы вообще уникальное придумали. Как назвали? Паровозик?

MSV>Для определенных задач это самая эффективная матрица. Думаю на этой матрице закончится мой многолетний труд над ними. Это самая мощная матрица из всех (ранее созданных).





MSV>>>Вопрос решен

MSV>Но люди еще лезут

Хотите, чтобы игнорировали и не замечали вашего присутствия?
--
Спасибо
Re: Запись указателя в переменную
От: Аноним  
Дата: 25.09.07 05:56
Оценка: +1
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

Осталось дождатся перехода на 64 бита и получить много-много секса
Re: Запись указателя в переменную
От: sokel Россия  
Дата: 25.09.07 06:36
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.


MSV>Хочется узнать самый простой способ


если адрес edata выровнен по sizeof(void*), то можно просто:
*(void**)edata = &ndata;
если же не выровнен, то перенос побайтно
Re[2]: Запись указателя в переменную
От: sokel Россия  
Дата: 25.09.07 06:50
Оценка:
Здравствуйте, sokel, Вы писали:

S>Здравствуйте, MikelSV, Вы писали:


MSV>>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.

MSV>>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.

MSV>>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.


MSV>>Хочется узнать самый простой способ


S>если адрес edata выровнен по sizeof(void*), то можно просто:

S>*(void**)edata = &ndata;
S>если же не выровнен, то перенос побайтно

как пример, простейший блочный аллокатор:

#define ALIGNED_SIZE(T) ((sizeof(T)%sizeof(void*))?(sizeof(T)/sizeof(void*)+1)*sizeof(void*):sizeof(T))


template <typename T, size_t block_size>
class block_allocator
{
private:
    void* free_obj;
public:
    block_allocator() : free_obj(0) {}
    inline void* allocate_obj()                
    {
        if(!free_obj) allocate_new_block();
        void* ret = free_obj;
        free_obj = *((void**)free_obj);
        return ret;    
    }
    inline void release_obj(void* p)        
    {
        *((void**)p) = free_obj;
        free_obj = p;
    }
private:
    void allocate_new_block()
    {
        void* new_block = malloc(ALIGNED_SIZE(T)*block_size);
        if(!new_block) throw std::bad_alloc();
        *((void**)new_block) = block_list;
        block_list = new_block;
        free_obj = (char*) new_block + sizeof(void*);
        char* cur = (char*) free_obj;
        for(int i=0; i<block_size-1; ++i)
        {
            char* next = cur+ALIGNED_SIZE(T);
            *(char**)cur = next;
            cur = next;
        }
        *(char**)cur = NULL;
    }
};
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.