2015-09-20 96 views
0

我目前正試圖將從函數輸入的信息存儲到我的頭文件中聲明的結構中,並在主文件中使用它。我不能使用結構數組,因爲我不允許分配內存。將數據存儲在包含數組的文件中在頭文件中

頭文件

#ifndef HOMEWORK_H_ 
#define HOMEWORK_H_ 

typedef struct 
{ 
     int CourseID[25]; 
     char CourseName[100][25]; 
}Course; 

void NewCourse(void); 

#endif 

我的代碼

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

void NewCourse() 
{ 
     int i; 
     int CNumber = 0; 

     Course storeC; 

     for(i = 0; i < 0; i++) 
     { 
       if(storeC.CourseID[i] == 0) 
       { 
         if(storeC.CourseName[i] == NULL) 
         { 
           int CNumber = i; 
           break; 
         } 
       } 
     } 
     printf("%d\n", CNumber); 
     printf("Please enter the course's ID number: "); 
     scanf("%d", &storeC.CourseID[CNumber]); 
     printf("Please enter the course's name: "); 
     scanf("%s", storeC.CourseName[CNumber]); 
} 

和我的主並不真正適用,因爲問題的關鍵在於內存儲的數據。

需要注意的一點是我必須爲我的函數使用單獨的文件,並且我必須爲我的結構使用頭文件。

我知道我的for循環來確定數組中哪個地方可能無效,但我現在並不擔心它。

我的問題是如何將數據從這個函數存儲到 頭文件?

更新

我改變了主要功能,以適應一切,我現在結束了這個錯誤。

標號只能是語句的一部分,而聲明並非 聲明

在主要的代碼是:

switch(Option) 
       { 
         case 1: 
         Course c = NewCourse(); 
         printf("%d\n%s\n", c.CourseID[0], c.CourseName[0]); // For testing purposes 
         break; 

是什麼原因造成的錯誤,因爲它說它源於第29行,即Course c = NewCourse();

+0

「不允許分配內存」。你意識到堆棧是分配的內存區域,對吧? – CoffeeandCode

+0

我的意思是使用Malloc或Calloc – Arrowkill

+0

然後你的意思是你不允許動態分配任何內存。 – CoffeeandCode

回答

1
  1. 更改NewCourse返回Course

    Course NewCourse(void); 
    
  2. 更改實施:

    Course NewCourse() 
    { 
        int i; 
        int CNumber = 0; 
    
        Course storeC; 
    
        ... 
    
        return storeC; 
    } 
    
  3. 變化main相應。

    int main() 
    { 
        Course c = NewCourse(); 
    } 
    

PS

你說,

我不能使用結構數組,因爲我不能分配內存。

我認爲這意味着你不能使用動態內存分配。如果你被允許在堆棧中創建的struct秒的數組,你可以使用簡化代碼:

typedef struct 
{ 
    int CourseID[25]; 
    char CourseName[100]; 
}Course; 

void NewCourse(Course course[]); 

main,使用方法:

Course courses[25]; 
NewCourse(courses) 

在回答您的更新

您需要添加一個範圍塊{ }周圍的代碼如下:

int main() 
{ 
    { 
     Course c = NewCourse(); 
    } 
} 

這應該解決您的錯誤並允許您的代碼進行編譯。

+0

謝謝,我早些時候嘗試過,但未能改變主要。 – Arrowkill

+0

現在我唯一的問題是我得到的「一個標籤只能是一個聲明的一部分,而一個聲明不是一個聲明」,作爲我設置Course c = NewCourse()的主要錯誤。 – Arrowkill

1

此外,您在操作CNumber變量時出錯。它被聲明兩次,用不同的範圍:

int CNumber = 0; //使用NewCourse功能

然後將試驗內的範圍的第一個定義,與塊範圍:

if(storeC.CourseID[i] == 0) 
    { 
     if(storeC.CourseName[i] == NULL) 
     { 
      int CNumber = i; // block-scope. This is not the same CNumber Variable (todo: Omit int) 
      break; 
     } 
    } 

結果,稍後參考它時

printf("%d\n", CNumber); 
printf("Please enter the course's ID number: "); 
scanf("%d", &storeC.CourseID[CNumber]); 
printf("Please enter the course's name: "); 
scanf("%s", storeC.CourseName[CNumber]); 

它總是引用函數作用域變量,它始終爲零。

解決方法:省略int類型聲明的測試內:

if(storeC.CourseName[i] == NULL) 
    { 
    CNumber = i; 
    break; 
    } 
+0

非常感謝。我真的在CNumber之前忘記了那個int。我甚至不知道爲什麼我把它包括在內,但是非常感謝你的支持。 – Arrowkill

+0

歡迎。很高興幫助。 –