Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    3

    [C] Eliminare elementi di una tabella

    In un programma che sto scrivendo in C ho una tabella di numeri interi chiamata "primi" che appunto contiene numeri primi. I numeri contenuti nella tabella sono 303 e per ogni coppia di numeri primi gemelli (numeri primi separati da due unità, ad esempio 5 e 7) devo escludere il maggiore. Non conoscendo alcun modo per eliminare effettivamente gli elmenti di una tabella (ne esiste qualcuno?) ho pensato di settare l'elemento della tabella corrispondente al numero più grande a 0 e più avanti nel programma, dove devo utilizzare i numeri primi, con una funzione if prendo solo i numeri diversi da 0. Questa è la funzione che ho scritto:
    codice:
    void eliminagemelli(){
    for(w=0;w<=303;w++){
    if(primi[w+1]==primi[w]+2) primi[w+1]=0;
    }
    }
    Il programma viene compilato correttamente senza errori di sintassi, ma quando arriva all'esecuzione di questa funzione va in crash. Sono siuro che l'errore si trovi in queste linee di codice perchè escludendole il programma viene eseguito correttamente. Qualcuno può per favore dirmi dove sbaglio? Grazie

  2. #2
    Il problema fondamentale sta nella condizione del ciclo (w<=303); se il tuo array è di 303 elementi, gli indici vanno da 0 a 302; inoltre all'interno del ciclo tu anche a guardare w+1. Per questo motivo, il limite del tuo ciclo dovrà essere w<302.

    In ogni caso, normalmente quando si ha a che fare con gli array in C ci si porta dietro il puntatore all'array e il numero di elementi contenuti. Il modo "classico" per rimuovere degli elementi da un array C è esaminare l'array è spostare indietro gli elementi voluti in modo da sovrascrivere quelli indesiderati (normalmente si fa in una sola passata con un puntatore in lettura e uno in scrittura), e poi aggiustare la variabile che contiene le dimensioni dell'array di conseguenza.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    3
    Ho modificato la condizione del ciclo come da te indicato ma il programma cessa comunque di rispondere, ecco com'è il mio codice adesso
    codice:
    void eliminagemelli(){    //elimina il più grande tra tutte le coppie di primi gemelli presenti nella tabella "primi"     for(w=0;w<302;w++){                     if(primi[w+1]==primi[w]+2) primi[w+1]=0; //se primi[w+1]=primi[w]+2 ---> primi gemelli ---> tenere solo il più piccolo (primi[w]) ---> settare a 0 il più grande (primi[w+1])                                     
     }           
      }
    Potresti spiegarmi come far slittare gli elementi di un array? Se non è troppo più lungo/complicato rispetto a questo sistema ci provo.

    PS: Giusto per non escludere niente, questo è il codice che ho scritto per utilizzare tutti gli elementi della tabella tranne quelli con valore 0
    codice:
    for(z=0;z<=302;z++){  
                 
    n=primi[z];        
    if(n!=0){         
    istruzioni              
    }                     
    }
    Ho provato a modificare anche la condizione di questo ciclo in z<302 ma senza risultati...

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <stdio.h>
    
    int main() {
       int a[20], length = 20, i, *insert;
       for(i = 0; i < length; i++)
       	a[i] = i + 1;
       //stampa
       for(i = 0; i < length; i++)
       	printf("%d ", a[i]);
       printf("\n%d\n", length);
       //rimuovi multipli di 3
       for(insert = a, i = 0; i < length; i++)
          if(a[i]%3!=0) {
             (*insert) = a[i];
             insert++;
       	}
       length = insert - a;
       //stampa
       for(i = 0; i < length; i++)
       	printf("%d ", a[i]);
       printf("\n%d\n", length);
       return 0;
    }
    Un esempio della rimozione di elementi...
    Io ho tolto i multipli di 3 perchè non avevo voglia né di generare né di scrivere i numeri primi, ma il concetto è lo stesso, basta cambiare le clausole...

    In ogni caso, a parte l'identazione orribbile, nel tuo codice non sembrano esserci errori, pobrabilmente l'errore è nel codice di elaborazione che non ci hai mostrato...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Il ciclo classico di rimozione di oggetti è qualcosa di questo genere:
    codice:
    #define LEN=100;
    int w[LEN];
    int length=LEN;
    /* ... */
    int * readPtr, * writePtr;
    for(readPtr=writePtr=w; readPtr<w+LEN; ++readPtr)
    {
        if(*readPtr%2) /* tiene solo gli elementi dispari */
            *writePtr++=*readPtr;
    }
    length=writePtr-w;
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    3
    Grazie per le risposte e scusate per l'identazione: è il copia&incolla che mi ha sballato tutto... Adesso sono impegnato ma appena potrò (purtoppo può essere questione di ore come di giorni) proveò i metodi che mi avete suggerito e vi farò sapere i risultati. Buone vacanze.

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Concettualmente , i due codici sembrano molto simili

    Se mi permettete vorrei andare un attimo OT !?


    Questa istruzione

    *writePtr++=*readPtr;

    Come mai *writePtr++ incrementa il puntatore , e non il contenuto dell indice dell' array
    puntato !?
    Tecnologia

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    ++ ha precedenza più alta di * e quindi viene applicato per primo, inoltre, essendo posto dopo il nome della variabile che deve incrementare, prima viene utilizzato il valore nella variabile e poi viene incrementata quest'ultima!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    CIAO

    Grazie della risposta .
    Tecnologia

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 © 2025 vBulletin Solutions, Inc. All rights reserved.