У меня проблемы при вызове функции, принимающей указатель на строку в качестве параметра. Мне нужно получить имя элемента.
// method
void getStringFromCsv( char ** str );
Позвольте мне представить структуры, с которыми я работаю (не написано мной и является частью гораздо большего проекта, я не могу их изменить)
// typedefs
typedef char T_CHAR64[64];
typedef T_CHAR64 T_SYMBOL;
// generic element
typedef struct Element
{
T_SYMBOL name;
} T_Element;
// csv element
typedef struct CsvElement
{
Element * pElement;
int id;
} T_csvElement;
Итак, я думал, что вызову эту функцию следующим образом:
T_Element * pData; // Not null, filled earlier
getStringFromCsv( &pData->pElement->name );
Но это не работает (предупреждение: передача аргумента 1 из STR_toCsv из несовместимого типа указателя). Я использую gcc с NetBeans 6.8.
Я пробовал много вещей ...
T_SYMBOL foo = "foo";
T_SYMBOL * pFoo = &foo;
getStringFromCsv( pDef->name, &pFoo ); // error : passing from incompatible pointer type
T_CHAR * pBar = &foo; // error : init from incompatible pointer type
T_CHAR * pBaz = &(foo[0]); // OK
getStringFromCsv( pDef->name, &pBaz ); // OK
T_SYMBOL * pFooTest = &(foo[0]); // error : init from incompatible pointer type
... но в итоге бросил имя на символ **:
getStringFromCsv( (char**) &pData->pElement->name );
Что не так с моим кодом?
В основном, SYMBOL = CHAR *, верно? Почему СИМВОЛ *! = ЧАР **?
Я почти уверен, что упускаю что-то простое, но сейчас ... Ничего не пришло.
EDIT
Вот getStringFromCsv:
void getStringFromCsv( char ** data )
{
// pDesc is defined and not null
csvDescriptorCat( pDesc, *data);
csvDescriptorCat( pDesc, "\t");
}
void csvDescriptorCat( CsvDescriptor * pDesc, char* str)
{
int len;
if( str != NULL)
{
len = strlen(str);
strcpy( &pDesc->line[pDesc->pos], str);
pDesc->pos += len;
}
}