Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.
Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.
Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.
Хочется узнать самый простой способ
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте. MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально. MSV>Хочется узнать самый простой способ
unsigned long ndata;
edata = (unsigned long)&ndata;
Здравствуйте, Nikopol, Вы писали:
N>Здравствуйте, MikelSV, Вы писали:
MSV>>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. N>
Здравствуйте, MikelSV, Вы писали:
MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется.
Здравствуйте, 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];
}
Здравствуйте, 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% времени при заполнении данными. Мну счастлив.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, 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);
Здравствуйте, bkat, Вы писали: B>Так работать не будет. B>Почему ты решишь, что надо брать адрес у ndata?
Мне нужно.
MSV>>edata — буффер, ndata — новый буффер, адрес которого нужно вписать в edata (в первые 4 байта). B>Это ты откуда взял?
Программа у меня такая. И логика еёйная.
B>По моему все просто до безобразия...
Все просто до безумия. Чего вы к memcpy привязались? Я же от нее избавиться хотел, она программу тормозила. (что конечно же заметно только при специальных нагрузках).
А как она работает я еще в 2003 году знал.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Все просто до безумия. Чего вы к memcpy привязались? Я же от нее избавиться хотел, она программу тормозила. (что конечно же заметно только при специальных нагрузках).
Здравствуйте, bkat, Вы писали:
B>Здравствуйте, SAV, Вы писали:
SAV>>Вероятно, просто недопонял вопрос.
B>не один ты такой
Вопрос был в том (По ходу дела я как-то неправильно его задал).
char *edata, *ndata;
Как это:
memcpy(edata, &ndata, 4);
Заменить на это (Просто не понимал, как правильно это написать):
*(unsigned int*)edata=*(unsigned int*)&ndata;
Вопрос решен
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.
MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.
MSV>Хочется узнать самый простой способ
А вы жалуетесь, что на вас не обращают внимания. Да каждый ваш вопрос — это просто праздник!
Их можно сразу постить в "Этюды для программистов".
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>Вопрос решен
Здравствуйте, 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>>Вопрос решен
Но люди еще лезут
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, 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>Но люди еще лезут
Хотите, чтобы игнорировали и не замечали вашего присутствия?
Здравствуйте, MikelSV, Вы писали:
MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata.
Осталось дождатся перехода на 64 бита и получить много-много секса
Здравствуйте, MikelSV, Вы писали:
MSV>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. MSV>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.
MSV>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.
MSV>Хочется узнать самый простой способ
если адрес edata выровнен по sizeof(void*), то можно просто:
*(void**)edata = &ndata;
если же не выровнен, то перенос побайтно
Здравствуйте, sokel, Вы писали:
S>Здравствуйте, MikelSV, Вы писали:
MSV>>Есть такая вещь: memcpy(edata, &ndata, 4); запись указателя на ndata в переменную edata. MSV>>Проблема в том, что я не могу сделать это без memcpy, а так хочется. Оказывается нет у меня опыта в этом моменте.
MSV>>Помнится очень давно я так выпендривался через какую-то свою функцию. Компилятор много ругался, но работал нормально.
MSV>>Хочется узнать самый простой способ
S>если адрес edata выровнен по sizeof(void*), то можно просто: S>*(void**)edata = &ndata; S>если же не выровнен, то перенос побайтно