Problema stampa con un doppio puntatore

di il
16 risposte

Problema stampa con un doppio puntatore

Salve ragazzi ho fatto un programma che dato un vettore stampa sia il minimo elemento che il massimo e deve anche poter stampare gli indirizzi di locazione dei 2 elementi il problema è che funziona tutto ma quando provo a stampare i valori deferenziati dei puntatori mi da errore vi posto il sorgente


//stampa l'indirizzo dell'elemento più piccolo e quello più grande nell'array e stampa i rispettivi elementi
#include <stdio.h>
void acquis(int[],int);
void minimo_massimo(int[],int,int**,int**);

int main()
{
    int vet[10],size;
    int **min,**max;
    min=NULL,max=NULL;
    size=10;
    
    acquis(vet,size);
    minimo_massimo(vet,size,min,max);
    printf("minimo indirizzo: %p \n massimo indirizzo %p\n",&min,&max);
    printf("numero minimo: %d\n numero massimo: %d\n",**min,**max);//questa riga mi attiva il debugger e mi dice thread 1:EXC_BAD_ACCESS(CODE=1,ardress=0x0)
    
    
    

}


void acquis(int vet[],int size){
    int i;
    
    for(i=0;i<size;i++){
        printf("inserisci l'elemento\n");
        scanf("%d",&vet[i]);
    }



}


void  minimo_massimo(int vet[],int size,int **min,int **max)
{
    int num_minimo,num_massimo;
    int *iminimo=NULL,*imassimo;
    int i=0;
    iminimo=imassimo=&i;
    num_minimo=num_massimo=vet[0];
    for(i=0;i<size;i++)
    {
        if(*(vet+i)<num_minimo)
        {
            num_minimo=*(vet+i);
            *iminimo=*(vet+i);
        }
        
        if(*(vet+i)>num_massimo)
        {
            
        num_massimo=*(vet+i);
        *imassimo=*(vet+i);
        }
    }
}
sicuro sto sbagliando il modo di risalire al vero contenuto 2ºprintf del programma principale)

