#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); }
Комментариев нет:
Отправить комментарий