2012-05-14 6 views
-1

Когда я скомпилирую свой код в C, я получаю следующую ошибку: «ошибка LNK2001: неразрешенный внешний символ _staff», а также ошибка о нерешенных внешних. Похоже, он думает, что моему персональному массиву нужен внешний файл, но его просто массив для удерживания Лица (Союз двух типов). Как исправить проблему? Начало моего кода приведено ниже.Как исправить неразрешенную внешнюю ошибку в C

 #include <stdio.h> 
     #include <string.h> 
    //employee struct 

     typedef struct {  
     //... 
     } Employee; 

    //Manager struct inheriting from employee struct 

     typedef struct { 
     Employee employee; 
     int bonus; 
     } Manager; 

    //union of manager and employee 

     typedef union{ 
      Employee e; 
      Manager m; 
      } Person; 
    //functions 

     Employee newEmployee(char n[], ...);  
     Manager newManager(...); 
     double getManagerSalary(Manager man);  
     Manager boss; 
     Employee harry ; 
     Employee tommy; 
     Person staff[]; 

//main code 

    int main(void) 
    { 

     boss = newManager(...); 
     harry = newEmployee(...);  
     tommy = newEmployee(...); 

     staff[3]; 
     staff[0].m = boss; 
     staff[1].e = harry; 
     staff[2].e = tommy; 

    ...  
    } 

    Employee newEmployee(char n[], double s, int year, int month, int day) 
    { 
    ... 
    } 
+1

- это весь код, создающий ошибку? Как это могло произойти? – ShinTakezou

+4

(и о 'Person staff []', это не массив, который вы можете заполнить чем угодно ... рассмотрите его как «заполнитель» для массива, он должен быть '[1]' иметь место для 1 элемента) – ShinTakezou

+0

"Inheriting"? Это не наследование, и в любом случае наследование отсутствует. C. Выведите ошибку, которую компилятор выбрасывает. – m0skit0

ответ

1

Массивы должны быть объявлены в C, чтобы иметь размер, например: Person a[1], что означает a is an array of 1 Person. Вы не можете объявить это так, как вы это сделали.

Если вы хотите оценить количество людей во время выполнения указателей, попробуйте указать указатели. Сделайте Person *a, затем выделите память, учитывая общее количество людей и продолжайте. Но я не думаю, что вы хотите это сделать.

Также см. Сообщение extern от @ShinTakezou. Это важная и действительная точка, хотя совершенно не связанная с вашей реализацией.

0
 // you are not reserving room for anything; 
     // gcc would give an error; your compiler silently consider this 
     // staff as a pointer to something (an array) which has its actual 
     // memory defined elsewhere; so, when you link, it raises that 
     // linking error 
     Person staff[]; 

     // could be 
     Person staff[N]; 
     // where N is a positive number, or a true define or const value 

//main code 

    int main(void) 
    { 

     boss = newManager(...); 
     harry = newEmployee(...);  
     tommy = newEmployee(...); 

     // the following line is an expresion which does nothing: 
     // it accesses the fourth element of a "supposed" array, 
     // and the value retrieved in this way is lost 
     // if you meant to "allocate" three staff, you are doing it wrong; 
     staff[3]; 

     // following the possible previous path of having the 
     // room for staff not dynamically created, you don't need the 
     // previous line, which is simply a no-op (if 3 is less than N-1, 
     // otherwise it's a potentially illegal access to memory you shouldn't access) 

     staff[0].m = boss; 
     staff[1].e = harry; 
     staff[2].e = tommy; 

    ...  
    } 

(я также добавить, что код не выглядит полностью «вменяемый» -needless сказать maybe- мне, но это может быть вопрос о другом вопросе, не связанные с конкретной проблемой)

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