在C语言中转置矩阵
我需要写一个程序来转换C中的矩阵。需要转换的矩阵是一个一维数组,数组a:在C语言中转置矩阵,c,arrays,pointers,math,matrix,C,Arrays,Pointers,Math,Matrix,我需要写一个程序来转换C中的矩阵。需要转换的矩阵是一个一维数组,数组a: 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
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
我的代码告诉我:
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;
}
#包括
#包括
#包括
字符*创建数组(int-ssize)
{
char*arrayA=malloc(sizeof(char)*ssize);
返回阿拉亚;
}
空填充数组(字符*数组,整数大小)
{
int i;
对于(i=0;i,代码中有几个错误,最明显的是创建数组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;
}
代码中有几个错误,最明显的错误是创建数组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;
}
矩阵通常是2D数组。“向量”的换位是非常无用的,只是根据它们的用法对它们进行不同的解释。而且char**
绝对不是2D数组!指针不是数组。矩阵通常是2D数组。“向量”的换位是很没用的,只是根据它们的用法进行不同的解释。而且char**
绝对不是2D数组!指针不是数组。好的,非常感谢。好的,非常感谢
p@:/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)