2016-07-28 5 views
0

У меня проблема с этим кодом. Я хочу закодировать программу, которая имеет различную личную информацию в массиве. И я хочу настроить 15 массивов в одном месте в памяти (malloc). Также программа должна выводить (printf) личную информацию одного человека по запросу (angestellter [0-14]).массив структур и malloc [C]

В Код ошибки I Recive являются следующие:

gcc ANGDB.c 
ANGDB.c: In function ‘print_angestellter’: 
ANGDB.c:14:18: error: subscripted value is neither array nor pointer nor vector 
nu = angestellter[x].nummer; 
       ^
ANGDB.c:15:18: error: subscripted value is neither array nor pointer nor vector 
vn = angestellter[x].vorname; 
       ^
ANGDB.c:16:18: error: subscripted value is neither array nor pointer nor vector 
nn = angestellter[x].nachname; 
       ^
ANGDB.c: In function ‘main’: 
ANGDB.c:25:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> nummer = 1; 
      ^
ANGDB.c:26:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> vorname = "George"; 
      ^
ANGDB.c:27:13: error: subscripted value is neither array nor pointer nor vector 
angestellter[0] -> nachname = "Washington"; 

Это мой код:

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

struct angestellter{ 
    int nummer; 
    char vorname[50]; 
    char nachname[50]; 
}angestellter; 

void print_angestellter(int x){ 
    int nu; 
    char vn[50]; 
    char nn[50]; 
    nu = angestellter[x].nummer; 
    vn = angestellter[x].vorname; 
    nn = angestellter[x].nachname; 
    printf("%d, %s, %s\n", nu, vn, nn); 
} 

int main(){ 
    struct angestellter **db = malloc(sizeof(angestellter)*15); 
    angestellter[0] -> nummer = 1; 
    angestellter[0] -> vorname = "George"; 
    angestellter[0] -> nachname = "Washington"; 
    print_angestellter(0); 
} 
+4

'angestellter' - это единственная переменная типа' struct angestellter'; вы не можете использовать подписи на нем. –

+1

Похоже, вы выделяете память и присваиваете ее переменной db. Разве вы не должны использовать db вместо angestellter? – bruceg

ответ

1

Где вы используете angestellter, который представляет собой один экземпляр struct angestellter, вы должны использовать db, который является вашим динамически распределенным массивом. Вы также должны объявить его struct angestellter * вместо struct angestellter **. Это также необходимо будет передать в print_angestellter.

Для копирования строк вам также необходимо использовать strcpy. Вы не можете напрямую назначить строку массиву символов.

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

struct angestellter{ 
    int nummer; 
    char vorname[50]; 
    char nachname[50]; 
}; 

void print_angestellter(struct angestellter *db, int x){ 
    int nu; 
    char vn[50]; 
    char nn[50]; 
    nu = db[x].nummer; 
    strcpy(vn, db[x].vorname);  // use strcpy to copy strings 
    strcpy(nn, db[x].nachname); 
    printf("%d, %s, %s\n", nu, vn, nn); 
} 

int main(){ 
    struct angestellter *db = malloc(sizeof(struct angestellter)*15); 
    db[0].nummer = 1; 
    strcpy(db[0].vorname, "George"); 
    strcpy(db[0].nachname, "Washington"); 
    print_angestellter(db, 0); 
} 
+0

Это правильный ответ. Большое спасибо! – asdasdasd1234

+0

'print_angestellter' может передать элементы структуры напрямую:' printf ("% d,% s,% s \ n", db [x] .nummer, db [x] .vorname, db [x] .nachname); ' – chqrlie

0

Вы, кажется, есть две проблемы. Прежде всего, в вашей функции print_angestellter() вы используете глобальную структуру angestellter, что отлично. Тем не менее, это struct, а не массив или указатель на память. Поэтому вы не можете использовать оператор [], следовательно, ошибки. Кажется, вам придется перепроектировать print_angestellter() или сделать angestellter массив struct angestellter s. Аналогичная ошибка с номером main(): angestellter[0] вместо db[0]. Чтобы исправить это, я предлагаю добавить аргумент указателя к print_angestellter(), скажем, сделать его print_angestellter(int, struct *angestellter a) и заменить angestellter[0] на a[0]. Вы также используете = для копирования строк, но копирует адреса указателя, не содержимое строки. Вместо этого используйте strcpy().

0

Вы писали "структура Angestellter ** дб = таНос (SizeOf (Angestellter) * 15);" означает, что указатель массива, его хорошо, но вы должны использовать "дб [0] -> номер" заменить «angestellter [0] -> nummer»; функция «void print_angestellter()», вы должны добавить формальный параметр «dp», когда вы используете «malloc», не забудьте использовать «бесплатно» для освобождения используемой памяти;

+0

Добро пожаловать в StackOverflow. Вы можете захотеть посетить [** Как мне отформатировать свои сообщения с помощью Markdown или HTML? **) (http://stackoverflow.com/help/formatting), чтобы помочь вам отформатировать ваш ответ, чтобы он был более читаемым с кодом отличимы от общего текста и т. д. –

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