Newsgroup: it.comp.lang.c
Titolo: dove ho sbagliato

Premetto che si compila ma mi da un errore CPU !!!
Non  mi è mai successo, che significa?
Comunque questo è il programma :
Letta in input una sequenza di interi positivi, memorizzarla in un array.
Eliminare dall'array tutti gli elementi multipli di 3.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define MAX_N 100
int leggi_array (int x[]) {
 int n, i;
   printf("Numero di elem : ");
   scanf("%d", &n);
   printf("Inserisci %d numeri interi positivi: ", n);
   for (i=0; i<=n; i++)
    scanf("%d", &x[i]);
   return(n);
}
void stampa_array (int x[], int n) {
 int i;
   for (i=0; i<n; i++)
   printf("La sequenza data in input e': %d  ", x[i]);
   return;
}
int main (void) {
 int i, j, n, v[MAX_N];
   for (i=0; i<n; i++)                     -> ho inizializzato tutto il
vettore a 1 che rappresenta il fatto che ancora non l'ho controllato
    v[i]=1;
   for (i=0; i<n; i++)
    if(v[i]){
   for (j = i+3; j<=n ; j+=3)
     v[j]=0;                                    -> pongo il vettore = 0 se è
un multiplo di 3
      }
   for (i=0; i<n; i++){
    if (v[i]!=0)                               -> se nel controllo appena
fatto risulta che v[i] è diverso da zero allora non è un multiplo di
       printf("%d   ",i);                         3 e lo posso stampare
         }
   getch();
   return(1);
}
Lo so forse è un ragionamento un po contorto ma a me è venuto questo !!!
:-)))))))
Grazie ancora Robby


Il programma non può funzionare per costituzione stessa. Infatti la
procedura stampa_array e la funzione leggi_array non vengono mai richiamate
all'interno di main(). In questo modo il programma generato dal compilatore
(e dal linker :) non ha neanche modo di chiedere all'utente di impostare i
valori da mettere dentro gli array! Suppongo che la versione "funzionante"
fosse qualcosa come:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define MAX_N 100
void stampa_array (int x[], int n); // Prototipo della funzione
int leggi_array (int x[])
{
 int n, i;
 printf("Numero di elem : ");
 scanf("%d", &n);
 printf("Inserisci %d numeri interi positivi: ", n);
 for (i=0; i<=n; i++)
  scanf("%d", &x[i]);
 stampa_array(x[], n);
 return(n);
}
void stampa_array (int x[], int n)
{
 int i;
 for (i=0; i<n; i++)
 printf("La sequenza data in input e': %d  ", x[i]);
 return;
}
int main (void)
{
 int i, j, n, v[MAX_N];
 leggi_array(v);
 for (i=0; i<n; i++)                    // -> ho inizializzato tutto il
//  vettore a 1 che rappresenta il fatto che ancora non l'ho controllato
  v[i]=1;
 for (i=0; i<n; i++)
  if(v[i])
  {
   for (j = i+3; j<=n ; j+=3)
    v[j]=0;                                  //  -> pongo il vettore = 0 se
è
//    un multiplo di 3
  }
  for (i=0; i<n; i++)
  {
   if (v[i]!=0) //                              -> se nel controllo appena
    // fatto risulta che v[i] è diverso da zero allora non è un multiplo di
    printf("%d   ",i);                       //  3 e lo posso stampare
  }
  getch();
  return(1);
}
In ogni caso c'è un grosso errore all'interno di un ciclo for (oltre che di
concezione per quanto riguarda l'impostazione delle routines).
for (i=0; i<n; i++)
    if(v[i])
    {
        for (j = i+3; j<=n ; j+=3)
            v[j]=0;                                  //  -> pongo il vettore
= 0 se è
                                                        //    un multiplo di
3
     }
Ogni volta che ti si presenta un nuovo elemento v[i] controlli se l'elemento
= 1, quindi apri nuovamente un ciclo for che effettua per ogni volta che
viene richiamato il controllo sull'intera porzione di memoria rimanente, non
curandosi di verificarne l'effettiva consistenza (aggiungendo +3 senza
eseguire un controllo puoi andare fino a 2 byte oltre l'array che hai
allocato). Credo che il problema principale sia dovuto al fatto che scrivi
in una zona di memoria non allocata, andando a sporcare un indirizzo
impiegato dal sistema operativo per chissà quale altri tipo di operazione, e
quindi crasha.
* Non vengono richiamate 2 procedure importanti
* L'accesso alla memoria viene eseguito in modo scoordinato, tutto viene
impostato ad 1, poi viene nuovamente riscritto...
In che modo viene impostato tutto ad 1 se poi nello stesso array ci
sovrascrivi gli elementi impostati dall'utente? Se lo fai dopo la verifica,
viene in ogni caso cancellato tutto, e se lo fai prima, viene tutto
impostato = 1. In questo modo il controllo
  if(v[i])
risulta vano.
In poche parole i problemi di questo programma sono tanti, e piuttosto che
venirne a galla ti consiglio di riscriverne uno nuovo, magari impiegando
qualche metodo diverso e meno cervellotico in modo da rendere il codice più
leggibile e lineare.
Anzichè eseguire un precalcolo per vedere quali elementi sono multipli di 3,
sporcando un buffer di memoria, puoi eseguire l'operazione just in time :)
Per vedere se un elemento è o no multiplo di 3 basta vedere se è per esso
divisibile.
Quindi
 if (v[i] % 3 < 0)
    v[i] = 0;
L'operazione % è l'operazione di modulo, esegue la divisione per 3, ma ne
riporta il resto anzichè il risultato. Se il resto è 0, allora è pienamente
divisibile, ed è quindi un suo multiplo.
Anche se ti consiglio di non utilizzare lo zero per contrassegnare nullo un
elemento, ma se si tratta solo di un esempio può anche andare bene.

... ti prego! chiamali array :)

 ha scritto nel messaggio
news:usSN6.2217$vD4....@news1.tin.it...
