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

scusate ma sono alle prime armi e stò davvero scraniando xchè non riesco a
trovare un modo per:
1- definire in modo dinamico un array: da quello che ho letto però si può
definire un array solo in modo statico, ma dagli esempi inviati
dall'università nella funzione main del programma l'array non era definito
ma chiamava una procedura che ritornava la lunghezza dell'array, in modo
dinamico quindi. tutto ciò io l'ho anche provato sul computer di casa ma col
cazzo che funziona!!! Chi mi sa spiegare il perchè?
2- definire sempre in modo dinamico un array di caratteri però. mi spiego
meglio: io vorrei che si potesse creare un array di dimensioni indefinita,
chiamare una funzione che mi chieda di immettere una frase(1 stringa di
caratteri), che mi ritorni la lunghezza della stringa in modo da definire la
lunghezza dell'array e, come se non bastasse, mi memorizzi i vari caratteri
della stringa nell'array stesso.
CyberEko

 caratteri della stringa nell'array stesso.
  Se hai un buon manuale a portata di mano, esercitati con la funzione
di cui sopra e cerca informazioni su strlen(), tenendo presente che le
stringhe di caratteri, in C, contengono sempre un carattere aggiuntivo,
'\0', che ne segnala la fine.
	Alla prossima,
		Marco

	int my_vec=malloc(15*sizeof int);
                             ^^^^^^^^^^
sizeof( int ) 
-- 
Andrea Laforgia (ICQ# 87230455) ---------------------------
Non scrivetemi in privato, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

 Non scrivetemi in privato, se non richiesto espressamente.
  ROFL!
	Alla prossima,
		Marco

int my_vec=malloc(15*sizeof int);
In verità sarebbe:
int *my_vec = (int*) malloc(15*sizeof(int));
Domenico Barra

 sizeof( int )
Non va bene neanche cosě :-)
Per un singolo intero:
int *my_int = (int*)malloc(sizeof(int));
Per un array di 15 interi:
int *my_vec = (int*)malloc(15*sizeof(int));
Ciao
Domenico Barra

 > sizeof( int )
Si, però io non ho mai capito per quale motivo si chiama operatore
sizeof se poi si deve utilizzare come fosse una funzione.
EMG

On Fri, 01 Dec 2000 18:12:14 GMT, 
Domenico Barra (
dob...@iol.it
)
wrote:
| >int my_vec=malloc(15*sizeof int);
| 
| In verità sarebbe:
| int *my_vec = (int*) malloc(15*sizeof(int));
 Ma allora, 'sto cast ci va o no?
