| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > из "с" в "с++" |
| Автор: box 9.9.2013, 15:14 | ||
| всем привет! народ , помогите переделать функцию из с в с++ совместимую
просто когда компилю g++ сыпятся ошибки : ./nm_util.h:170:18: error: cannot initialize a variable of type 'const uint64_t *' (aka 'const unsigned long *') with an lvalue of type 'const void *' const uint64_t *src = _src; ^ ~~~~ ./nm_util.h:171:12: error: cannot initialize a variable of type 'uint64_t *' (aka 'unsigned long *') with an lvalue of type 'void *' uint64_t *dst = _dst; |
| Автор: kuzulis 9.9.2013, 17:10 |
| #include <cstdint> Ах, сорри, скорее всего надо просто кастить, читай про reinterpret_cast и пр. касты. |
| Автор: feodorv 9.9.2013, 17:29 | ||
| C++ более требовательный к преобразованию типов, и по умолчанию void* не сводится к long*. Можно в старом стиле просто написать:
либо более культурно воспользоваться http://ru.wikipedia.org/wiki/%CF%F0%E8%E2%E5%E4%E5%ED%E8%E5_%F2%E8%EF%E0#static_cast. |
| Автор: box 9.9.2013, 18:29 |
| спасибо а еще вопросик , там как я понимаю идет копирование данных из структуры в структуру , как унгичтожить данные по адресу src ? |
| Автор: bsa 9.9.2013, 19:34 |
| box, если не секрет, а чем memcpy не подошел? Что ты понимаешь под "уничтожить"? Освободить память или записать мусор? Если первое, то free(). |
| Автор: feodorv 9.9.2013, 19:38 |
Очень мало информации Вы предоставили для ответа.
|
| Автор: box 9.9.2013, 19:52 | ||
| дело имею с кольцевыми буферами netmap , напрямую освобождать память не получается free(rxring) <jemalloc>: /usr/src/lib/libc/../../contrib/jemalloc/include/jemalloc/internal/arena.h:949: Failed assertion: "arena_mapbits_allocated_get(chunk, pageind) != 0" а если не освобождать память то буфер сетевой карты очень быстро переполняется... надо не заметно удалить все данные из слота ринг буфера даже и не знаю куда копать ... Добавлено через 12 минут и 32 секунды смотрите комент:
|
| Автор: akizelokro 9.9.2013, 23:09 | ||
написать в одну строку. это раз. И вообще, код забавный. Лучше это не переделывать |
| Автор: feodorv 10.9.2013, 00:32 |
Ну, если не Вы лично эту память заказывали, то вполне понятно. С NETMAP, увы, не знаком. Поверхностное чтение http://habrahabr.ru/post/183832/ показала, что эти буферы не нуждаются в непосредственном высвобождении, так как созданы в разделяемой памяти. Тем не менее, как-то нужно дать знать драйверу, что этот буфер больше не используется. Как - не знаю. Этот вопрос лучше всего задать в http://forum.vingrad.ru/forum/c-c++network.html разделе форума. |
| Автор: box 10.9.2013, 01:47 | ||||
всем спасибо , вопрос решен!
немножко через опу но работает , не виснет от переполнения буфера. странно , но иоцтл не работает почему то :
|
| Автор: borisbn 11.9.2013, 06:58 |
| > длина данных должна быть обязательно кратна 64 байтам Из названия ф-ции ИМХО следует, что так оно и д.б. > так побыстрее не факт |
| Автор: volatile 12.9.2013, 01:46 | ||
pkt_copy - да, тут и ежу ясно что именно 64 байтные блоки должны быть, и никак иначе. как это я не догадался... И кстати если делать копирование пакетами, то лучше уж передавать размер не в байтах, а кол-во пакетов. Вот тогда, физически невозможно будет передать нечетное число. (как бы там офигенно ясно функция не называлась memcpy - одна из наиболее оптимизированных функций CRT, написана на асме, с применением SSE впрочем да, не факт. |
| Автор: ТарасАтавин 16.9.2013, 15:40 | ||||
Поставь явное приведение типов указателей:
|