Использование структур с указателями в C с массивом - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующий код, который выдает предупреждение о том, что «предупреждение: инициализация делает указатель из целого числа без приведения».

Если я изменю тип данных * eleNum на char, он будет скомпилирован правильно. Что я делаю неправильно, чтобы компиляция жаловалась на то, что * eleNum является целым числом?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ptElements {
    int  *eleNum;
    char *eleSym;
    char *eleNme;
    char *elePrd;
    char *eleGrp;
} Elements;

Elements database[] = { 
    { 1, "H",  "Hydrogen", "1", "1"  },  
    { 2, "He", "Helium",   "1", "18" },
    { 3, "Li", "Lithium",  "2", "1" },
    { 4, "Be", "Berylium", "2", "2" },
    { 5, "B",  "Boron",    "2", "13" }
};

int main() {
    int     i;  
    int     limit;

    limit = sizeof(database) / sizeof(Elements);

    for (i = 0; i < limit; i++)
        printf("%3s - %-3s %-20s %2s %2s\n", database[i].eleNum, database[i].eleSym, database[i].eleNme, database[i].elePrd, database[i].eleGrp);

    return 0;
}

struct-point-02.c:14:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 1, "H",  "Hydrogen", "1", "1"  },
       ^
struct-point-02.c:14:7: note: (near initialization for ‘database[0].eleNum’)
struct-point-02.c:15:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 2, "He", "Helium",   "1", "18" },
       ^
struct-point-02.c:15:7: note: (near initialization for ‘database[1].eleNum’)
struct-point-02.c:16:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 3, "Li", "Lithium",  "2", "1" },
       ^
struct-point-02.c:16:7: note: (near initialization for ‘database[2].eleNum’)
struct-point-02.c:17:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 4, "Be", "Berylium", "2", "2" },
       ^
struct-point-02.c:17:7: note: (near initialization for ‘database[3].eleNum’)
struct-point-02.c:18:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 5, "B",  "Boron",    "2", "13" }
       ^
struct-point-02.c:18:7: note: (near initialization for ‘database[4].eleNum’)

1 Ответ

0 голосов
/ 05 ноября 2018

Основной ответ

Либо используйте int eleNum в структуре, либо используйте char *eleNum и измените инициализатор, чтобы использовать "1" для водорода.

В настоящее время вы печатаете eleNum с %s - это совершенно неправильно (печатать целочисленный указатель, как если бы он был символьным указателем). Используйте %3d, если eleNum становится int; используйте %3s, если оно становится char *.

Если он остается int *, вам нужно будет указать что-то вроде (int []){ 1 } (составной литерал C99 или новее) в качестве инициализатора и *database[i].eleNum или database[i].eleNum[0] в операторе printf() для печати и используйте %3d.

#include <stdio.h>

typedef struct ptElements
{
    int   eleNum;
    char *eleSym;
    char *eleNme;
    char *elePrd;
    char *eleGrp;
} Elements;

Elements database[] =
{ 
    { 1, "H",  "Hydrogen", "1",  "1" },  
    { 2, "He", "Helium",   "1", "18" },
    { 3, "Li", "Lithium",  "2",  "1" },
    { 4, "Be", "Berylium", "2",  "2" },
    { 5, "B",  "Boron",    "2", "13" }
};

int main(void)
{
    int limit = sizeof(database) / sizeof(Elements);

    for (int i = 0; i < limit; i++)
    {
        printf("%3d - %-3s %-20s %2s %2s\n", database[i].eleNum,
               database[i].eleSym, database[i].eleNme, database[i].elePrd,
               database[i].eleGrp);
    }
    return 0;
}

Тангенциальная информация о периодической таблице

Замечу, что все элементы теперь имеют однобуквенные или двухбуквенные символы; трехбуквенные символы, такие как Uub, теперь заменены на «настоящие» имена. (См. WebElements в качестве одного источника информации - несомненно, есть много других, таких как Википедия Периодическая таблица элементов .)

В 2010 году у меня была таблица элементов SQL с записями (N означает «нестабильный» или «радиоактивный»):

INSERT INTO elements VALUES(112, 'Uub', 'Ununbium',      277.0000, 'N');
INSERT INTO elements VALUES(113, 'Uut', 'Ununtrium',     284.0000, 'N');
INSERT INTO elements VALUES(114, 'Uuq', 'Ununquadium',   289.0000, 'N');
INSERT INTO elements VALUES(115, 'Uup', 'Ununpentium',   288.0000, 'N');
INSERT INTO elements VALUES(116, 'Uuh', 'Ununhexium',    293.0000, 'N');
INSERT INTO elements VALUES(118, 'Uuo', 'Ununoctium',    294.0000, 'N');

Первые имена для них были добавлены в середине 2010 года. К 2016 году у меня были данные, эквивалентные этому (я добавил период и групповую информацию между датами):

INSERT INTO elements VALUES(112, 'Cn',  'Copernicium',   285.1800, 7, '12', 'N');
INSERT INTO elements VALUES(113, 'Nh',  'Nihonium',      286.1800, 7, '13', 'N');
INSERT INTO elements VALUES(114, 'Fl',  'Flerovium',     289.1900, 7, '14', 'N');   -- Yes, Fl and Mc have the same weight
INSERT INTO elements VALUES(115, 'Mc',  'Moscovium',     289.1900, 7, '15', 'N');
INSERT INTO elements VALUES(116, 'Lv',  'Livermorium',   293.2000, 7, '16', 'N');
INSERT INTO elements VALUES(117, 'Ts',  'Tennessine',    293.2100, 7, '17', 'N');
INSERT INTO elements VALUES(118, 'Og',  'Oganesson',     294.2100, 7, '18', 'N');

Меня интригует то, что я пережил «пополнение» периодической таблицы, по крайней мере, в течение первых семи ее периодов.

(Вы можете найти информацию о гипотетическом Ununennium (элемент 119, Uue) и Unbinilium (элемент 120, Ubn) в Википедии, если вам интересно. Также есть За элементом 118: следующая строка Периодического издания Таблица .)

...