-- 
Emmanuele Bassi         |     [ 
http://digilander.iol.it/ebassi/linux/
 ]
   (Zefram)             |                     [ 
emmanue...@iol.it
 ]
                        |         WARNING: `From:' Email Address is FAKE
GnuPG Key Fingerprint: 9747 635E B95A B0B3 4370 1CAA CAF7 512B 945C A44C

 1- definire in modo dinamico un array: 
Ciao,
provo a rispondere anch'io.
La funzione per dimensionare un vettore (naturalmente al posto di int
si possono mettere altri tipi di variabile):
int *ivector(int nl,int nh)
{
 int *v;
 v=(int *) calloc((nh-nl+1),sizeof(int ));
 if (!v) error("allocazione fallita in ivector()");
  return v-nl;
}
Una matrice:
int **imatrix(int nrl,int nrh,int ncl,int nch)
{
 int i,**m;
 m=(int **) calloc((nrh-nrl+1),sizeof(int *));
 if (!m) error("allocazione fallita 1 in imatrix()");
  m -= nrl;
 for (i=nrl;i<=nrh;i++) {
  m[i]=(int *) calloc((nch-ncl+1),sizeof(int ));
  if (!m[i]) error("allocazione fallita 2 in imatrix()");
  m[i] -= ncl;
 }
 return m;
}
Per liberare la memoria:
void free_ivector(int *v,int nl,int nh)
{
 nh=nh;
 free((char *) (v+nl));
}
void free_imatrix(int **m,int nrl,int nrh, int ncl,int nch)
{
 int i;
 nch=nch;
 for(i=nrh;i>=nrl;i--) free((char *) (m[i]+ncl));
 free((char *) (m+nrl));
}
Naturalmente seguendo questo principio si possono si possono dimensionare
anche array a piu' di due dimensione.
Flavio

}
...
Ho gia' visto codice di questo tipo in circolazione, ma
a quanto ho capito dello standard C non e' codice C
portabile.
L'aritmetica dei puntatori non puo' essere usata per
puntare al di fuori di un array: in altre parole
  int v[10];
  int *p=v;  /* Punta al primo elemento dell'array */
  p--;       /* Esce dall'array - NON CONSENTITO - */
  p++;       /* Rientra - NON E' DETTO CHE FUNZIONI - */
Un puntatore puo' puntare ad un elemento di un array
o, al massimo, al "primo elemento successivo all'array"
ovvero nel caso precedente invece di p-- e' ad esempio
ammesso fare p+=10 (ma ovviamente non si puo' valutare
*p senza prima aver riportato p a puntare a uno degli
elementi dell'array).
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 Ma allora, 'sto cast ci va o no?
In C++ si (obbligatorio), in C no (non serve ed e' dannoso).



Caspita ma qui vedo un cast sulla malloc!

 Ma allora, 'sto cast ci va o no?
No.
EMG

 sizeof( int ) 
Sei sicuro che le parentesi siano necessarie? Non mi risulta...
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

 In C++ si (obbligatorio), in C no (non serve ed e' dannoso).
Già. Essendo abituato al C++ ho inserito il cast. Scusa, ma... perché
dannoso? Io direi solo "ridondante".
Ciao
Domenico

 caratteri della stringa nell'array stesso.
  Se hai un buon manuale a portata di mano, esercitati con la funzione
di cui sopra e cerca informazioni su strlen(), tenendo presente che le
stringhe di caratteri, in C, contengono sempre un carattere aggiuntivo,
'\0', che ne segnala la fine.
non ho un manuale vero e proprio ma solo il libro universitario e un po' di
fotocopie sul "linguaggio C"
grazie in anticipo
CyberEko
Alla prossima,
Marco


grazie in anticipo
CyberEko

   p++;       /* Rientra - NON E' DETTO CHE FUNZIONI - */
int v[10];
int *p=v[1];
p--;
questo e' lecito e consentito dallo standard?
ciao
Kronos
PS: a giorni mi arriva il K&R, poi la smetto di stressarvi :)
-- 
Home: 
http://kronoz.tsx.org
Il piu' bel momento dell'amore e' quando ci si illude che duri
per sempre; il piu' brutto, quando ci si accorge che dura
da troppo.

  ROFL!
Non capisco, onestamente, che cosa ci sia da ROFLare.
Se tu avessi il traffico di posta che ho io, mi capiresti ;)
-- 
Andrea Laforgia (ICQ# 87230455) ---------------------------
Non scrivetemi in privato, se non richiesto espressamente.


Sei sicuro che le parentesi siano necessarie? Non mi risulta...
Certo che si'.
Le parentesi sono necessarie per i tipi e superflue per i "rvalue".


int *my_vec = (int*)malloc(15*sizeof(int));
               ^^^^^^          ^^^^^^^^^^^    
               superfluo       equivalente


dannoso? Io direi solo "ridondante".
Dannoso, dannoso.
Rileggi i thread in cui si e' discusso sul perche'.


 Ma allora, 'sto cast ci va o no?
No.


sizeof se poi si deve utilizzare come fosse una funzione.
Non si deve utilizzare come se fosse una funzione.
Le parentesi, per sizeof, sono superflue, ma necessarie in caso di
tipi (e' un operatore, si', ma che agisce anche su tipi e non e' da
tutti gli operatori).


questo e' lecito e consentito dallo standard?
No. La forma corretta e' :
int v[10] ;
int *p = &v[1] ;
p-- ;


int *my_vec = (int*) malloc(15*sizeof(int));
               ^^^^^^
Non ci vuole.


                superfluo       equivalente
Ecco, adesso il tuo "superfluo" è posizionato su "vec = (i" ed "equivalente"
copre la parte "lloc(15*sizeof".
Forse dovresti adottare un altro metodo, questo può risultare ambiguo.
Scusa ancora per l'equivoco.
Domenico Barra

 Non ci vuole.
Che cosa, il cast o il segno '=' ? :-)
La notazione ^^^^^^ risulta un po' imprecisa, cambiala se puoi.
Ciao
Domenico Barra

 tutti gli operatori).
Continuo però a non capire il senso di questa differenza di trattamento
tra tipi e valori.
EMG

On Sun, 03 Dec 2000 08:28:04 GMT, 
Domenico Barra (
dob...@iol.it
)
wrote:
| > Non ci vuole.
| 
| Che cosa, il cast o il segno '=' ? :-)
| La notazione ^^^^^^ risulta un po' imprecisa, cambiala se puoi.
 La notazione  `^^^^^' e` precisa  se si  usa un font  non proporzionale
 (courier new). Saresti tu a dover cambiare il font... ;-)


  (courier new). Saresti tu a dover cambiare il font... ;-)
