Делить переменные между функциями в C99 - PullRequest
0 голосов
/ 12 января 2020
  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;
}
Представьте, что мне нужно передать 5 или 6 переменных из функции void yeah() в другую функцию void yessss(); как мне этого добиться? Когда я должен использовать функцию void, а когда функцию int?

Ответы [ 2 ]

0 голосов
/ 12 января 2020
  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;
}

Третий вариант, на который следует обратить внимание (без примера кода), заключается в использовании глобальных переменных.

как передать 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);
когда использовать функцию void или int?

использовать void, когда нет необходимости использовать значение из функции

void beep(void); // sounds the bell

use int когда вы хотите использовать значение из функции

int currenttemp(void); // returns the temperature
0 голосов
/ 12 января 2020
  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])
    {
        …
    }
    

    Other методы используют динамическое управление памятью c (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) использует обозначение (); у него не было выбора. Код, написанный в этом тысячелетии, не должен использовать обозначение ().

...