У меня возникают проблемы при вызове функции, принимающей в качестве параметра указатель на строку. Мне нужно получить имя элемента.
// 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
... но закончилось тем, что имя было приведено к char ** :
getStringFromCsv( (char**) &pData->pElement->name );
Что не так с моим кодом? По сути, SYMBOL = CHAR *, верно? Почему СИМВОЛ* != СИМВОЛ**? Я почти уверен, что упускаю что-то простое, но сейчас... Ничего не пришло.
ИЗМЕНИТЬ Вот 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;
}
}
&(pData->pElement->name)
? - person Mark Elliot   schedule 29.06.2010->
имеет более высокий приоритет, чем&
. - person Secure   schedule 29.06.2010