Problema stampa con un doppio puntatore

di Anonimizzato8544 il
16 risposte
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

  • Non mi sembra che nella funzione

    minimo_massimo

    usi i parametri

    int **min,int **max
  • 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);
    
  • 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)
    
  • 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
        
    
  • 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
  • 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);
            }
        }
    }
    
    
  • Questa parte ora è corretta, manca il main
  • 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));
        
        
        
    
    }
    
    
  • 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)
    
  • Min e max sono i 2 puntatori che puntano sul minimo elemento e sul massimo con i rispettivi indirizzi
  • Allora, l'hai fatto o hai problemi/dubbi?
  • Nono ora funziona, mi devo esercitare meglio con i puntatori una volta li sapevo usare meglio xd
  • 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;
    }
    
  • 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