2014-10-29 64 views
0

我遇到的問題是我在主函數之外建立的函數中的值沒有被保留在結構中。我可能無法描述這個非常好,所以我會顯示程序和結果,並解釋我想主函數以外的值不被保留在結構中

struct Satellite 
{ 
    char countries[30]; 
    int package; 
    int priceperpackage; 
    int timetransmission; 
    int requestedTransmission; 
}; 

struct Satellite Satellite1; 
struct Satellite Satellite2; 
struct Satellite Satellite3; 
struct Satellite Satellite4; 
struct Satellite Satellite5; 

void functionInput(void) 
{ 
    /*Country 1*/ 
    strcpy(Satellite1.countries, "USA");  

    /*Country 2*/ 
    strcpy(Satellite2.countries, "China"); 

    /*Country 3*/ 
    strcpy(Satellite3.countries, "Germany");  

    /*Country 4*/ 
    strcpy(Satellite4.countries, "Japan"); 

    /*Country 5*/ 
    strcpy(Satellite5.countries, "Switzerland");  
} 

void printItems(struct Satellite satellite); 

void assignValues(struct Satellite satellite); 

int main(void) 
{ 
    functionInput(); 

    assignValues (Satellite1); 
    assignValues (Satellite2); 
    assignValues (Satellite3); 
    assignValues (Satellite4); 
    assignValues (Satellite5); 

    printItems (Satellite1); 
    printItems (Satellite2); 
    printItems (Satellite3); 
    printItems (Satellite4); 
    printItems (Satellite5); 

    return 0; 
} 

void printItems(struct Satellite satellite) 
{ 
    printf("%s\t\t %d\t\t %d\t\t %d\t\t %d\n",   satellite.countries,satellite.requestedTransmission,satellite.package,satellite.priceperpackage,sat llite.timetransmission); 
} 

void assignValues(struct Satellite satellite) 
{ 
    satellite.requestedTransmission = (rand()% 2); 
    satellite.requestedTransmission = (rand()% 4 +1); 
    printf("%s\t\t %d\t\t %d\t\t %d\t\t %d\n",  satellite.countries,satellite.requestedTransmission,satellite.package,satellite.priceperpackage,sate llite.timetransmission); 
} 

這裏是輸出

USA    4    0    0    0 
China   1    0    0    0 
Germany   1    0    0    0 
Japan   3    0    0    0 
Switzerland    1    0    0    0 
USA    0    0    0    0 
China   0    0    0    0 
Germany   0    0    0    0 
Japan   0    0    0    0 
Switzerland    0    0    0    0 

因爲同樣的事情不打印兩次assignValues函數的值不會被保留在結構中。

+0

您正在通過值調用,而不是通過引用調用,因此對該函數所做的任何更改都只針對函數的結構副本,因此函數中所做的任何更改都會在返回時被丟棄。您需要將結構指針傳遞給函數,以便函數修改結構時,它將修改main()中的結構。 – 2014-10-29 02:17:03

+0

我剛剛開始,所以我對我的無知表示歉意通過引用與按價值打電話的區別是什麼?你能舉個例子嗎?你將如何將結構的指針傳遞給函數? – AKNorth 2014-10-29 02:21:03

回答

1

功能:

void assignValues(struct Satellite satellite) 

應該是:

void assignValues(struct Satellite *satellite) 
{ 
    satellite->requestedTransmission = (rand()% 2); 

等,並通過編寫assignValues(&satellite1);等調用它。這表示您希望assignValues在名爲satellite1的對象上運行。

您最初編寫代碼的方式會創建satellite1的副本,並將該副本發送到assignValues。對副本所做的更改不會影響原件。

+0

與下面的信息相結合的伎倆謝謝! – AKNorth 2014-10-29 02:35:15