2013-10-06 144 views
0

我有大約14 void functions包含爲了工作錯誤在靜態全局變量(C)

,所以我覺得讓它們變成靜態全局的所有14個功能共享相同的變量需要我的程序進程。

<stdio.h>和所需的所有其他頭後,我有2個typedef struct,並在那之後,我已經把11個static int變量和3個static struct變量。

我已經檢查每一個功能,如果struct變量已妥善存儲數據,顯然,只有void function中首先int main()存儲正確的數據叫進struct變量。

當第二個void function被調用時,來自第一個void function的全局變量完全不包含任何數據。

任何人都可以告訴我,如果使用全局變量爲多個功能工作是錯誤的?

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

typedef struct hero_data{ 
//... data 
}hero; 

typedef struct item_data{ 
//.... data 
}item; 

int totalwarrior = 0; 
int totalitem = 0; 
int toughtotal = 0; 
int nimbletotal = 0; 
int smarttotal = 0; 
int skeptictotal[3] = {0}; 
int mystictotal[3] = {0}; 
int cursedtotal[3] = {0}; 
int brutetotal[3] = {0}; 
int shreddertotal[3] = {0}; 
int vanillatotal[3] = {0}; 
int typetotal = 0; 
int typenum = 0; 
int typechoice = 0; 
int classchoice = 0; 
static item curr3[10000]; 
static hero curr[10000]; 
static hero curr2[10000]; 
static hero smart[1][10000]; 
static hero nimble[1][10000]; 
static hero tough[1][10000];  
static hero type[3][10000]; 
static hero skeptic[3][10000]; 
static hero mystic[3][10000]; 
static hero cursed[3][10000]; 
static hero brute[3][10000]; 
static hero shredder[3][10000]; 
static hero vanilla[3][10000]; 
static hero player1; 
static hero player2; 

int randbetween(int max, int min) 
{ 
//... functioning 
} 

void mygets(char *name, int len, FILE * stream) 
{ 
//... functioning 
} 

void available_hero(hero Class[3][10000],int typenum, int classtotal[],int classcode) //Shows the available hero based on Player's choice 
{ 
//... functioning 
} 

void detail_hero(hero curr[3][10000],int classtotal[],int typenum) 
{ 
//....functioning 
} 

void detail_item(item curr[10000],int whatitem) 
{ 
//functioning 
} 

void pointer_conversion(hero *a, hero curr[10000], int total) 
{ 
//....functioning 
} 

void TDpointer_conversion(hero *a, hero curr[3][10000], int total,int typenum) 
{ 
//....functioning 
} 

void pointer_conversion2(item *a, item curr3[], int total) 
{ 
//...functioning 
} 

void OD_conversion(int a[], int curr[],int typenum) 
{ 
//....functioning 
} 

void TD_conversion(hero a[3][10000],hero curr[3][10000],int typetotal, int typenum, int typetotal2) 
{ 
//....functioning 
} 

void TD_conversion2(hero a[3][10000],hero curr[3][10000],int typetotal[], int typenum, int typetotal2[]) 
{ 
//....functioning 
} 

void TD_conversion_class(hero a[1][10000],hero curr[3][10000],int classtotal[3], int typenum, int typetotal) 
{ 
//....functioning 
} 

void binarycheck(int encoding, hero *dummy, int totalwarrior) 
{ 
//....functioning 
} 

void check_compare_item(hero player) 
{ 
//....functioning 
} 

void create_player(hero player) 
{ 
//....functioning 
}  

void load_hero(hero curr[]) 
{ 
//....functioning 
} 

int main() 
{ 
load_hero(curr); 
load_item(curr3); 
create_player(player1); 
printf(""\n --> %s <---\n",player1.name); //struct hero contains the variable "name" 
// Nothing gets printed while when I try to print the name within Create_player function, it works. 
check_compare_item(player1); 
} 
+0

爲什麼不張貼代碼?這是不可能的,否則 –

+0

不會刪除你的代碼,而你正在編輯它。它取消了我當時正在寫的答案。 –

+0

你發佈的內容沒有明顯的缺陷。你確定你的所有函數都在同一個'.c'文件中嗎? –

回答

1

當你路過值和更改都將它被調用函數內部的參數不會在調用者可見(被調用者對數據的拷貝操作)。

解決方案:通過指針發送您的數據。

更好:完全避免靜態變量。在這種情況下,他們提供的常規變量不會有什麼好處?

+0

謝謝!有效! –

0

如果您使用全局變量,爲什麼您需要將它們傳遞給函數?你可以直接在你的函數中使用它們,而不必通過參數傳遞它們。傳遞參數是這裏的問題。

你是否使用static關鍵字來保持文件的私密性?否則,避免靜電。