bruno.demarini (Normal User)
Pro
Messaggi: 84
Iscritto: 22/03/2010
|
Ciao a tutti, ho questo frammento di codice:
Codice sorgente - presumibilmente C++ |
int nval, nval2, i; int *arr, *arr2; do{ scanf("%d", &nval); }while (nval < 0 || nval > N); if (arr = (int*)malloc(nval*sizeof(int))){ for (i = 0; i < nval; i++) scanf("%d", arr+i);
|
Il problema sorge nel popolare l'array di interi. Ottengo "core dump. Errore di segmentazione" quando acquisisco l'ultimo degli nval valori che devono essere acquisiti. Il problema è che questo non avviene sempre. Avviene quando nval è maggiore di 3.
Qualcuno sa la causa di questo errore? Può essere un problema di deallocazione della memoria (free) ? Grazie.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Il problema non è in quella parte di codice ...
Mostra il resto
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
bruno.demarini (Normal User)
Pro
Messaggi: 84
Iscritto: 22/03/2010
|
Postato originariamente da nessuno:
Il problema non è in quella parte di codice ...
Mostra il resto |
Posto l'intero codice:
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <malloc.h> #define N 30 int arrayMaggiori(int*, int, int**); int main(int argc, char*argv[]){ int nval, nval2, i; int *arr, *arr2; do{ scanf("%d", &nval); }while (nval < 0 || nval > N); if (arr = (int*)malloc(nval*sizeof(int))){ for (i = 0; i < nval; i++) scanf("%d", &arr[i]); nval2 = arrayMaggiori(arr, nval, &arr2); free(arr); if (nval2 > 0){ /*mostro la dimensione*/ printf("\n%d", nval2); /*mostro i valori*/ printf("\n"); for (i = 0; i < nval2; i++) printf("%d ", *(arr2+i)); }else if (nval2 == -2) printf("\nErrore allocazione memoria secondo vettore"); else if (nval2 == -1) printf("\nNessun valore inserito!"); }else printf("\nErrore allocazione memoria primo vettore"); free(arr2); return 0; } /*ritorna la dimensione del nuovo array; -2 se l'allocazione è fallita; -1 se l'array passato non ha elementi*/ int arrayMaggiori(int* v, int dim, int** newv){ int i, j, somma, newdim; float media; if (dim){ /*calcolo somma*/ for (i = 0, somma = 0; i < dim; i++) somma += *(v+i); /*calcolo media*/ media = (float)somma/dim; /*calcolo nuova dimensione*/ for (i = 0, newdim = 0; i < dim; i++) if (*(v+i) > media) newdim++; /*alloco*/ if (*newv = (int*)malloc(sizeof(int)*newdim)){ for (i = 0, j = 0; i < dim; i++) if (*(v+i) > media){ **(newv+j) = *(v+i); j++; } }else return -2; return newdim; } return -1; }
|
Ovviamente lo scopo del codice è mostrare solo gli elementi che siano maggiori della media degli elementi dell'array passato.
P.S: Avevo l'impressione che l'errore fosse in quella parte di codice perché se per esempio si mette un printf("ciao") subito dopo la visualizzazione di ciascun elemento, "ciao" viene mostrato dopo ogni elemento mostrato ad eccezione che dell'ultimo. Ultima modifica effettuata da bruno.demarini il 16/12/2014 alle 21:04 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non ho avuto il tempo di esaminare tutto il codice ma l'errore avviene in questa riga
**(newv+j) = *(v+i);
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Probabilmente volevi scrivere
*(*newv+j) = *(v+i);
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
bruno.demarini (Normal User)
Pro
Messaggi: 84
Iscritto: 22/03/2010
|
Postato originariamente da nessuno:
Non ho avuto il tempo di esaminare tutto il codice ma l'errore avviene in questa riga
**(newv+j) = *(v+i); |
Grazie mille, ho capito l'errore! Si deve invece scrivere:
*(*newv+j) = *(v+i);
Grazie ancora, ciao!
P.S: Non mi ero accorto della tua aggiunta! Ciao Ultima modifica effettuata da bruno.demarini il 16/12/2014 alle 22:23 |
|