Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] ricerca un numero in un array con i puntatori

    Salve,
    da poco sto facendo i puntatori quindi non ho ancora molta pratica, ho fatto questo semplice programma di ricerca di un numero in un array di interi, se inserisco il numero 5 lo trova, ma non i primi due elementi dell'array, il compilatore non dà errori ma il programma non funziona come dovrebbe.

    Spero che qualcuno possa darmi una dritta.

    Questo è il codice che ho fatto per far pratica con i puntatori:


    #include<stdio.h>
    #define M 3

    int inserire_num(void);
    int *cerca_num(int , int *);

    main(){

    int a[M] = { 2, 3, 5 };
    int *p;
    int num;

    num = inserire_num();
    p = cerca_num(num, a);

    if(*p != 0 )
    printf("il numero cercato %d si trova nella sequenza.\n\n", *p);
    else
    printf("Il numero %d non si trova nella sequenza.\n\n", num);

    system("PAUSE");

    }
    int inserire_num(){
    int n;

    printf("Inserire un numero da cercare: ");
    scanf("%d", &n);

    return n;

    }
    int *cerca_num(int nn, int *ar){

    int *pA;
    int i;

    for(i = 0; i< M; i++){

    if(*(ar+i) == nn)
    pA = &nn;

    else
    pA = 0;

    }
    return pA;

    }

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Questo codice è quello corretto:

    codice:
    #include<stdio.h>
    #include <stdlib.h>
    #define M 3
    
    int inserire_num(void);
    int *cerca_num(int , int *);
    
    main(){
    
    int a[M] = { 2, 3, 5 };
    int *p;
    int num;
    
    num = inserire_num();
    p = cerca_num(num, a);
    
    if(p != 0 )
    printf("il numero cercato %d si trova nella sequenza.\n\n", *p);
    else
    printf("Il numero %d non si trova nella sequenza.\n\n", num);
    
    system("PAUSE");
    
    }
    int inserire_num(){
    int n;
    
    printf("Inserire un numero da cercare: ");
    scanf("%d", &n);
    
    return n;
    
    }
    int *cerca_num(int nn, int *ar){
    
    int *pA = 0;
    int i;
    
    for(i = 0; i< M; i++){
    
    	if(*(ar+i) == nn) {
    pA = &nn;
    break;
    	}
    }
    return pA;
    
    }
    L'errore principale era algoritmico non sui puntatori(poi c'era una svista sui puntatori sul tuo codice che ti spiego dopo), nel tuo algoritmo cerca num in pseudo_codice veniva questo:

    i è 0
    se in ar[i] c'è nn
    pA punterà a nn
    sennò pA punterà all'indirizzo 0
    i è 1
    se in ar[i] c'è nn
    pA punterà a nn
    sennò pA punterà all'indirizzo 0
    i è 2
    se in ar[i] c'è nn
    pA punterà a nn
    sennò pA punterà all'indirizzo 0

    Quindi il tuo è un ciclo che continua fino alla fine cmq, quindi se tu inserisci il 5 dopo non ha altri controlli da fare, che, se il numero è stato trovato prima, vanno a modificare pA; quindi lo trova. Se tu inserisci 2 alla prima iterazione pA punterà a nn, ma dopo il ciclo continua e darà il risultato del confronto col l'ultimo valore dell'array; per evitare questo ho dato a pA subito il valore flag(zero) e messo un break nel caso venga trovato il numero in modo da non confrontare con gli eventuali indici che avanzano.

    L'errore con puntatori è il seguente:

    tu dai a pA il seguente valore:

    pA = 0

    in questo modo non sarà il valore puntato da pA ad essere modificato, ma l'indirizzo a cui punta pA, infatti a debug viene lanciato un acces violation perchè tu fai il seguente controllo:

    if(*p != 0)

    ma in questo modo controlli la variabile puntata da pA, quindi dovevi assegnare 0 a *pA dereferendiando con *.

    Per capire bene il discorso, prova a fare questo:

    codice:
    ...
    int intero = 50;
    int* puntatore = &intero;
    printf("%x\n", puntatore);
    printf("%d\n", *puntatore);
    ...
    Con * dereferenzi il puntatore e quindi è come trattare la variabile puntata, scrivere *puntatore è come scrivere intero, scrivere puntatore invece è una variabile apparte che memorizza l'indirizzo di intero e quindi se gli dai il valore 0 cerca di modificare e leggere uno spazio di memoria inesistente o occupato.

    Spero di essere stato chiaro,

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Grazie mille per le spiegazioni, ineffetti non avevo considerato l'uscita forzata dal ciclo ^^' e purtroppo faccio ancora confusione con i puntatori ^_^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.