Oppure

Loading
16/12/14 19:47
bruno.demarini
Ciao a tutti, ho questo frammento di codice:

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.
aaa
16/12/14 19:58
nessuno
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à.
16/12/14 20:00
bruno.demarini
Postato originariamente da nessuno:

Il problema non è in quella parte di codice ...

Mostra il resto


Posto l'intero codice:

#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 16/12/14 20:04
aaa
16/12/14 20:04
nessuno
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à.
16/12/14 20:33
nessuno
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à.
16/12/14 20:38
bruno.demarini
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 16/12/14 21:23
aaa