fwrite 二进制文件中不正确的值赋值写入矩阵

fwrite incorrect value assignment writing matrixes in a binary file

我正在尝试制作一个在二进制文件中写入矩阵的程序。前两项是矩阵的行和列,然后是其余的值。 矩阵的数据是浮点数(当它都是整数时,它有效,但是当我将值更改为浮点数时它停止工作)。

下一段代码是将矩阵写入二进制文件的方法。这是一切崩溃的部分。 下一个是Matrix定义:

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

typedef struct Matriz_t {
    int numFilas;
    int numColumnas;    
    float** datos;
}Matriz_t;
//create matrix
Matriz_t* crearMatriz(int numFilas, int numColumnas)
{

    Matriz_t* nMatriz = NULL;
    int i = 0;
    nMatriz = (Matriz_t*)malloc(sizeof(Matriz_t));
    nMatriz->numColumnas = numColumnas;
    nMatriz->numFilas = numFilas;

    nMatriz->datos = (float**)malloc(sizeof(float*)*numFilas);
    for (i = 0; i < numColumnas; i++) {
        nMatriz->datos[i] = (float*)malloc(sizeof(float)*numColumnas);
    }
    return nMatriz;
}
//read matrix
void leerMatriz(char * nomFichero, Matriz_t ** m1, int traspuesta)
{
    FILE* f1 = NULL;
    int i, j;
    int numFilas = 0, numColumnas = 0;

    f1 = fopen(nomFichero, "r");


    fread(&(numFilas), sizeof(int), 1, f1); . 
    fread(&(numColumnas), sizeof(int), 1, f1);
    (*m1) = crearMatriz(numFilas, numColumnas);
    if (traspuesta) {

        for (i = 0; i < (*m1)->numFilas; i++)
            for (j = 0; j<(*m1)->numColumnas; j++)
                fread(&((*m1)->datos[j][i]), sizeof(float), 1, f1);

    }
    else {
        for (i = 0; i < (*m1)->numFilas; i++)
            fread((*m1)->datos[i], sizeof(float), (*m1)->numColumnas, f1);
    }
    fclose(f1);
}

//write matrix
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
{
    FILE* f1 = NULL;
    int i, j;


    f1 = fopen(nomFichero, "w");
    fwrite(&(m1->numFilas), sizeof(int), 1, f1); 
    fwrite(&(m1->numColumnas), sizeof(int), 1, f1);
    if (traspuesta) {
        for (i = 0; i < m1->numFilas; i++)
            for (j = 0; j < m1->numColumnas; j++)
                fwrite(&(m1->datos[j][i]), sizeof(float), 1, f1);
    }
    else {
        for (i = 0; i < m1->numFilas; i++)
            fwrite(m1->datos[i], sizeof(float), m1->numColumnas, f1);
    }
    fclose(f1);
}
//main
int main()
{
    int i = 0, j = 0;
        Matriz_t *m1, *m2, *mres;

        m1 = crearMatriz(4, 4);
        m2 = crearMatriz(4, 4);
        for (i = 0; i < 4; i++)
            for (j = 0; j < 4; j++) {
                m1->datos[i][j] = j;
                m2->datos[i][j] = i;
            }
        printf("\n Matriz 1: \n");
        printf("%d y %d ", m1->numFilas, m1->numColumnas);
        for (i = 0; i < 4; i++) {
            printf("\n");
            for (j = 0; j < 4; j++) {
                printf("%f ", m1->datos[i][j]);
            }
        }
        printf("\n Matriz 2: \n");
        for (i = 0; i < 4; i++) {
            printf("\n");
            for (j = 0; j < 4; j++) {
                printf("%f ", m2->datos[i][j]);
            }
        }

        escribirMatriz("matriz3.bin", &m1, 1);
        escribirMatriz("matriz4.bin", &m2, 1);

        //leer matriz
        leerMatriz("matriz3.bin", &m1, 0);
        leerMatriz("matriz4.bin", &m2, 0);

将最后一个数字 "traspuesta"(将 cols 和 rows)更改为全部 1 1 可能会起作用,但由于 cols 和 rows 的数量不正确,因此无法相乘(而且该方法是正确的,但无论如何,一切都为 0 应该没问题)。

然后我做了一个简单的 if 来检查我是否可以将这些矩阵相乘(M1 nxm 和 M2 ixj,可以相乘 if m==i,但是作为写法不行,永远不会倍增。

escribirMatriz("matriz3.bin", &m1, 1);

这是不正确的,本世纪制造的任何编译器至少应该警告过你。

mtrx.c:102:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
         escribirMatriz("matriz3.bin", &m1, 1);
                                       ^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
 void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
      ^~~~~~~~~~~~~~
mtrx.c:103:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
         escribirMatriz("matriz4.bin", &m2, 1);
                                       ^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
 void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
      ^~~~~~~~~~~~~~