n° 185
Maggio/Giugno 2013
Maggio 20, 2013, 03:19:01 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Massimo Locale  (Letto 408 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
ziomerio
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« inserita:: Agosto 02, 2012, 09:12:50 pm »

 Data una matrice M e un suo valore v, diciamo che v è un massimo locale se v è maggiore od uguale a tutti i valori che si trovano sulla riga e sulla colonna di v. Scrivere una funzione double *localmaxval(int n, double M[n][n], int *cnt) che ritorna in un array, allocato dinamicamente, i valori della matrice M che sono massimi locali e restituisce in *cnt il numero di tali valori. Il problema è che non funziona il programma che ho fatto non mi da errori ma si chiude ...la funzione l ho corretta con la soluzione del professore quindi è giusta. Grazie dell'aiuto.
Codice:
#include <stdlib.h>
#include <stdio.h>
double *localmaxval(int n, double M[n][n], int *cnt) {
    double* ret = 0;
    int nl = 0;
    int i,j,localmax,k;
    for(i = 0; i < n; i ++) {
        for(j = 0; j < n; j ++) {
            localmax = 1;
            for(k = 0; k < n; k ++) {
                if(M[i][j] < M[i][k]) localmax = 0;
                if(M[i][j] < M[k][j]) localmax = 0;
            }
            if (localmax) {
                ret = realloc(ret, (nl+1)*sizeof(double));
                ret[nl] = M[i][j];
                nl++;
            }
        }
    }
    *cnt = nl;
    return ret;
}
        int main(){
        double *c;
        int *f;
        int n,k,j,i;
        printf("grandezza array:");
        scanf("%d",&n);
        double M[n][n];
           for(i=0;i<n;i++){
              for(j=0;j<n;j++){
                  printf("elemento %d %d:",i,j);
                  scanf("%f",&M[i][j]);
                  printf("\n");
              }
           }
        c=localmaxval(n,M,f);
        for(k=0;k<f;k++)printf("%f",c[k]);

        }
Registrato
celeborn85
Global Moderator
Hero Member
*****

Karma: +57/-11
Scollegato Scollegato

Messaggi: 2116


Mostra profilo
« Risposta #1 inserita:: Agosto 02, 2012, 10:40:07 pm »

Non ho controllato molto bene il codice. In ogni caso, compilando il codice, ho trovato i seguenti errori:
1. Per poter leggere un double usando scanf è necessario usare il formato %lf e non %f. Devi quindi correggere la corrispondente riga di lettura degli elementi della matrice.
2. Nel seguente codice f è un puntatore, ma tu lo confronti con un intero. Dovresti scrivere *f nella riga in cui effettui il confronto o potresti andare incontro a strani comportamenti.
Codice:
c = localmaxval(n, M, f);
    for (k = 0; k < f; k++)
        printf("%f", c[k]);

Ci sono però alcune cose che il compilatore non mi ha segnalato. La seguente riga potrebbe infatti causare diversi problemi in alcuni compilatori C.
Codice:
scanf("%d", &n);
double M[n][n];
La possibilità di usare dimensioni conosciute a runtime per definire la dimensione di un array è infatti un'aggiunta "recente" (recente più per via del flop della penultima versione dello standard che per il tempo passato dal suddetto standard) tutt'altro che priva di aspetti negativi. Il principale di questi problemi è che l'allocazione della memoria è nascosta al programmatore e non credo esistano modi per verificarne il successo. Considerando che nel tuo codice non effettui alcun controllo sul valore passato in input, sarebbe a mio parere meglio utilizzare altre tecniche più esplicite (e comunque verificare la dimensione passata in input).

Nessuna di queste cose risolve però il problema con il tuo codice e uno studio più attento è necessario.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
celeborn85
Global Moderator
Hero Member
*****

Karma: +57/-11
Scollegato Scollegato

Messaggi: 2116


Mostra profilo
« Risposta #2 inserita:: Agosto 02, 2012, 10:59:05 pm »

L'errore era sotto gli occhi e non lo vedevo. Nel tuo codice f è un puntatore che punta ad una locazione casuale. Passi quindi questo puntatore alla funzione e cerchi quindi di modificare il valore a cui punta questo puntatore (locazione casuale) con la seguente riga:
Codice:
*cnt = nl;
In effetti il compilatore mi aveva detto che la variabile non era inizializzata ma mi ero, stupidamente, convinto che nella funzione modificassi il puntatore (cosa ovviamente impossibile essendo passato per copia). Per correggere il codice è quindi necessario dichiarare f come un intero e poi chiamare la funzione nel seguente modo:
Codice:
c = localmaxval(n, M, &f);
Il ciclo seguente va invece tenuto come era originariamente (senza quindi la mia correzione dello scorso post).
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
ziomerio
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« Risposta #3 inserita:: Agosto 03, 2012, 12:41:59 am »

Grazie mille non ci sarei mai arrivato da solo Sorriso
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page