Newsgroup: it.comp.lang.c
Titolo: Vettori

Come si inizializza un vettore [n] usando un ciclio "for" inserendovi
solo i numeri dispari?
(n non deve essere fisso ma deve essere dato da input)
Anna

 ha scritto nel messaggio
news:3ACADCF8...@tin.it...

int* a;
int i, k;
a = malloc(sizeof(int) * n);
for(i =1, k = 0; k < n; i += 2, k++)
  a[k] = i;

 ha scritto nel messaggio
news:3ACADCF8...@tin.it...


se utilizzi la malloc per la memoria dinamica ... devi fare pure il cast:
a = (int *)malloc(sizeof(int) * n);
altrimenti ti genera un errore per diverso tipo di puntatore!!!!


Sei sicuro di quello che dici?
A me pare che sia necessario solo in c++, oppure è i contrario?

sai che non lo di certo? Alcuni compilatori ti mandano a cagare se te lo
dimentichi, altri ti lasciano fare!! Cmq č buona regola mettere il cast,
visto che stai assegnando un   void*   ad un   int*!! Tanto male non gli fa,
calcoli non ne aggiunge ... e si č sicuri che la scrittura č giusta!!! Alla
fin fine il cast serve solo per non far incazzare il compilatore perché in
effetti ... un void* = int* ... il n° di byte č sempre quello di un
"puntatore"!!!

 un   void*   ad un   int*!! 
  Al contrario: nel C e` esiziale (inutile+pericoloso).
	Alla prossima,
		Marco

 A me pare che sia necessario solo in c++, oppure e` i contrario?
L'ISO C prevede che la conversione da un puntatore void ad un altro e
viceversa e` automatica ed implicita.
L'uso del cast in questo caso mascherebbe la mancata inclusione della
<stdlib.h>.
Per il C++ invece il cast e` necessario.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Runtime error 6D at f000:a12f : user incompetente


Non è vero. In C il cast non è necessario e anzi può essere deleterio
perché nasconde eventuali errori.
EMG

 altrimenti ti genera un errore per diverso tipo di puntatore!!!!
Quello avviene perche' non hai incluso stdlib.h. 
Bye,
 Emmanuele.
-- 
Emmanuele Bassi         |             [ 
http://digilander.iol.it/ebassi/
 ]
emmanue...@iol.it
  |
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

Grazie ai vostri suggrimenti sui vettori sono riuscita ad implementare il
programma che calcola i numeri primi con il metodo del "crivello di eratostene",
la logica c'è, ma commetto un errore di scrittura che mi pregiudica il buon
esito del programma potreste dirmi perchè non stampa il risultato da me
desiderato?
Pluto ha scritto:


 altrimenti ti genera un errore per diverso tipo di puntatore!!!!
Falso.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

se per caso non viene incluso lo stdlib.h, e viene compilato con il cast ...
alla fine il compilatore ti dovrebbe restituire errore perché malloc non è
stata definita da nessuna parte! En beh? Cmq non mi pare dannoso e inutile!

stata definita da nessuna parte! En beh? Cmq non mi pare dannoso e inutile!
In fase di compilazione il compilatore non e' alla ricerca di
"definizioni" per le funzioni, ma solo di dichiarazioni e se non ne
trova si fida del programmatore, assumendo una dichiarazione implicita
(con valore di ritorno "int").
Il cast E' DANNOSO in C (non in C++) e non va utilizzato.

 stata definita da nessuna parte! En beh? Cmq non mi pare dannoso e inutile!
E` inutile perche` non serve.
E` dannoso perche` in caso di dichiarazione implicita di una funzione il
compilatore assume che quella funzione ritorni un int ed accetti proprio
gli argomenti che gli hai passato.
quindi non otterresti alcun errore facendo
malloc("blablabla");
malloc(NULL,"aaaaaa",111);
malloc();
ecc...
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

 }
Il codice
 for(i=j;i<=n-1;i+=2) /* ????? */
        a[(j*i)-1]=0;
e' sbagliato. Infatti per n pari a 20 (es.) j pari a 3
e i pari a 11 (i soddisfa le condizioni del for) 
(j*i)-1 e' pari a 32: azzerare l'elemento 33 di un
vettore che ne ha solo 20 non e' una buona cosa :-)
E' gia' tanto che il programma non scoppi in fase di esecuzione,
ma provando e riprovando potresti essere fortunata :-)
Il difetto da te lamentato e' dovuto al fatto che il codice
   for(i=1;i<=n-1;i++)
      printf("%3d",a[i]);
