2016-02-24 3 views
0

мне нужно написать программу, которая переставляет матрицу в С. матрицы, которая должна быть перенесена, является одномерным массив, массив А:транспонирование матрицы в C

void fill_array_A(char *arrayA, int ssize) 
{ 
    int i; 
    for(i=0; i<ssize; i++) 
    { 
     printf("Letter %d:\n> ", (i+1)); 
     scanf(" %c", &arrayA[i]); 
    } 
} 

void show_array_A(char *arrayA, int ssize) 
{ 
    int n = sqrt(ssize); 
    int i,j=0; 

    for(i=0; i<ssize; i++) 
    { 
     printf("valueA[%d] = %c ", i, arrayA[i]); 

     j ++; 

     if(j == n) 
     { 
      printf("\n"); 
      j = 0; 
     } 
    } 
} 

valueA[0] = a valueA[1] = a valueA[2] = a 
valueA[3] = b valueA[4] = b valueA[5] = b 
valueA[6] = c valueA[7] = c valueA[8] = c 

мне нужно транспонировать матрица А к матрице В, поэтому В = А (Т). B представляет собой двумерный массив, где B хранит указатели на элементы в массиве A. Однако, мой код показывает неправильные результаты, вместо

valueB[0] = a valueB[3] = b valueB[6] = c 
valueB[1] = a valueB[4] = b valueB[7] = c 
valueB[2] = a valueB[5] = b valueB[8] = c 

мой код дает мне:

valueB[0] = a valueB[1] = b valueB[2] = b 
valueB[3] = a valueB[4] = b valueB[5] = b 
valueB[6] = a valueB[7] = b valueB[8] = b 

В чем проблема? Вот весь код:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

char* create_array_A(int ssize) 
{ 
    char *arrayA = malloc(sizeof(char) * ssize); 
    return arrayA; 
} 

void fill_array_A(char *arrayA, int ssize) 
{ 
    int i; 
    for(i=0; i<ssize; i++) 
    { 
     printf("Letter %d:\n> ", (i+1)); 
     scanf(" %c", &arrayA[i]); 
    } 
} 

void show_array_A(char *arrayA, int ssize) 
{ 
    int n = sqrt(ssize); 
    int i,j=0; 

    for(i=0; i<ssize; i++) 
    { 
     printf("valueA[%d] = %c ", i, arrayA[i]); 

     j ++; 

     if(j == n) 
     { 
      printf("\n"); 
      j = 0; 
     } 
    } 
} 

char** create_array_B(char *arrayA, int ssize) 
{ 
    int n = sqrt(ssize); 
    int i,j; 

    char **arrayB = malloc(sizeof(char*) * n); 

    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
      arrayB[j] = &arrayA[i]; 
     } 
    } 
    return arrayB; 
} 

void show_array_B(char** arrayB, int n, int m) 
{ 
    int i,j,k=0; 

    for(i=0; i<n; i++) 
    { 
     for(j=0; j<m; j++) 
     { 
      printf("valueB[%d] = %c ", k, arrayB[i][j]); 
      k ++; 
     } 
     printf("\n"); 
    } 
} 

int main(int argc, char **argv) 
{ 
    int n = 9; 

    char *arrayA = create_array_A(n); 
    fill_array_A(arrayA, n); 
    show_array_A(arrayA, n); 

    printf("\n"); 

    char **arrayB = create_array_B(arrayA, n); 
    show_array_B(arrayB, sqrt(n), sqrt(n)); 

    return 0; 
} 
+0

Матрица, как правило, представляет собой 2D-массив. Транспонирование «вектора» довольно бесполезно, просто интерпретируйте их по-разному, в зависимости от их использования. И 'char **' - это не 2D-массив! Указатель не является массивом. – Olaf

ответ

2

Есть несколько ошибок в коде наиболее очевидным является создание массива B. Попробуйте это следующим образом:

char** create_array_B(char *arrayA, int ssize) 
{ 
    int n = sqrt(ssize); 
    int i,j; 

    char **arrayB = malloc(sizeof(char*) * ssize); 
    //          ^^^ 
    if (arrayB == NULL) 
     // handle error 
    for(i = 0; i < n; i++) 
    { 
     for(j = 0; j < n; j++) 
      arrayB[i * n + j] = &arrayA[j * n + i]; 
      //  ^^^^^^^^^   ^^^^^^^^^^ 
    } 
    return arrayB; 
} 

Другие ошибки включают в себя печать элементов, выделение памяти из плохой размер и освободить/освободить память malloced.

Полное решение может быть найдено here.

Теперь все в порядке. Выполняется с помощью valgrind:

[email protected]:/matrix_transp$ valgrind --leak-check=yes --leak-check=full --show-leak-kinds=all ./executable 
==30322== Memcheck, a memory error detector 
==30322== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==30322== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info 
==30322== Command: ./executable 
==30322== 
valueA[0] = 0 valueA[1] = 1 valueA[2] = 2 
valueA[3] = 3 valueA[4] = 4 valueA[5] = 5 
valueA[6] = 6 valueA[7] = 7 valueA[8] = 8 

valueB[0] = 0 valueB[1] = 3 valueB[2] = 6 
valueB[3] = 1 valueB[4] = 4 valueB[5] = 7 
valueB[6] = 2 valueB[7] = 5 valueB[8] = 8 
==30322== 
==30322== HEAP SUMMARY: 
==30322==  in use at exit: 0 bytes in 0 blocks 
==30322== total heap usage: 2 allocs, 2 frees, 81 bytes allocated 
==30322== 
==30322== All heap blocks were freed -- no leaks are possible 
==30322== 
==30322== For counts of detected and suppressed errors, rerun with: -v 
==30322== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
+0

ОК, большое спасибо – yak

+0

приветствуются – 4pie0

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