2011-01-28 4 views
1

Я получаю сообщение об ошибке:C, Как получить структуру из другой структуры?

error: request for member ‘clsf_ptr’ in something not a structure or union 

Из этой программы C:

#include<stdio.h> 
#define M 3 

struct class_stud 
{ 
    char name[16]; 
    char subject[16]; 
    int roll_num; 
} 

struct node 
{ 
    int n; 
    struct branch *p[M]; 
    struct class_stud cls[M-1]; 
}*root=NULL; 

main() 
{ 
    int clsf_cnt; 
    struct class_stud clsf, *clsf_ptr; 
    clsf_ptr = &clsf; 
    clsf_cnt = 0; 
    root = malloc(sizeof (struct node)); 
    printf("enter source address \n"); 
    scanf("%s",&root.clsf_ptr[clsf_cnt]->name); 
    printf("%s",root.clsf_ptr[clsf_cnt]->name); 

    printf("enter key\n"); 
    scanf("%d",&root.clsf_ptr[clsf_cnt]->key); 
    printf("%d",root.clsf_ptr[clsf_cnt] -> key); 
    clsf_cnt++; 
} 

Что означает ошибка?

+3

Вставьте точное сообщение об ошибке или вывод компилятора, чтобы мы могли помочь вам лучше. – vz0

ответ

-3

Я думаю, что синтаксис malloc неверен. один раз проверить это. Память не выделена. По этой причине она показывает ошибку.

+3

Синтаксис malloc совершенно прав и идиоматичен. Кастинг от указателя к пустоте не требуется в C. –

+0

У ОП были две проблемы, неправильно разыменованная распределенная структура и отсутствующие члены. Пока я возвращаю malloc(), если вы пишете что-то, что должно быть переносимым на C++, это не требуется в C, как объяснил @Alexandre. –

1

Любой экземпляр root.clsf_ptr, который у вас есть в коде, должен быть заменен на root->clsf_ptr, что указывает на то, что root является указателем на структуру.

Также необходимо убедиться, что член clsf_ptr находится в node struct.

+1

Я изменил его на printf ("введите адрес источника \ n"); scanf ("% s", & root-> clsf_ptr [clsf_cnt] -> name); printf ("% s", root-> clsf_ptr [clsf_cnt] -> name); Я все еще получаю ту же ошибку с ошибкой: неверный аргумент типа '->' printf ("введите ключ \ n"); scanf ("% d", & root-> clsf_ptr [clsf_cnt] -> ключ); printf ("% d", root-> clsf_ptr [clsf_cnt] -> key) 'struct node' не имеет члена с именем 'clsf_ptr' –

+1

@stident: Это потому, что это не так. Из вашего кода, похоже, имя должно быть 'cls'. Также нет члена с именем 'key', с которым вы ссылаетесь ближе к концу кода. –

+0

@stident - Можете ли вы также изменить свой пример кода, чтобы отразить ваши последние изменения? Я сразу увидел то же самое, что @Tim Cooper сделал и собирался опубликовать ответ, пока не увидел его. –

1

Вот некоторые общие исходные коды очистки, которые могут быть полезны:

#include <stdio.h> 
#define M 3 

typedef struct 
{ 
    char name [16]; 
    char subject [16]; 
    int roll_num; 

} Class_stud; 


typedef struct 
{ 
    int   n; 
    Branch*  p[M]; 
    Class_stud cls[M-1]; 

} Node; 



int main() 
{ 
    Node*  root; 
    int   clsf_cnt; 
    Class_stud clsf; 
    Class_stud* clsf_ptr; 

    clsf_ptr = &clsf; 
    clsf_cnt = 0; 

    root = malloc (sizeof(Node)); 

    if(root == NULL) 
    { 
    /* error handling here */ 
    } 
} 
0

Следующий код должен работать для вас. Я предполагаяkey должен быть членом class_stud (и ваши варианты форматирования в зсапЕ, знаковое целое):

#include<stdio.h> 
#define M 3 

typedef struct 
{ 
    char name[16]; 
    char subject[16]; 
    int roll_num; 
    int key; 
} class_stud; 

typedef struct 
{ 
    int n; 
    struct branch *p[M]; 
    struct class_stud cls[M-1]; 
} node; 

int main(void) 
{ 
    int clsf_cnt = 0; 
    node *root; 

    root = malloc(sizeof(node)); 
    if (root == NULL) { 
     /* handle error */ 
    } 

    printf("enter source address \n"); 
    scanf("%s",&root->cls[clsf_cnt]->name); 
    printf("%s",root->cls[clsf_cnt]->name); 

    printf("enter key\n"); 
    scanf("%d",&root->cls[clsf_cnt]->key); 
    printf("%d",root->cls[clsf_cnt]->key); 
    clsf_cnt++; 
} 

