Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > memcpy eclipse


Автор: wertklop 7.5.2013, 13:49
Добрый день!

Ситуация такая, пишу приложение с использованием Android NDK в Eclipse. Подключаю #include <string.h>.
Есть код:
Код

    char source [200], destination [200];
    memcpy(destination, source, 200);


Eclipse выдает ошибку: 
Invalid arguments '
Candidates are:
void * memcpy(void *, const void *, ?)
'
хотя для остальных ф-й все нормально, без ошибок. Почему так происходит?

Автор: bsa 7.5.2013, 15:16
случаем у тебя нет макросов с именами source или destination?

Автор: Dem_max 8.5.2013, 06:42
все верно так как memcpy копирует побайтово, но поскольку можно скопировать какой нибудь класс POD типа, то сделали не unsigned char * в memcpy а void *.
Ну а чтобы произвести копирование нужно всего лишь привести к void * типу
Код

char source [200], destination [200];
memcpy((void *)destination, (void *)source, 200  * sizeof(char));

float source [200], destination [200];
memcpy((void *)destination, (void *)source, 200 * sizeof(float));

long source [200], destination [200];
memcpy((void *)destination, (void *)source, 200 * sizeof(long));

Автор: bsa 8.5.2013, 10:36
Dem_max, конвертация любого указателя (кроме указателей на методы класса) к void* происходит неявно.

Автор: wertklop 8.5.2013, 11:25
интересно то, что все работает без изменений, но(!!!) если изменить расширение файла с *.cpp на *.с
Как быть?

Автор: bsa 8.5.2013, 14:32
wertklop, выложи минимально возможный код, в котором воспроизводится проблема.
Попробуй так же подключать <cstring> вместо <string.h>. На stackoverflow пишут, что это может быть из-за проблемы самого эклипса.

Автор: wertklop 8.5.2013, 14:38
Цитата(bsa @ 8.5.2013,  14:32)
wertklop, выложи минимально возможный код, в котором воспроизводится проблема.
Попробуй так же подключать <cstring> вместо <string.h>. На stackoverflow пишут, что это может быть из-за проблемы самого эклипса.

минимально возможный код в 1м сообщении. подключать <cstring> не получается - пишет Unresolved inclusion: <cstring>. Может просто в Android NDK нет такой либы?

Автор: bsa 8.5.2013, 16:21
<cstring> - это стандартный хидер для С++. 

Автор: kamre 9.5.2013, 04:12
Цитата(wertklop @  7.5.2013,  13:49 Найти цитируемый пост)
Eclipse выдает ошибку: Invalid arguments 'Candidates are:void * memcpy(void *, const void *, ?)'хотя для остальных ф-й все нормально, без ошибок. Почему так происходит?

Эклипсо-проблемы, у него весьма кривой анализатор кода. К компилятору это никак не относится. Можно, например, отключить этот анализатор и полагаться только на ошибки от компилятора.

P.S. у меня кстати не выдает ошибки анализатор:
user posted image

Автор: wertklop 17.5.2013, 18:37
Решил проблему следующим образом:
h-файл
Код

#ifdef __cplusplus
extern "C" {
#endif
  void memcpyC(void *, const void *, size_t);
#ifdef __cplusplus
}
#endif


с-файл
Код

#include "Linter_C_Operations.h"
#ifdef __cplusplus
extern "C" {
#endif
void memcpyC(void *to, const void *from, size_t count) {
    memcpy(to, from, count);
}
#ifdef __cplusplus
}
#endif


Далее в Android.mk дописал название с-файла в LOCAL_SRC_FILES, а в нужном cpp-файле просто подключил вышеописанный h-файл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)