2014-01-20 26 views
0

我不確定這是否適合這種論壇,因爲它是一個非常具體的問題,但我仍然會問。C:在不同的功能中操作結構

我有三個文件:

  1. main.c
  2. functions.c
  3. functions.h

functions.cfunctions.h我創建了一個struct,並把它定義爲一個名爲control類型:

typedef struct 
{ 
    char cUp, cLeft, cDown, cRight 
} control; 

我創建的control一個實例,並右在main.c開始初始化稱爲Keys實例:

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

int main() 
{ 
    control Keys = {'w', 'a', 's', 'd'}; 

    //... 
} 

我通過Keys到一個名爲options_f功能,這需要一個control作爲它的參數和返回一個control。函數原型放在functions.h

//in functions.h: 
control options_f(control Keys); 

//in main.c: 
Keys = options_f(Keys); 

options_f位於functions.c,看起來像這樣:

control options_f(control Keys) 
{ 
    system("cls"); 

    printf("\nENTER | Place your symbol.\n\n1| %c |Move up.\n\n2| %c |Move left.\n\n3| %c |Move down.\n\n4| %c |Move right.\n", Keys.cUp, Keys.cLeft, Keys.cDown, Keys.cRight); 
    printf("\n\nTo change the keys: NUMBER,SYMBOL (enter 0 to return to menu).\n\n"); 

    int iTemp = 0; 
    char cTemp = '\0'; 
    scanf("%i,%c", &iTemp, &cTemp); 

    switch(iTemp) 
    { 
     case 0: 
      break; 
     case 1: 
      Keys.cUp = cTemp; 
      Keys = options_f(Keys); 
      break; 
     case 2: 
      Keys.cLeft = cTemp; 
      Keys = options_f(Keys); 
      break; 
     case 3: 
      Keys.cDown = cTemp; 
      Keys = options_f(Keys); 
      break; 
     case 4: 
      Keys.cRight = cTemp; 
      Keys = options_f(Keys); 
      break; 
     default: 
      printf("Please enter a number from 1-4."); 
      stop_f(2); 
      options_f(Keys); 
      break; 
    } 
} 

該功能可以讓我改變Keys字符的內容。在輸入0並返回菜單後,我再次調用options_f。只有它將存儲在Keys的字符中的值更改爲某些垃圾值。

這是爲什麼?

如果您需要更多關於我使用的其他功能的信息,請詢問。
對不起,如果這看起來很低級別和愚蠢的,但我想學習,這就是爲什麼我問。

謝謝:)

+0

只需將'Keys'作爲指針傳入即可。 'void options_f(control * keys){...}'並將它稱爲'options_f(&Keys);' – clcto

+0

除了速度之外,將它作爲指針傳遞還有什麼好處嗎? –

+1

這只是邏輯上的差異。使用'control options_f(控制鍵)'讀取(對我)作爲'options_f' _uses_'keys'來創建一個新的'control',而'void options_f(control * keys)'更多地讀取'options_f'修改'keys'。 – clcto

回答

4

您需要從options_f()功能(可能return Keys;)返回一個值。這甚至不是有效的C代碼。

+0

對!我總是錯過了那個^^ 非常感謝! –