non viene eseguito a causa di un else,
...
    else if((a[i]*a[i])<n)
    {
      // se viene eseguito questo codice
      j=a[i];
      for(i=j;i<=n-1;i+=2) /* ????? */
        a[(j*i)-1]=0;     
    }
    else for(i=1;i<=n-1;i++) // non viene eseguito questo
      printf("%3d",a[i]);
L'implementazione dell'algoritmo non mi sembra corretta,
la spiegazione spero di si. :-)))
C:\>iao Angelo
P.S.
Ma ti chiami Anna, Rocco o Mario :-)

 stata definita da nessuna parte! En beh? Cmq non mi pare dannoso e inutile!
E` inutile perche' la conversione e' implicita.
E` dannoso perche', non essendo definita malloc, il valore di ritorno
per default sara` un int.
Ergo, fidati: includ stdlib.h e non usare il cast.


 ha scritto nel
messaggio news:slrn9cppm7...@wolverine.lohacker.net...



No guarda che usare il cast in C e' proprio programmazione sporca.
Prendi questo esempio:
char * pippo;
*(long*)pippo = 0;
con cui io posso scrivere un numero maggiore di byte (4) rispetto alla reale
memoria puntata dall'oggetto pippo (1 byte).
Usando il cast in C dici al compilatore che quello che tu scrivi e' giusto,
vuol dire autorizzarsi a fare qualsiasi porcata.
Quando il cast non e' un obbligo, ed il compilatore puo' fare da solo le
dovute conversioni, non usarlo!
Ed il cast e' d'obbligo solo per i puntatori void *.
ciao
donCiccio.

Indi per cui ... buona regola fare le cose per bene!!!
Fare le cose per bene, in C, significa non utilizzare i cast quando
non ce n'e' bisogno e il cast sul valore di ritorno di malloc e' un
caso in cui non ce n'e' bisogno.
Il C e' un linguaggio abbastanza debole nel controllo di tipi
(contrariamente al C++, in cui si focalizza l'attenzione proprio sulla
correttezza dei tipi utilizzati) ed usare cast non necessari lo
indebolisce ancora di piu', mettendo il programmatore in possibili
situazioni dannose.
Addirittura, il cast e' una cosa consigliata sul K&R II, che e' stato
scritto quando lo standard non era ancora stato approvato e che e'
subito smentito dai suoi errata corrige :
"142: The remark about casting the return value of malloc ("the proper
method is to declare ... then explicitly coerce") needs to be
rewritten. The example is correct and works, but the advice is
debatable in the context of the 1988-1989 ANSI/ISO standards. It's not
necessary (given that coercion of void * to ALMOSTANYTYPE * is
automatic), and possibly harmful if malloc, or a proxy for it, fails
to be declared as returning void *. The explicit cast can cover up an
unintended error. On the other hand, pre-ANSI, the cast was necessary,
and it is in C++ also."
[
http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
]
Spero ti sia convinto, adesso.

Ed il cast e' d'obbligo solo per i puntatori void *.
No. 
E' cosi' in C++, non in C.
Ogni puntatore void in C viene convertito automaticamente in qualsiasi
altro puntatore.  E' proprio il caso del valore di ritorno di malloc
(che e' un void*) che non ha bisogno di cast.

 Indi per cui ... buona regola fare le cose per bene!!!
No, e` un metodo per fare le cose veramente male, pur facendole digerire
al compilatore.


 Ed il cast e' d'obbligo solo per i puntatori void *.
La conversione da void* e` implicita.
Consiglio di  andare su Google (
http://groups.google.com
)  e di leggersi
l'ampia letteratura  di articoli  di questo  newsgroup a  riguardo della
questione cast.


 ha scritto nel messaggio
news:3acde7ac...@news.libero.it...

Si certo, questo e' chiaro, almeno per me.
Io non parlavo dell'assegnamento tra puntatori, mi riferivo (come nel mio
esempio) all'uso del puntatore cioe' *ptr=
Aggiungo che un altro caso in cui e' necessario il cast e' nel passare i
parametri ad una funzione che accetta numero di parametri variabili.
Per tutti gli altri casi in C il cast e' solo potenzialmente fonte di
errori.
ciao
donCiccio

siamo in tre che usiamo la stessa mail e frequentiamo tutti la stessa università,
quindi chi si trova scrive.
Angelo Paolitto ha scritto:
