簡體   English   中英

在 C99 中的函數之間共享變量

[英]Share variables between functions in C99

  1. 從主matrix_1輸入,我需要創建一個新的並僅用奇數打印它。 現在我從函數打印它,但我需要從main()打印它; 我怎樣才能做到這一點?
#include <stdio.h>
#define len 4

void copiaDispari();

int main () {

    int i, j, matrix_1[len][len];

    for (i=0; i < len; i++){
        for (j=0; j < len; j++) {
            printf ("Inserisci il numero della matrice %d %d:", i, j);
            scanf ("%d", &matrix_1[i][j]);
        }
    }

    copiaDispari(matrix_1);

    for (i=0; i < len; i++){
        for (j=0; j < len; j++) {
            printf ("%d", matrix_2[i][j]);
        }
        printf("\n");
    }

    return 0;
}

void copiaDispari(int matrix_1[len][len]) {

    int matrix_2[len][len]= {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, i, j, l=0, m=0;


    for (i=0; i < len; i++){
        for (j=0; j < len; j++){
            if (matrix_1[i][j]%2!=0){
                if (l==4) {
                    l=0; m++;
                }
                matrix_2[m][l] = matrix_1[i][j];
                l++;
            }
        }
    }

    for (i=0; i < len; i++){
        for (j=0; j < len; j++) {
            printf ("%d", matrix_2[i][j]);
        }
        printf("\n");
    }

    return;
}
  1. 想象我必須從一個功能通過5個或6個變量void yeah()到另一個功能void yessss() ; 我怎樣才能實現它?
  2. 什么時候應該使用 void 函數,什么時候使用 int 函數?
  1. 最簡單的方法是在main()分配第二個數組並將其作為參數傳遞給函數(以及第一個數組)。

     int i, j, matrix_1[len][len], matrix_2[len][len] = { { 0 } }; … copiaDispari(matrix_1, matrix_2); … void copiaDispari(int matrix_1[len][len], matrix_2[len][len]) { … }

    其他技術使用動態內存管理( malloc()等),或將數組封裝在結構中並傳遞結構類型(您可以返回包含數組的結構;您不能從函數中返回數組),或者(有時,但不經常)在函數中使用static數組並返回指向它的指針(不要這樣做),或使用全局變量(也不要這樣做!)。

  2. 函數可以有半無限大的參數。 C11 §5.2.4.1 翻譯限制要求編譯器接受至少具有 127 個參數的函數定義和調用。 僅僅 5 或 6 不會引起編譯器任何焦慮。 但是,減少參數的數量是個好主意。

    如果要從函數返回多個值,可以將多個指針傳遞給函數,並讓它通過指針修改變量。 或者您可以將變量集包裝到一個結構中並傳遞一個指向合適結構的指針,或者您可以將合適的結構返回給調用函數。

  3. 當函數產生一個將被調用代碼使用的值時,通常不應使用void函數。 您可以傳遞指向變量的指針,函數可能會修改這些指針以返回其答案。 如果函數可能失敗,你可能讓它在成功時返回 0,在失敗時返回一些其他值; 當然,這排除了它具有返回類型void 錯誤處理是 C 編程的主要部分。 如果函數沒有返回值來指示成功或失敗,則很難知道是否存在問題。


順便說一句,函數的前向聲明不應該是:

void copiaDispari();

在您的原始代碼中,它應該是:

void copiaDispari(int m1[len][len]);

在修改后的代碼中,應該是;

void copiaDispari(int m1[len][len], int m2[len][len]);

這將有助於防止錯誤,例如使用錯誤數量的參數調用函數。

您永遠不應該為參數列表編寫帶有()的函數聲明。 這表示該函數采用不確定數量的參數(但它不是像printf()那樣的可變參數列表函數)。 如果函數沒有參數,寫int function(void); 在聲明中,為了一致性,在定義中使用int function(void) { … } 盡管您可以在定義中編寫int function() { … } ,但這不提供該函數的原型,並且可能在同一源文件中被錯誤調用。 請注意,C++ 在這方面與 C 不同。 舊的 C 代碼(在 C89/C90 標准產生之前)使用()表示法; 它沒有選擇。 在這個千年編寫的代碼不應該使用()符號。

  1. [改寫] 如何將數據發送回調用函數?

基本上你有兩個選擇

創建對象以在調用函數中保存數據,傳遞一個指針並讓被調用函數使用該對象

int main(void) {
    int src1[10][10] = {0};
    int src2[10][10] = {0};
    fx(src1, src2);
}

或者在被調用的函數中使用malloc() (和朋友),然后將其返回給負責free資源的調用者。

typedef int m2[10][10];

int main(void) {
    int src[10][10] = {0};
    m2 *dst = fx(src);
    // use dst
    free(dst);
}

m2 *fx(int m[10][10]) {
    m2 *x = malloc(10 * 10 * sizeof (int));
    // work with m to change x values
    return x;
}

不贊成的第三種選擇(沒有示例代碼)是使用全局變量。

  1. 如何在函數之間傳遞 5 或 6 個變量?

基本上,只需在調用代碼中指定它們,例如

printf("%s bought %d %s for %.2f\n", name, quantity, "apples", quantity * price);

或者,如果變量是相關的,您可以嘗試將它們分組在一個struct並傳遞一個指針

struct GroupData {
    char name[100];
    int quantity;
    char item[100];
    double price;
};
struct GroupData x = {"John", 42, "apple", 0.31};
workwithdata(&x); // can also pass a copy of the struct
                  // workwithcopy(x);
  1. 什么時候使用 void 函數或 int 函數?

當不需要使用函數中的值時使用void

void beep(void); // sounds the bell

當您想使用函數中的值時使用int

int currenttemp(void); // returns the temperature

暫無
暫無

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

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