Bordo di una matrice

di il
2 risposte

Bordo di una matrice

Ciao, data una matrice devo ottenere un vettore contenente gli elementi del suo bordo. la variabile puntata da new_size contiene il numero degli elementi che costituiscono il vettore.
questo è il mio file.h
#if !defined MATRIX_H
#define MATRIX_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define DIMENSIONE m->cols * m->rows
struct matrix{
	size_t rows, cols;
	double *data;
};

extern double *bordo_esterno(const struct matrix *m, size_t *new_size);


#endif
questo è il mio main.c
#include "matrix.h"


int main(){
	double data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	struct matrix m = { 3, 3, data };
	size_t size = 0;
	struct matrix *ris = bordo_esterno(&m, size);

	
	return 0;


}
questo è il mio file.c:
#include "matrix.h"

double *bordo_esterno(const struct matrix *m, size_t *new_size){
	if (m == NULL){
		return NULL;
	}

	size_t righe = m->rows;
	size_t colonne = m->cols;

	size_t numero = (2 * righe) + 2 * (colonne - 2);		//numero elementi bordo
	
	
	double *ris = calloc(numero, sizeof(double));
	if (m->cols == 1 && m->rows == 1){
		*new_size = 1;
		ris = realloc(ris, sizeof(double));
		ris[0] = m->data[0];
		return ris;

	}
	
	size_t i = 0;
	for (i = 0; i < m->cols; i++){
		ris[i] = m->data[i];
	}

	for (size_t k = (m->cols * 2) - 1; k < DIMENSIONE; k += m->cols){
		ris[i] = m->data[k];
		i++;
	}

	for (size_t j = DIMENSIONE - 2; j > DIMENSIONE - m->cols - 1 ; j--){
		ris[i] = m->data[j];
		i++;
	}

	for (size_t s = m->cols ; s > 0; s -= m->cols){
		ris[i] = m->data[s];
		i++;
	}

	*new_size = numero;
	
	return ris;

}
sono abbastanza sicuro che il programma sia corretto, però quando arriva alla riga di codice:
*new_size = numero;
, esce una schermata 'strana' che mi blocca il programma(smettendo di funzionare), e di conseguenza non riesce a ritornare ris.. qualcuno sa che cosa ho sbagliato?

2 Risposte

  • Re: Bordo di una matrice

    Sbagli a passare la variabile.
    
    struct matrix *ris = bordo_esterno(&m, &size); 
    
    P.S.
    Dato che la funzione riceve puntatori, ogni puntatore dev'essere controllato
    
    double *bordo_esterno(const struct matrix *m, size_t *new_size){
       if (m == NULL){
          return NULL;
       }
       // assert(new_size != NULL); se dev'essere una precondizione.
       if (new_size == NULL)
          return NULL;	
    
    
  • Re: Bordo di una matrice

    Si hai ragione! Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte