ошибка: несовместимые типы при назначении типу ‘char *’ из типа ‘DigestInfo’

#c

#c

Вопрос:

Станет очевидно, что я новичок в программировании на C. (Я хорошо знаю другие языки, особенно PHP, но хотел попробовать C).

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

Некоторая предыстория. Я работаю с этим объектом:

 typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   char         *objInfo;                       
... (omitted for clarity)
}ObjAttr;
  

Для меня * ObjInfo — это область, которую я могу использовать для хранения некоторых данных, которые будут объектом (struct?), Поэтому я создал с помощью typedef:

 typedef struct {
    unsigned int stVersion ;                /* structure version */
    const EVP_MD *digest_id ;               /* digest name */
    unsigned char digest_value ;            /* digest calculated value (Variable length) */
//  ...                                     /* in the future I may want to store something else */
} digestInfo ;
  

У меня есть эта структура в файле .h, так что на нее можно ссылаться в 2 моих файлах .c.

Теперь в файле .c, где я храню эти данные (которые попадают в базу данных приложения), у меня есть этот код:

 ...
ObjAttr objAttr;
digestInfo digestO;
...
memset(amp;digestO,0x00,sizeof(digestO));
digestO.stVersion = 1;
digestO.digest_id = EVP_get_digestbyname(digest);
...
EVP_DigestFinal_ex(amp;mdctx, md_value, amp;md_len);
digestO.digest_value = *md_value;

objAttr.objInfo = *digestO;
objAttr.objInfoLength = sizeof(digestO);
  

При компиляции я получаю эту ошибку:

 error: invalid type argument of ‘unary *’ (have ‘digestInfo’)
  

Я знаю это, потому что я пытаюсь сохранить объект DigestInfo в значение char — как мне это сделать?

Я пробовал комбинации

 objAttr.objInfo = digestO;
objAttr.objInfo = amp;digestO;
  

Но все равно выдает ошибку (хотя последняя компилируется с предупреждением).

Я на правильном пути? (В основном я вычисляю MD5 некоторых данных, поступающих через STDIN (которые хранятся в приложении), и я хочу сохранить свои вычисления хэша в области «objInfo» ObjAttr.

Я хочу включить используемый алгоритм (md5, sha1 и т.д.) с результирующим хэшем, чтобы при получении этих данных я мог повторно запустить дайджест, чтобы убедиться, что я все еще получаю тот же хэш.

Если я справлюсь с этим, кто-нибудь не мог бы указать мне обратно в правильном направлении?

Правильно ли я сначала использую memset, чтобы обнулить память?

Должен ли я беспокоиться о том, что каждый из этих переменных (digest_id,digest_value) может иметь переменную длину?

Ценю помощь.

Комментарии:

1. Я не думаю, что это соответствует C , возможно, вам следует переназначить.

2. Добро пожаловать в Stack Overflow! » .c » файлы, использующие memset и typedef struct { идентифицирующие код C, а не C . Я беру на себя смелость отредактировать этот вопрос, чтобы привлечь к вам лучшую аудиторию C, хотя вы можете оставить комментарий здесь, если считаете, что я сделал это неправильно.

3. Спасибо Дрю, ценю помощь…

Ответ №1:

Поле objInfo является указателем на символ (char*), поэтому вы должны присвоить ему указатель, полученный с помощью amp; на «объект». Так objAttr.objInfo = amp;digestO; что это ближайшая попытка, но amp;digest0 — это указатель на DigestInfo, поэтому вы, вероятно, захотите изменить

 typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   char         *objInfo;                       
... (omitted for clarity)
}ObjAttr;
  

Для

 typedef struct
{
   dsUint16_t   stVersion;                       
... (omitted for clarity)
   dsUint16_t   objInfoLength;                  
   digestInfo    *objInfo;                       
... (omitted for clarity)
}ObjAttr;
  

Комментарии:

1. Бен, спасибо за твой ответ. Моя проблема в том, что я ссылаюсь на стороннюю библиотеку, поэтому я не могу изменить структуру ObjAttr. Есть ли другой способ, которым я могу скопировать свой объект в этот objInfo, который является допустимым C?

2. Но, похоже, у вас есть доступ к источнику (в конце концов, вы публикуете подмножество). В противном случае вам просто придется поддерживать его в другом месте.

3. У меня есть заголовочные файлы сторонней библиотеки, с которыми я компилирую (что является их структурой ObjAttr). Я предполагаю, что я не могу просто изменить заголовок, поскольку при ссылке на библиотеку это приведет к сбою — или может произойти какая-то другая ожидаемая вещь? Мою структуру DigestInfo я могу изменить в любом случае, мне нужно, но я хочу, чтобы эти «данные» хранились в ObjAttr.objInfo, чтобы, когда я вызывал их обратно из приложения (то есть сохранял их), они были в формате, который я понимаю и могу использовать.

4. тогда, я думаю, вы можете превратить DigestInfo в один форматированный строковый массив, поскольку это и есть objInfo . Как есть, вы ничего не можете сделать