16 Risposte

  • Re: Problema stampa con un doppio puntatore

    Non mi sembra che nella funzione

    minimo_massimo

    usi i parametri

    int **min,int **max
  • Re: Problema stampa con un doppio puntatore

    L'ho corretto credo ma mi apre il debugger in un'altra parte del programma posto il codice :
    
    
    //stampa l'indirizzo dell'elemento più piccolo e quello più grande nell'array e stampa i rispettivi elementi
    #include <stdio.h>
    void acquis(int[],int);
    void minimo_massimo(int[],int,int**,int**);
    
    int main()
    {
        int vet[10],size;
        int **min,**max;
        
        size=10;
        min=max=NULL;
        acquis(vet,size);
        minimo_massimo(vet,size,min,max);
        printf("minimo indirizzo: %p \n massimo indirizzo %p\n",&min,&max);
    
        
        
        
    
    }
    
    
    void acquis(int vet[],int size){
        int i;
        
        for(i=0;i<size;i++){
            printf("inserisci l'elemento\n");
            scanf("%d",&vet[i]);
        }
    
    
    
    }
    
    
    void  minimo_massimo(int vet[],int size,int **min,int **max)
    {
        int num_minimo,num_massimo;
        
        int i=0;
       
        max=NULL;
        num_minimo=num_massimo=vet[0];
        for(i=0;i<size;i++)
        {
            if(*(vet+i)<num_minimo)
            {
                num_minimo=*(vet+i);
                *min=(vet+i);
            }
            
            if(*(vet+i)>num_massimo)
            {
                
            num_massimo=*(vet+i);
            *max=(vet+i);// errore: thread 1:EXC_BAD_ACCESS(code=1,address=0x0)
            }
        }
    }
    
    illuminatemi su questi puntatori! ah 1 altro errore strano se provo poi a stampare cosa effettivamente contiene mi dice che %d non può stamparli nella printf ho scritto:
    
    
    printf("minimo:%d,massimo:%d",**min,**max);
    
  • Re: Problema stampa con un doppio puntatore

    broke ha scritto:


    ...ho fatto un programma che dato un vettore stampa sia il minimo elemento che il massimo e deve anche poter stampare gli indirizzi di locazione dei 2 elementi...
    per cui abbiamo dei puntatori ad intero e dobbiamo passare l'indirizzo se non vogliamo avere una copia nella funzione
    
    int main ()
      ...
      int *min, *max;
      ...
      minimo_massimo (... &min, &max);
    
    
    ... minino_massimo (... int **min, int **max)
    {
      ...
    }
    
    Fai attenzione che questo è errato per ovvi motivi:
    
    void  minimo_massimo(int vet[],int size,int **min,int **max)
    {
      ...
      max=NULL; <<---- ??
      ...
    
    e una leggera imprecisione:
    
       ...
       num_minimo=num_massimo=vet[0];
          for(i=0;i<size;i++) <<----il primo elemento è già letto
       ...
    

    broke ha scritto:


    ah 1 altro errore strano se provo poi a stampare cosa effettivamente contiene mi dice che %d non può stamparli nella printf ho scritto:
    Non so a cosa ti riferisci, se intendi l'indirizzo lo stampi con %p
    
       "%p .... %d" --- >  (min_OR_max)   *(min_OR_max)
    
  • Re: Problema stampa con un doppio puntatore

    Nemmeno funziona mi sono sicuramente espresso male io,ti spiego con 1 esempio : ho 1 vettore con degli interi lo passo alla funzione che deve calcolare il minimo e il massimo e stampare gli indirizzi del minimo e del massimo e poi i contenuti di minimo e massimo quindi

    0x10000 3
    0X10001 4
    0x10010 0 // minimo deve stampare 0x10000 e successivamente 0
    0x10011 66
    0x10101 565 // massimo deve stampare 0x10101 e successivamente 565


    e ho provato con queste 2 printf:
    
    
       printf("minimo indirizzo: %p \n massimo indirizzo %p\n",&min,&max); // se tolgo gli & stampa 0x0 tutte e 2 le volte
        printf("minimo:%d\nmassimo:%d",*(min),*(max));// mi apre il debugger e mi da errore
        
    
  • Re: Problema stampa con un doppio puntatore

    broke31 ha scritto:


    nemmeno funziona mi sono sicuramente espresso male io,ti spiego con 1 esempio : ho 1 vettore con degli interi lo passo alla funzione che deve calcolare il minimo e il massimo e stampare gli indirizzi del minimo e del massimo e poi i contenuti di minimo e massimo quindi
    E' quello che ti ho mostrato, ma se sbagli pure a copiare siamo a posto...


    Non prendertela, non credo di aver detto una cavolata (se non per distrazione) e non farmi scrivere perché oggi non ne ho voglia
  • Re: Problema stampa con un doppio puntatore

    Non ci sto capendo più nulla dannati puntatori!!!! la copia mi sembra fatta bene
    
    
    
    void  minimo_massimo(int vet[],int size,int **min,int **max)
    {
        int num_minimo,num_massimo;
        
        int i=0;
       
     
        num_minimo=num_massimo=vet[0];
        for(i=1;i<size;i++)
        {
            if(*(vet+i)<num_minimo)
            {
                num_minimo=*(vet+i);
                *min=(vet+i);
            }
            
            if(*(vet+i)>num_massimo)
            {
                
            num_massimo=*(vet+i);
           *max=(vet+i);
            }
        }
    }
    
    
  • Re: Problema stampa con un doppio puntatore

    Questa parte ora è corretta, manca il main
  • Re: Problema stampa con un doppio puntatore

    Mo ti posto il main


    
    
    #include <stdio.h>
    void acquis(int[],int);
    void minimo_massimo(int[],int,int**,int**);
    
    int main()
    {
        int vet[10],size;
        int *min,*max;
        
        size=10;
        min=max=NULL;
        acquis(vet,size);
        minimo_massimo(vet,size,&min,&max);
        printf("minimo indirizzo: %p \n massimo indirizzo %p\n",&min,&max);
        printf("minimo:%d\nmassimo:%d",*(min),*(max));
        
        
        
    
    }
    
    
  • Re: Problema stampa con un doppio puntatore

    broke31 ha scritto:


    
    printf("minimo indirizzo: %p \n massimo indirizzo %p\n",&min,&max);
    
    
    printf("minimo indirizzo: %p \n massimo indirizzo %p\n",min,max);
    
    cosa sono min e max?

    edit:
    ecco il risultato di quello quello che hai scritto con una vista aggiuntiva del vettore:
    
    v[0]= 3 (0x7fff411de590)
    v[1]= 4 (0x7fff411de594)
    v[2]= 7 (0x7fff411de598)
    v[3]= 5 (0x7fff411de59c)
    v[4]= 3 (0x7fff411de5a0)
    v[5]= 2 (0x7fff411de5a4)
    v[6]= 1 (0x7fff411de5a8)
    v[7]= 3 (0x7fff411de5ac)
    v[8]= 4 (0x7fff411de5b0)
    v[9]= 0 (0x7fff411de5b4)
    v[10]= 3 (0x7fff411de5b8)
    v[11]=-1 (0x7fff411de5bc)
    v[12]= 4 (0x7fff411de5c0)
    
    min=-1 (0x7fff411de5bc)
    max= 7 (0x7fff411de598)
    
  • Re: Problema stampa con un doppio puntatore

    Min e max sono i 2 puntatori che puntano sul minimo elemento e sul massimo con i rispettivi indirizzi
  • Re: Problema stampa con un doppio puntatore

    Allora, l'hai fatto o hai problemi/dubbi?
  • Re: Problema stampa con un doppio puntatore

    Nono ora funziona, mi devo esercitare meglio con i puntatori una volta li sapevo usare meglio xd
  • Re: Problema stampa con un doppio puntatore

    broke31 ha scritto:


    nono ora funziona, mi devo esercitare meglio con i puntatori una volta li sapevo usare meglio xd
    Confondono anche i più esperti

    Comunque, giusto per stare in tema, la funzione l'avrei scritta così:
    
    int minimo_massimo(int *vet, int l, int **min, int **max)
    {
        if (!vet || l<1)
            return -1;
    
        for (*min=*max=vet;--l;)
        {
            *min=**min>vet[l]?vet+l:*min;
            *max=**max<vet[l]?vet+l:*max;
        }
        return 0;
    }
    
  • Re: Problema stampa con un doppio puntatore

    Eh il tuo metodo di programmare è anni luce davanti al mio ...xd non ho capito come fai a fermare il for se come condizione imponi --l però compilandolo funziona tutto i punti interrogativi sarebbero gli if giusto?
Devi accedere o registrarti per scrivere nel forum
16 risposte