Ciao, ho fatto un programma in cui data una matrice m, devo allocare dinamicamente una matrice che ha le diagonali scambiate. Quindi la diagonale principale deve essere scambiata con la diagonale secondaria. Il mio programma funziona correttamente solo per una matrice 3 x 3, ma non per matrici con altre dimensioni. Il problema sta nel fatto che non riesco a trovare la formulina che mi riconosce un elemento della diagonale secondaria, cosi me lo scambia poi con elemento della diagonale principale. In questo caso ho utilizzato
m->cols + (2 * r) - 1
per identificare l'indice di ogni elemento della diagonale secondaria, cosi mentre scorro la matrice quando incontro un elemento della diagonale principale lo scambio con un elemento della diagonale secondaria. Sono abbastanza sicuro del mio programma che vada bene, però c'è quella piccola imperfezione che non riesco a capire come modificarla. Qualcuno per favore mi dà una mano?
Questo è il mio codice:
file.h
#if !defined MATRIX_H
#define MATRIX_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define DIMENSIONE ris->rows * ris->cols
struct matrix{
size_t rows, cols;
double *data;
};
extern struct matrix *scambia_diagonali(const struct matrix *m);
#endif
file.c
#include "matrix.h"
struct matrix *scambia_diagonali(const struct matrix *m){
if (m == NULL){
return NULL;
}
struct matrix *ris = malloc(sizeof(struct matrix));
ris->cols = m->cols;
ris->rows = m->rows;
ris->data = malloc(DIMENSIONE * sizeof(double));
double temp; //variabile temporanea
int centrale = ((m->cols - 1) / 2);
int colonne = m->cols % 2; //se c'è elemento centrale
//alloco matrice originale
for (unsigned int r = 0; r < m->rows; r++){
for (unsigned int c = 0; c < m->cols; c++){
int indice = (m->cols * r) + c;
ris->data[indice] = m->data[indice];
}
}
for (unsigned int r = 0; r < m->rows; r++){
for (unsigned int c = 0; c < m->cols; c++){
int indice = (m->cols * r) + c;
if (r == c){
if (colonne != 0 && r == centrale && c == centrale){ //caso particolare elemento centrale, non scambio
continue;
}
//faccio scambio perchè ho un elemento della diagonale principale
temp = m->data[indice];
ris->data[indice] = m->data[m->cols + (2 * r) - 1];
ris->data[m->cols + (2 * r) - 1] = temp;
continue;
}
}
}
return ris;
}
main.c
#include "matrix.h"
int main(){
double data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
struct matrix m = { 3, 3, data };
struct matrix *ris = scambia_diagonali(&m);
return 0;
}