2014-09-15 2 views
0

Я изучаю язык программирования C из книги «C Primer Plus». Я решаю упражнение, и я ударяю о стену:Скопируйте 2d-массив в другой

Напишите программу, которая инициализирует двумерную матрицу размером 3 × 5 и использует функцию на основе VLA, чтобы скопировать ее на второй, мерный массив. Также предоставляйте функцию на основе VLA для отображения содержимого двух массивов. Эти две функции должны быть способны, в общем, обрабатывать произвольные массивы N × M. (Если у вас нет доступа к компилятору, совместимому с VLA, используйте традиционный подход C для функций, которые могут обрабатывать массив N × 5).

Я не могу использовать VLA, поскольку мой компилятор не поддерживает его, я использую VC2013. Вот мой код:

#ifdef _MSC_VER 
#define _CRT_SECURE_NO_WARNINGS 
#endif 
#include <stdio.h> 

#define LIM1 10 
#define LIM2 10 
#define LIM3 2 
int ct, ct2, size; 

void copy_arr(double *[LIM3], double *[LIM3], int size, int lim); 
int main(void) 
{ 
    double arr1[LIM1][LIM2], arr2[LIM1][LIM2]; 

    printf("Enter the size of the array\n"); 
    scanf("%d", &size); 
    printf("Enter the array elements\n"); 

    for (ct = 0; ct < size; ct++) 
    { 
     for (ct2 = 0; ct2 < LIM3; ct2++) 
     { 
      scanf("%lf", &arr1[ct][ct2]); 
     } 
    } 
    printf("\n"); 

    for (ct = 0; ct < size; ct++) 
    { 
     for (ct2 = 0; ct2 < LIM3; ct2++) 
     { 
      printf("%.2f ", arr1[ct][ct2]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 

    copy_arr(arr1, arr2, size, LIM3); 

    for (ct = 0; ct < size; ++ct) 
    { 
     for (ct2 = 0; ct2 < LIM3; ++ct2); 
     { 
      arr2[ct][ct2] = arr1[ct][ct2]; 
      printf("%.2f ", arr2[ct][ct2]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 

    system("pause"); 

} 

void copy_arr(double (*arr1)[LIM3], double (*arr2)[LIM3], int size, int lim) 
{ 
    for (ct = 0; ct < size; ct++) 
    { 
     for (ct2 = 0; ct2 < lim; ct2++) 
     { 
      arr2[ct][ct2] = arr1[ct][ct2]; 
     } 
    } 

return; 
} 

выход: http://postimg.org/image/mnswuyy2b/

Я не могу понять, как передать значение переменного размера функции copy_arr. Есть ли другие способы, кроме VLA?

+0

Вы определили 2D массив как 'arr1 [LIM1] [LIM2], arr2 [LIM1] [LIM2]', но в цикле вы используете 'LIM3', как предел второго измерения. Какой вы хотите?? – Arpit

+0

Пожалуйста, не включайте литеральный выходной текст в качестве изображения (и если вы * должны *, по крайней мере, используйте поставщика, который не будет спамить различные всплывающие окна). Просто скопируйте и вставьте вывод в свой пост. – usr2564301

ответ

2

arr1[LIM1][LIM2] - это массив размеров LIM1 массивов размером LIM2. Поэтому подпись copy_arr должно быть:

void copy_arr(double arr1[LIM1][LIM2], double arr2[LIM1][LIM2], int size, int lim); 

или потому, что С ++ позволяет опустить первое измерение:

void copy_arr(double arr1[][LIM2], double arr2[][LIM2], int size, int lim); 

или из-за преобразования массива в-указатель, массив может быть преобразован в указатель в массив размера LIM2:

void copy_arr(double (*arr1)[LIM2], double (*arr2)[LIM2], int size, int lim); 

у вас также есть еще одна проблема в вашем коде:

for (ct2 = 0; ct2 < LIM3; ++ct2); 

Эта последняя точка с запятой делает следующий блок {} не относящимся к контуру. Убери это.

Online Demo

+0

Точка с запятой, как, черт возьми, я ее не видел. Это помогло tnx. – Darius

Смежные вопросы