Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [C++] Problema strano su limite numeri

    Salve a tutti. Ho compilato questo piccolo programmino in C++ che espleta la funzione di Crivello di Eratostene, un processo per trovare numeri primi. Praticamente, si fa un array riempendolo tutto con un numero, poi si comincia da 2 e si cambia il numero all'indice dell'array che corrisponde a 2 e ai suoi multipli. Poi da 3 e così via finchè si tolgono tutti i multipli e i numeri primi che si trovano nell'array hanno un flag che identifica che quell'indice è un numero primo. Il mio problema sta nel fatto che nel definire il massimo numero da cui è formato l'array, il mio compilatore (Dev-cpp) lo compila ma poi dà errore sulla finestra exe, che va in crash. Posto il programma:

    #include <cstdlib>
    #include <iostream>
    #define MAXNUMERI 30
    #define NUMERO_PRIMO 1
    #define NUMERO_COMPOSTO 0
    using namespace std;

    int main()
    {
    int numero[MAXNUMERI];
    for (int i=1;i<=MAXNUMERI;i++)
    {
    numero[i]=NUMERO_PRIMO;
    }
    for (int c=2;c<=MAXNUMERI;c++)
    {
    if (numero[c]==NUMERO_PRIMO)
    {
    int i=c+c;
    do
    {
    numero[i]=NUMERO_COMPOSTO;
    i=i+c;
    }
    while (i<=MAXNUMERI);
    }
    }
    for (int i=1;i<=MAXNUMERI;i++)
    {
    if (numero[i]==NUMERO_PRIMO)
    {
    cout<<i<<endl;
    }
    }
    int a;
    cin>>a;
    return 0;
    }


    "numero" è l'array e MAXNUMERI è il valore che identifica il massimo numero di caselle dell'array. Come mai se metto più di "circa" 45 il programma si compila ma va in crash?? (Come vedere. nelle ultime 2 righe ho dichiarato una nuova variabile per leggerla, poiché altrimenti il programma si chiudeva subito senza presentare i risultati: perchè??).

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    intanto cambia i cicli che usi per scorrerre il vettore...si parte da 0 nn da 1!sn da cambiare soprattutto il primo e il terzo...

  3. #3
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    ecco cm va modificato il tuo codice e ti mostro anche l'utilità del tag CODE
    codice:
    #include <cstdlib>
    #include <iostream>
    #define MAXNUMERI 30
    #define NUMERO_PRIMO 1
    #define NUMERO_COMPOSTO 0
    using namespace std;
    
    int main()
    {
    int numero[MAXNUMERI];
    for (int i=0;i<MAXNUMERI;i++)
    {
    numero[i]=NUMERO_PRIMO;
    }
    for (int c=2;c<=MAXNUMERI;c++)
    {
    if (numero[c]==NUMERO_PRIMO)
    {
    int i=c+c;
    do
    {
    numero[i]=NUMERO_COMPOSTO;
    i=i+c;
    }
    while (i<=MAXNUMERI);
    }
    }
    for (int i=0;i<MAXNUMERI;i++)
    {
    if (numero[i]==NUMERO_PRIMO)
    {
    cout<<i<<endl;
    }
    }
    int a;
    cin>>a;
    return 0;
    }
    questo è l'output ke da:
    0
    1
    2
    3
    5
    7
    11
    13
    17
    19
    23
    29

  4. #4
    A parte il fatto che non serve partire da 0 visto che non mi importa come indagine sui numeri primi... comunque il fatto è che non hai risolto il mio problema. Nel sorgente che mi hai postato prova a mettere ad es. 45 e a compilarlo ed eseguirlo: vedrai che si blocca tutto!

  5. #5
    no invece serve partire da zero, primo perchè non capisco il motivo di sprecare una cella di memoria, secondo, perchè questo codice va in overflow:
    codice:
    for (int i=1; i <= MAXNUMERI; i++){
       
       numero[i]=NUMERO_PRIMO;
       
    }
    un po' di indentazione non guasterebbe.

  6. #6
    Dici un arithmetic overflow o uno static overflow?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Intende dire che non devi trattare l'elemento MAXNUMERI del vettore perche' questo non esiste e vai a scrivere oltre il limite del vettore stesso (con ovvio crash ...).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Ahhhh avete ragione non ci avevo pensato!! Sapete,sono abituato al TurboPascal in cui gli array partono da 1...

  9. #9
    Ok grazie per la notazione, ora ho cambiato tutto... Ma il problema non si risolve!! Adesso la finestra di esecuzione appare e scompare in un secondo... vi prego aiutatemi è importante!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Mostra nuovamente il codice corretto, con le indentazioni e utilizzando i tag CODE ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.