Вы были следующие проблемы:

  • Некорректно доступом class_stud. Это часть корня, поэтому вы хотите получить значение root -> class_stud [member] ->.
  • key был опущен
  • Оба были изменены typedefined структуры, как показано на Lundin's ответ, но вы не должны сделать их типы (используя только структуру отлично).
  • Мы просто объявляем root как указатель на узел, а не объявляем узел struct, а затем указатель, а затем выполняем назначение.
  • Мы не создаем структуру как указатель, мы создаем указатель на структуру
  • Main должен возвращать тип int, если вы не хотите аргументов, скажите компилятору, что вы ожидаете ARGC быть недействительным.

Материала я не делал:

  • Инициализировать выделенную структуру с MemSet() или с помощью calloc()
  • Ручки таНоса() неисправного
  • Компиляции моего примера (я не» t знать, что такое структурная ветвь)
3

В этом коде есть ряд проблем. Пройдем через него по строкам:

#include<stdio.h>  
#define M 3  

struct class_stud  
{  
    char name[16];  
    char subject[16];  
    int roll_num;  
}  

Первая проблема; вам нужно закрыть ; после определения структуры выше.Кроме того, интересно, что вы не определяете макрос препроцессора для длин массивов name и subject, но это незначительная проблема на данный момент.

struct node  
{  
    int n;  
    struct branch *p[M];  
    struct class_stud cls[M-1];  
}*root=NULL;   

Где находится определение для struct branch? Что должно представлять p в определении структуры? Почему у вас есть меньше элементов в cls, чем p?

main() 

По C99, вы не можете уйти с неявным типом для main; он должен быть явно введен для ввода int. И, так как вы не баловаться с любыми аргументами командной строки, то лучше явно задать список параметров для void, например, так:

int main(void) 
{  
    int clsf_cnt;  
    struct class_stud clsf, *clsf_ptr;  
    clsf_ptr = &clsf;  

Какой цели служить вышеописанной операции?

clsf_cnt = 0;  
    root = malloc(sizeof (struct node)); 

Это прекрасно, но предпочтительный способ написания этого будет

root = malloc(sizeof *root); 

Таким образом, вы будете уверены, что выделить нужное количество памяти, основываясь на типе root «s.

printf("enter source address \n");  
    scanf("%s",&root.clsf_ptr[clsf_cnt]->name);  

Ack. Несколько проблем в этой строке.

Прежде всего, clsf_ptr является не членом struct node. Вероятно, вы хотели получить доступ к cls. Во-вторых, поскольку root является указателем на структуру, вам необходимо использовать оператор -> для доступа к его членам (или явно разыменовать root, а затем использовать .). В-третьих, cls[clsf_cnt] является не указателем типа, поэтому вы должны использовать оператор . для доступа name. Наконец, поскольку name является типом массива, он будет неявно преобразован в тип указателя перед передачей scanf, поэтому & не требуется.

Чтобы избежать переполнения буфера, вы должны либо установить максимальную ширину поля в спецификаторе преобразования %s, либо использовать fgets() вместо scanf().

Вставлять с scanf(), что линия должна быть записана в виде

scanf("%15s", root->cls[clsf_cnt].name); 

Я использую 15 вместо 16 в спецификаторе преобразования так, что мы оставляем один символ для 0 терминатора.

Использование fgets(), эта линия была бы написана

fgets(root->cls[clsf_cnt].name, sizeof root->cls[clsf_cnt].name, stdin); 
    printf("%s",root.clsf_ptr[clsf_cnt]->name);  

Опять же, вы пытаетесь получить доступ то, что не является членом root, и у вас есть операторы доступа в обратном направлении:

printf ("%s", root->cls[clsf_cnt].name); 

    printf("enter key\n");  
    scanf("%d",&root.clsf_ptr[clsf_cnt]->key);  
    printf("%d",root.clsf_ptr[clsf_cnt] -> key); 

struct class_stud не имеет ни одного имени по имени key; возможно, вы имели в виду roll_num?

scanf("%d", &root->cls[clsf_cnt].roll_num); 
    printf("%d", root->cls[clsf_cnt].roll_num);  
    clsf_cnt++;  
} 

Похоже, вы отправили то, что не было полным; убедитесь, что вы показываете нам тот же код, который вы пытаетесь построить.

Смежные вопросы