Mi hanno sempre insegnato che quando ci si vuole far capire da tutti si ha
l'obbligo di esprimersi in modo "portabile": se sto usando il font Times New
Roman per uno scopo ben preciso, e poi leggo una mail con la notazione
'^^^^^' mi risulta spontaneo leggere '^^^^^' lì dov'è; se invece si riporta
l'intera riga sbagliata e la sua correzione non c'è possibilità di equivoco.
Perché rendere system-dependent le cose? In questo caso lo trovo superfluo.
Domenico Barra

On Sun, 03 Dec 2000 22:19:18 GMT, 
Domenico Barra (
dob...@iol.it
)
wrote:
| >  La notazione `^^^^^' e` precisa se si usa un font non proporzionale
| >  (courier new). Saresti tu a dover cambiare il font... ;-)
|
| Mi hanno sempre  insegnato che quando ci si vuole  far capire da tutti
| si ha l'obbligo di esprimersi in modo "portabile":
 Appunto: ``portabile''.
 Cosa  che i  font  a  spaziatura fissa  sono,  al  contrario di  quelli
 a  spaziatura  proporzionale. E`  tutta  una questione  di  ``cosa  sia
 portabile e cosa no''.
| se sto usando il font Times New Roman per uno scopo ben preciso,
 Non lo metto in dubbio.
| e poi  leggo una mail  con la  notazione '^^^^^' mi  risulta spontaneo
| leggere '^^^^^' lì dov'è; se invece si riporta l'intera riga sbagliata
| e la sua correzione non c'è possibilità di equivoco.
 Per  questo  si  _consiglia_  di  usare un  font  a  spaziatura  fissa.
 Ovviamente,  chi  non  segue  il  consiglio, sa  a  cosa  va  incontro.
 Riportare tutta un  linea per correggerla e` uno spreco  di risorse, di
 spazio  sui  newsserver (se  tutti  facessimo  cosi`),  e di  tempo  di
 connessione.
| Perché rendere  system-dependent  le cose? In  questo  caso lo  trovo
| superfluo.
 Infatti,  in  questo  caso,  non e`  affatto  system-dependent. Io,  in
 console, non ho font a spaziatura proporzionale. Altri usano newsreader
 in console, o similari. E, per quanto  sembri strano, non sono loro che
 sbagliano.
 Ad ogni modo questa discussione e` Off-Topic, se vuoi continuare in
 privato, il mio indirizzo e` in signature.
 f/up to junk.


Forse dovresti adottare un altro metodo, questo puņ risultare ambiguo.
Ma per favore !
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

La notazione ^^^^^^ risulta un po' imprecisa, cambiala se puoi.
Cambia il TUO font !
Le news si leggono in font con spazio fisso.



Web Site: 
http://asterix75.capri.it
"Unix IS user friendly. It's just selective about who its friends are"

Sono recenti? Se mi dai qualche Subject faccio una ricerca su deja.
"Matrici" del 12/11/2000, avviato da Antonio Valente
(sono 34 messaggi, almeno, sul mio server).


 int *my_vec = (int*)malloc(15*sizeof(int));
  In realta` la sintassi indicata da Andrea e` quella giusta (mi sono
dimenticato le parentesi). Non c'e` effettiva necessita` di fare il
/casting/ tra puntatori: /void */ e` automaticamente convertito nel tipo
di puntatore della variabile di destinazione.
	Alla prossima,
		Marco

 Ma allora, 'sto cast ci va o no?
  No. 
	Alla prossima,
		Marco