Inserire colonna matrice in una lista

di il
32 risposte

Inserire colonna matrice in una lista

Buongiorno a tutti, scusate il disturbo, sto provando a creare questo programma, devo inserire il vettore colonna di una matrice (partendo dall'ultima colonna di questa), in una lista, in ogni nodo della lista c'e' la colonna stessa della matrice. Per semplificare l'inserimento ho impostato un valore max per le righe e colonne della matrice. Quando provo a avviare il programma si crea una violazione di accesso in scrittura: vec[k] = mat[i*N+j], non capisco perché...




#define M 2
#define N 3

float mat[M][N];
int i, k = 0;
int j;


struct list {
	float vec;
	struct list* next_ptr;
};



void init(struct list **ptrptr) { 
	*ptrptr = NULL; 
}

void pre_insert(struct list **ptrptr, float vec[M]) {
		struct list* tmp_ptr;
		tmp_ptr = *ptrptr;
		*ptrptr = (struct list*)malloc(sizeof(struct list));
		(*ptrptr)->vec=vec[M];
		(*ptrptr)->next_ptr = tmp_ptr;
		printf("%f", vec[M]);
}
void from_mat(float *vec[M], struct list **ptrptr) {
	int k = 0;
	for (j=N; j>0; j=j-1){
		for (i = 0; i < M; i++) {
			vec[k] = mat[i*N+j];
			k++;
		} 
		return (vec[M]);
		pre_insert(ptrptr, vec[M]);
	}
}

32 Risposte

  • Re: Inserire colonna matrice in una lista

    Un main c'è?

    E poi che c'entra

    return (vec[M]);

    in mezzo al codice della funzione from_mat (che fra l'altro è void)?

    E perché continui ad utilizzare vec[M] che è un elemento inesistente?
  • Re: Inserire colonna matrice in una lista

    Si scusa, poi sempre nel Main ci sarebbe il case di uscita che funziona
    
    main{
       do {
           printf("\nChe operazione vuoi fare? "); 
           scanf("%s", selection);
           switch (selection[0]) { 
    	     case 'a': 
    			 printf("\nInseriamo i valori nella matrice\n");
    			 for (j = N; j > 0; j = j - 1) {
    				 for (i = 0; i < M; i++) {
    					 printf("\nvalore matrice [%d] X [%d]\n", i, j);
    					 scanf("%f", &mat[i][j]);				 
    				 }
    			 }
    		     from_mat(list, &vec);
    	}
    } 
  • Re: Inserire colonna matrice in una lista

    Il return e' stata un'abbozzata dell'ultimo momento per vedere se cambiava qualcosa
  • Re: Inserire colonna matrice in una lista

    Posta un codice compilabile senza errori (in questo ce ne sono tanti) altrimenti non si può eseguire e vedere dove sta il problema.

    E non posso certo correggere il tuo codice.
  • Re: Inserire colonna matrice in una lista

    Questo e' tutto il programma, la soluzione e' compilabile senza errori
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    
    
    #define M 2
    #define N 3
    
    struct list {
    	float vec;
    	struct list* next_ptr;
    };
    
    typedef unsigned short int Boolean; 
    #define TRUE 1 
    #define FALSE 0
    
    float mat[M][N];
    int i, k = 0;
    int j;
    
    
    void init(struct list **ptrptr);
    void pre_insert(struct list **ptrptr, float vec[M]);
    void from_mat(float *vec[M], struct list **ptrptr);
    void notify_selection_failure(char selection);
    void getvalue(float* value_ptr);
    
    main() {
        struct list* list;
    	int size = 12; 
    	char selection[10];
    	init(&list); 
    	int i = 0;
    	int j = N;
    	float vec[M];
    	float value=0;
    	printf("Digita uno dei seguenti caratteri\nper fare le operazioni sulla lista collegata con array e puntatori:\n");
    	printf("-a per creare matrice\n");
    	printf("-x per uscire dal programma\n");
    	Boolean exit_required = FALSE;
    	do {
           printf("\nChe operazione vuoi fare? "); 
           scanf("%s", selection);
           switch (selection[0]) { 
    	     case 'a': 
    			 printf("\nInseriamo i valori nella matrice\n");
    			 for (j = N; j > 0; j = j - 1) {
    				 for (i = 0; i < M; i++) {
    					 printf("\nvalore matrice [%d] X [%d]\n", i, j);
    					 scanf("%f", &mat[i][j]);				 
    				 }
    			 }
    		     from_mat(list, &vec);
    		 case 'x': 
    			 exit_required = TRUE; 
    		     break; 
    		     default: notify_selection_failure(selection[0]);
    	   }
    	} while (exit_required == FALSE);
    }
    
    void init(struct list **ptrptr) { 
    	*ptrptr = NULL; 
    }
    
    void pre_insert(struct list **ptrptr, float vec[M]) {
    		struct list* tmp_ptr;
    		tmp_ptr = *ptrptr;
    		*ptrptr = (struct list*)malloc(sizeof(struct list));
    		(*ptrptr)->vec=vec[M];
    		(*ptrptr)->next_ptr = tmp_ptr;
    		printf("%f", vec[M]);
    }
    void from_mat(float *vec[M], struct list **ptrptr) {
    	int k = 0;
    	for (j=N; j>0; j=j-1){
    		for (i = 0; i < M; i++) {
    			vec[k] = mat[i*N+j];
    			k++;
    		} 
    		pre_insert(ptrptr, vec[M]);
    	}
    }
    void getvalue(float *value_ptr) { //acquisisce un float da tastiera (passaggio per puntatore) 
    	printf("Inserisci un valore:");
    	scanf("%f", value_ptr);
    }
    void notify_selection_failure(char selection) { //notifica il fallimento della selezione 
    	printf("\n%c Selezione non legale!!", selection);
    }
  • Re: Inserire colonna matrice in una lista

    In

    from_mat(list, &vec);

    error C2664: 'void from_mat(float *[],list **)': impossibile convertire l'argomento 1 da 'list *' a 'float *[]'

    per non parlare di

    vec[k] = mat[i*N + j];

    error C2440: '=': impossibile convertire da 'float [3]' a 'float'

    in cui mat è usata come vettore ma in realtà è una matrice.
  • Re: Inserire colonna matrice in una lista

    Vec[k] = mat[i*N + j];
    non capisco come posso creare un vettore che contenga solo una colonna della matrice, io pensavo di creare un vettore inserendo il primo valore della colonna, incremento k++ e pensavo di trovare il secondo… mi sa che e' sbagliato il mio ragionamento
  • Re: Inserire colonna matrice in una lista

    Una colonna della matrice ha il numero di colonna fisso. Quindi, ad esempio, per la prima colonna ti basta un ciclo
    
    for(r=0; r<MAXRIGHE; r++)
       vec[r] = mat[r][0];
    
  • Re: Inserire colonna matrice in una lista

    Okay, per inserire in ogni nodo della lista il vettore, e poi stampare proprio questo vettore, non posso impotare cosi' la funzione?
    
    void pre_insert(struct list **ptrptr, float vec[M]) {
    
    }
    void from_mat(float mat[M][N], float vec[M], struct list **ptrptr) {
    	for(j = 0; j < N; j++){
    	    for (i = 0; i < M; i++){
    		   vec[i] = mat[i][j];
    	    } 
    		pre_insert(ptrptr, vec[i]);
    	}
    	
    void pre_insert(struct list **ptrptr, float vec[M]) {
    		struct list* tmp_ptr;
    		tmp_ptr = *ptrptr;
    		*ptrptr = (struct list*)malloc(sizeof(struct list));
    		(*ptrptr)->vec=vec[i];
    		(*ptrptr)->next_ptr = tmp_ptr;
    		printf("%f", vec[i]);
    }
  • Re: Inserire colonna matrice in una lista

    Che senso ha la
    
    void pre_insert(struct list **ptrptr, float vec[M]) {
    
    }
    vuota??
    vec[i]
    non rappresenta il vettore ma un solo elemento del vettore e non puoi passarlo ad una funzione in questo modo

    Quindi per la chiamata devi scrivere
    pre_insert(ptrptr, vec);
    Poi in
    void from_mat(float mat[M][N], float vec[M], struct list **ptrptr) {
    a che serve il primo parametro se mat è globale? Quindi basta
    void from_mat(float vec[M], struct list **ptrptr) {
    Infine, nella pre_insert, di nuovo, cosa è vec[ i ] per te? E' solamente un valore (e con un indice che non ha senso), certamente NON rappresenta tutta la colonna. Quindi NON è corretto. COSA vuoi fare nella pre_insert?


    Hai ancora parecchie difficoltà nel passaggio dei parametri alle funzioni e nella comprensione della differenza tra vettori e i suoi elementi.
    Dovresti rivedere questi argomenti teoricamente perché, altrimenti, non riuscirai facilmente ad arrivare a soluzione dell'esercizio. Non ci arriverai sicuramente per tentativi, ma solo capendo i concetti che stanno alla base.

    Per essere chiari, mostra un piccolo esempio di come dovrebbe essere una lista di due nodi con un vettore di 3 elementi (valori a caso).
    Per come è la struttura, in ogni nodo ci metti UN solo valore float.
  • Re: Inserire colonna matrice in una lista

    Cosi' inserirei un vaore float generico in testa alla lista
    
    struct list {
    	float val;
    	struct list* next_ptr;
    };
    void pre_insert(struct list **ptrptr, float value) {
    		struct list* tmp_ptr;
    		tmp_ptr = *ptrptr;
    		*ptrptr = (struct list*)malloc(sizeof(struct list));
    		(*ptrptr)->val=value;
    		(*ptrptr)->next_ptr = tmp_ptr;
    }		
    
    se volessi inserire un vettore al posto val avrei vec, al posto di value il valore che ho trovato
  • Re: Inserire colonna matrice in una lista

    Scusa, se val è un float singolo e vec un vettore, come assegni vec a val ?
  • Re: Inserire colonna matrice in una lista

    Modificando la struttura della listaa
    cioe'
    
    struct list {
           float vec;
    	struct list* next_ptr;
    };
    void pre_insert(struct list **ptrptr, float vec[M]) {
    		struct list* tmp_ptr;
    		tmp_ptr = *ptrptr;
    		*ptrptr = (struct list*)malloc(sizeof(struct list));
    		(*ptrptr)->vec=vec[M];
    		(*ptrptr)->next_ptr = tmp_ptr;
    }
    
    definendo pero' il vettore vec[] e specificandone la dimensione
  • Re: Inserire colonna matrice in una lista

    Non mi pare tu abbia modificato la struct (c'è sempre un singolo float nella struttura) e non puoi assegnare il vettore in quel modo (hai studiato i vettori? vec[M] è un elemento del vettore con indice sbagliato, non il vettore, te l'ho già detto)
Devi accedere o registrarti per scrivere nel forum
32 risposte