2015-08-29 3 views
0

У меня две динамически распределенные матрицы. Я хочу скопировать все данные из первой матрицы и центрировать ее по границе со второй. Вот мой код, который, по-видимому, не работает правильно, так что я был бы благодарен за некоторую помощь:Скопируйте данные из одной матрицы в другую в C

Первая матрица:

unsigned char ** sudo=(unsigned char **) malloc (width*sizeof (unsigned char*)); 

if (sudo != NULL){ 
    for (k=0; k<width ;k++){ 
     sudo[k] =(unsigned char*) calloc (height,sizeof (unsigned char)); 
    } 
} 

второй:

unsigned char ** fmatr=(unsigned char **) malloc ((width+border)*sizeof (unsigned char*)); 

if (fmatr != NULL){ 
    for (k=0; k<(width+border) ;k++){ 
     fmatr[k] =(unsigned char*) calloc ((height+border),sizeof (unsigned char)); 
    } 
} 

Как центрировать первую матрицу в середине второго:

for(i=0,k=0;i<(width+border);i++,k++){ 
     for(j=0,l=0;j<(height+border);j++,l++){ 
     if((i>(2*border)) && (j>(2*border))){ 
      fmatr[i][j]=sudo[k][l]; 
     } 
    } 
} 

Любые идеи?

+0

Если вы хотите централизовать данные, почему вы используете (i> 2 * border), а не (i> = border) и (i <высота + граница)? – CIsForCookies

+0

Стандартное предупреждение: не выдавайте результат 'malloc' в C! C не является C++. И обратите внимание, что это не матрица, которая будет представлять собой 2D-массив. У вас есть массив указателей на (массивы) 'unsigned char'. Копирование matrx будет просто одним «memcpy (dest, src, width * height)». Поскольку вы используете элементы 'char', размер каждого элемента гарантируется« 1 »стандартом (вы также можете использовать это в своем коде). – Olaf

+0

Пожалуйста, не удаляйте код или релевантную информацию из вашего вопроса. Этот сайт служит архивом знаний о программировании, и очистка содержимого вопроса удаляет информацию, которая может понадобиться кому-то другому. – dbush

ответ

0

Поскольку в первой матрице есть записи ширины x высота, вы хотите, чтобы петля от 0 до ширины-1 (не ширина-1 + граница) и от 0 до высоты-1 (не высота-1 + граница). Аналогично, вы хотите добавить border/2 к индексу второго массива при назначении.

for(i=0;i<width;i++){ 
    for(j=0;j<height;j++){ 
    fmatr[i+(border/2)][j+(border/2)]=sudo[i][j]; 
    } 
} 
+0

@ b-parker Я вижу, что вы опубликовали следующий вопрос, который, кажется, предполагает, что этот ответ затронул ваш вопрос. Если это так, не стесняйтесь [принять этот ответ] (http://stackoverflow.com/help/accepted-answer). – dbush