簡體   English   中英

如何更改 C 中的結構數組

[英]How can I change a structure array in C

我需要更改 function 中結構的屬性,因此我可以使用屬性進行計算並設置新值,但是當我嘗試更改結構的值時,出現以下錯誤: cannot convert 'data specs (*) [2]' to 'data specs' for argument '1' to 'void changeValues (data specs)' changeValues (& stats); 有誰知道如何修理它?

typedef struct
{
char nome;
int vida;
int dano;
int x;
int y;
} dadospecas;


void changeValues(dadospecas *a[]){
a[1]->vida = 5;
printf("%i", a[1]->vida);
}

int main() {

dadospecas stats[2];


stats[1].nome = 'W';
stats[1].vida = 3;
stats[1].dano = 1;
stats[1].x = 4;
stats[1].y = 1;

stats[2].nome = 'F';
stats[2].vida = 33;
stats[2].dano = 11;
stats[2].x = 44;
stats[2].y = 14;

changeValues(&stats);

return 0;
}

我認為C中的arrays有兩點你不明白。

  1. Arrays 從 0 而不是 1 開始索引。stats 數組的第一個元素是 stats[0],第二個元素是 stats[1]。 如果要更改數組的第一個元素,則需要更改主 function 和 changeValues function 中的分配。
  2. Arrays 是 const 指針(即具有固定值的指針)。 stats 數組實際上是一個指向dadospecas 的常量指針。 這是一個 const 指針,意味着您無法更改 stats 的值。 您可以更改 stats 包含(即指向)的值。 如果要定義一個 function 來修改數組的內容,則不需要傳遞指向數組的指針,只需傳遞數組即可。

你的 changeValues function 應該這樣定義:

void changeValues(dadospecas *a){
    //put code here.
}

或者

void changeValues(dadospecas a[]){
    //put code here.
}

無論哪種情況,您的主要 function 都會像這樣調用 changeValues

changeValues(stats);

順便說一句,如果您想檢查 changeValues 是否修改了 stats 的第一個元素的 vida 成員,我將從 changeValues function 中刪除 printf 調用並將其替換為

printf("%i", stats[0].vida);

在您的主要 function 中(當然是在調用 changeValues 之后)。

除了@Stuart的出色回答之外,您似乎對如何處理將值發送到您的 function 進行更改有點困惑(這里您只更改vida成員)。 如另一個答案中所述,在訪問時,數組被轉換為指向其第一個元素的指針。 C11 標准 - 6.3.2.1 其他操作數 - 左值、arrays 和 function 指示符 (p3)

為了使您的 function 有用(因為它對整個操作進行了硬編碼),您應該為指向dadospecas的指針、要更改的索引以及要分配給vida成員的新值提供參數。 調用者負責確保要更改的索引在范圍內(如果需要,您可以將元素的數量作為附加索引傳遞)

如果您將這些部分放在一起並更改 function 的名稱以反映您只是更改vida成員的事實,您可以這樣做:

/* pass a pointer to the array as your parameter (inlcude index and value) */
void changeVida (dadospecas *a, int index, int newvida)
{
    a[index].vida = newvida;
}

一個顯示使用和修復索引問題的簡短示例可以寫成:

#include <stdio.h>

#define NSTRUCT 2       /* if you need a constant, #define one (or more) */

typedef struct {
    char nome;
    int vida,
        dano,
        x,
        y;
} dadospecas;

/* pass a pointer to the array as your parameter (inlcude index and value) */
void changeVida (dadospecas *a, int index, int newvida)
{
    a[index].vida = newvida;
}

int main (void)
{

    dadospecas stats[NSTRUCT] = {{'W', 3, 1, 4, 1}, {'F', 33, 11, 44, 14}};

    for (int i = 0; i < NSTRUCT; i++) {                     /* loop over each struct */
        changeVida (stats, i, stats[i].vida + 5);           /* increment vida by 5 */
        printf ("stats[%d].vida = %d\n", i, stats[i].vida); /* output new vida */
    }
}

示例使用/輸出

該示例只是將5添加到vida成員的現有值:

$ ./bin/dadospecas
stats[0].vida = 8
stats[1].vida = 38

如果你傳遞stats的地址

雖然不需要傳遞stats的地址,但沒有什么可以阻止你這樣做——這很好——只是沒有必要。 為了爭論,假設你做到了。 繼續我的評論,在main stats 中是一個類型為dadospecas [2]的數組,所以當你獲取地址時,你的類型是指向數組的指針dadospecas [2] 正式類型是dadospecas (*)[2]

因此,將指針傳遞給您的 function 參數將變為: dadospecas (*a)[2]

在您的 function 中對您的數組進行操作,您首先需要取消引用參數以允許您對數組的元素進行操作,例如(*a)[index]最后更改您將擁有的vida成員:

    (*a)[index].vida = newvida;

對上面示例的更改以傳遞stats的地址將是:

/* pass a pointer to array[NSTRUCT] as your parameter (inlcude index and value) */
void changeVida (dadospecas (*a)[NSTRUCT], int index, int newvida)
{
    (*a)[index].vida = newvida;
}

int main (void)
{

    dadospecas stats[NSTRUCT] = {{'W', 3, 1, 4, 1}, {'F', 33, 11, 44, 14}};

    for (int i = 0; i < NSTRUCT; i++) {                     /* loop over each struct */
        changeVida (&stats, i, stats[i].vida + 5);          /* increment vida by 5 */
        printf ("stats[%d].vida = %d\n", i, stats[i].vida); /* output new vida */
    }
}

(相同的輸出)

這只是保持指針間接級別和觀察C 運算符優先級的簡單問題。

如果您還有其他問題,請仔細查看並告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM