Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Как передать массив в функцию, чтобы его значения не изменились

#cpp #c #массивы #функции #указатели


Хотел реализовать сортировку вставкой и задался таким вопросом: как мне передать
массив в функцию чтобы после обработки его значения не изменились в функции main?
Допустим я хочу передать массив в функцию, чтобы он там сортировался, вывести его
в этой же функции, но чтобы при этом значения его не поменялись в функции main. 
Если когда я передаю обычную переменную в функцию, то она не изменится, а если массив
то там передается указатель на массив и он полюбому изменит свои значения в функции main.

#include 
#include 
#include 
#include 

void PrintA(int A[], int N);
void Swap(int *a, int *b);
void InsertionSort(int A[], int N);

int main(void)
{
    const int N = 10;
    int A[N];

    for (int i = 0; i < N; i++)
    {
        A[i] = 1 + rand() % 9;
    }

    printf("Array under insertion sort: \n");
    PrintA(A, N);

    InsertionSort(A, N);

    /*printf("Array after insertion sort: \n");
    PrintA(A, N);*/

    system("pause");
}

void PrintA(int A[], int N)
{
    for (int i = 0; i < N; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
}

void Swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void InsertionSort(int A[], int N)
{
    int j;

    for (int i = 1; i < N; i++)
    {
        j = i;
        while (j > 0 && A[j - 1] > A[j])
        {
            Swap(&A[j - 1], &A[j]);
            j--;
        }
    }
    PrintA(A, N);
}


Пробовал как-то снять указатель на массив, но потом у меня были ошибки с функцией
Swap в функции InsertionSort.
    


Ответы

Ответ 1



Только копирую массив во временную переменную а ля template void InsertionSort(int A[], int N) { // Вот здесь: int template[A.Length]; for(int i = 0;i < A.Length;i++) { template[i] = A[i]; } int j; for (int i = 1; i < N; i++) { j = i; while (j > 0 && template[j - 1] > template[j]) { Swap(&template[j - 1], &template[j]); j--; } } //Передаем наш массив PrintA(template, N); }

Ответ 2



может memcpy? int main(void) { const int N = 10; int A[N], B[N]; ....код наполняющий массив A memcpy((void*)B, (void*)A, (sizeof(int) * N)); PrintA(B, N);

Ответ 3



Просто массив нужно копировать - или самому, или встроенной функцией. Но есть один обходной путь - если массив встроен в структуру, то он копируется компилятором. typedef struct Massiv_ { int A[100]; } Massiv; void Sort(Massiv M, int N) { // Сортируем M.A - тот массив, что передан, тронут не будет }

Ответ 4



Сделать копию массива внутри функции и там же распечатать void InsertionSort(int A_tmp[], int N) { int A[sizeof(A_tmp)/sizeof(int)]; for (int i=0;i < (sizeof(A_tmp)/sizeof(int)); i++) { A[i] = A_tmp[i]; } int j; for (int i = 1; i < N; i++) { j = i; while (j > 0 && A[j - 1] > A[j]) { Swap(&A[j - 1], &A[j]); j--; } } PrintA(A, N); }

Комментариев нет:

Отправить комментарий