Передача значений в функцию в C - PullRequest
0 голосов
/ 17 августа 2011

Я новичок в C и работаю над ним с двух месяцев.У меня есть структура, показанная ниже:

struct profile_t
{
    unsigned char length;
    unsigned char type;
    unsigned char *data;
};

typedef struct profile_datagram_t
{
    unsigned char *src;
    unsigned char *dst;
    unsigned char ver;
    unsigned char n;
    struct profile_t profiles[MAXPROFILES];
} header;

header outObj;

Теперь значения внутри элементов структуры читаются как outObj.src[i], outObj.dst[i] и outObj.profiles[i].type.

Теперь я хочучтобы вызвать функцию и передать прочитанные мною значения функции, которая на самом деле является Беркли БД.

void main()
{
    struct pearson_record {
        unsigned char src[6];
        unsigned char dst[6];
        unsigned char type;
    };

    DB *dbp;
    int ret;

    if ((ret = db_create(&dbp, dbenv, 0)) !=0)
        handle_error(ret);

    if ((ret = dbp->open(dbp, NULL, "pearson.db", NULL, DB_BTREE, DB_CREATE, 0600)) !=0)
        handle_error(ret);

    const DBT *pkey;
    const DBT *pdata;

    struct pearson_record p;
    DBT data, key;

    memset(&key, 0, sizeof(DBT));
    memset(&data, 0, sizeof(DBT));

    memset(&s, 0, sizeof(struct pearson_record));

Теперь приведенный выше код написан на примере справочного руководства по БД.но я не понимаю, что такое const DBT.Также они добавили значение в структуру, используя memcopy, который, как я знаю, является правильным, но теперь я хочу memcopy переданные значения, которые упомянуты выше, и сохранить их в структуре pearson_record.Как я должен идти с этим ??Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 27 декабря 2011

Пожалуйста, отправьте полный код. Вы упоминаете «они memcopy» (я полагаю, вы ссылаетесь на memcpy), но я вижу только набор memset (*, 0). Надеюсь, вы их не путаете.

Кроме того, «они добавили значение в структуру, используя memcopy, который, я знаю, является правильным способом», не совсем верно. Это не обязательно неправильно, НО ... char * в основном интерпретируется как строка C. это массив байтов, которые представляют символы, которые ДОЛЖНЫ заканчиваться нулем (то есть последний символ должен быть 0, что эквивалентно '\ 0'). Правильный способ копирования строк - использование strcpy () (или strcpy_s в windows), разница в том, что memcpy быстрее и используется в других ситуациях (таких как указатели \ управление буфером).

unsigned char * не очень используется (по крайней мере, я никогда не видел его до сих пор). В качестве заметки читайте о char, unsigned char, подписанном char, char [] и char * (не то, чтобы он каким-либо образом изменял ваш код, а просто чтобы убедиться, что вы понимаете различия).

Что касается копирования данных, я предполагаю, что вы имеете в виду src, dst и type из pearson_record в header, правильно? Если так, то для простоты я хотел бы предложить memcpy, но вы говорите, что к каждому элементу обращаются как [i]. Означает ли это, что header.src - это массив из более чем одного pearson_record.src или header.src [i] соответствует pearson_record.src [i]? Это немного неясно для меня.

Существует разница между char * src и char * * src.

...