在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}},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函数?
youaremyjay 回答:在C99中的函数之间共享变量

  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 Translation limits要求编译器接受函数定义并使用至少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
本文链接:https://www.f2er.com/2782263.html

大家都在问