[Tech] C che stress!!!!
Sergio Ballestrero
sballestrero@interfree.it
Mer 4 Apr 2001 01:03:30 CEST
La mia risposta e' lunga, ma in fondo c'e' una domanda !! non ho ancora
deciso il premio per chi mi risponde :-P
On Mon, 2 Apr 2001, Ombra Rossa wrote:
> Ciao a tutti, sono uno stress lo so'! Scusatemi.
> Sto' facendo un programmino per divertimento, quindi non e' nulla di
> urgente, avrei bisogno di poter dare ad un array di caratteri
> bi-dimensionale una grandezza arbitraria data dall'input dell'utente.
prima di tutto: per "array bidimensionale" intendi un array di array,
come dice il C, o una matrice, come dice il Fortran ?
> Avevo pensato ad una funzione, ma l'array non e' visibile dal corpo
> main del programma. Non so' se si puo' dichiarare una funzione che
> come renda un array.
> E' possibile?
Per valore, no. Per puntatore, si. Comunque non risolve il problema: non
puoi fare
char **pippo(int ni,int nj) {
char a[ni][nj];
return a;
}
array2.c: In function `pippo':
array2.c:6: warning: return from incompatible pointer type
array2.c:6: warning: function returns address of local variable
> Certo potrei dichiararlo nel main, ma poi come gli cambio gli indici?? Si
> puo' fare?
// array of arrays
#include <stdlib.h>
#include <stdio.h>
int main (int argc,char *argv[]) {
char **a;
int ni,nj,i,j;
if(argc<3) return 1;
ni=atoi(argv[1]);
nj=atoi(argv[2]);
// constructor
a=(char **)calloc(ni,sizeof(char *));
for(i=0;i<ni;i++) {
a[i]=(char*)calloc(nj,sizeof(char));
}
//user
for(i=0;i<ni;i++) {
for(j=0;j<nj;j++) {
a[i][j]='x';
printf("%i %i %p=%c\n",i,j,&(a[i][j]),a[i][j]);
}
}
//destructor
for(i=0;i<ni;i++) {
free(a[i]);
}
free(a);
return 0;
}
Vantaggi: accesso 'facile': a[i][j]
Svantaggi: complessa da inizializzare e da distruggere
non contigua in memoria
-------------------------------------------------
// matrix
#include <stdlib.h>
#include <stdio.h>
int main (int argc,char *argv[]) {
char *a;
int ni,nj,i,j;
if(argc<3) return 1;
ni=atoi(argv[1]);
nj=atoi(argv[2]);
//constructor
a=(char *)calloc(ni*nj,sizeof(char *));
//user
for(i=0;i<ni;i++) {
for(j=0;j<nj;j++) {
a[i*nj+j]='x';
printf("%i %i %p=%c\n",i,j,&(a[i*nj+j]),a[i*nj+j]);
}
}
//destructor
free(a);
return 0;
}
Vantaggi: facile da inizializzare e distruggere
contigua in memoria
compatibile Fortran
Svantaggi: accesso complesso: a[i*nj+j]
--------------------------------------
// Soluzione C:
int main (int argc,char *argv[]) {
int ni,nj;
if(argc<3) return 1;
ni=atoi(argv[1]);
nj=atoi(argv[2]);
{
char a[ni][nj];
int i,j;
/*user*/
for(i=0;i<ni;i++) {
for(j=0;j<nj;j++) {
a[i][j]='x';
printf("%i %i 0x%p=%c\n",i,j,&(a[i][j]),a[i][j]);
}
}
}
return 0;
}
Un compilatore moderno non dovrebbe protestare.
Svantaggio: alloca a sullo stack, che non e' infinito...
------------------------------------------
// Soluzione C++
#include <stdlib.h>
#include <stdio.h>
int main (int argc,char *argv[]) {
if(argc<3) return 1;
int ni=atoi(argv[1]);
int nj=atoi(argv[2]);
char a[ni][nj];
for(int i=0;i<ni;i++) {
for(int j=0;j<nj;j++) {
a[i][j]='x';
printf("%i %i %p=%c\n",i,j,&(a[i][j]),a[i][j]);
}
}
return 0;
}
Stesso svantaggio (stack), nessuna preoccupazione di "scope" della
variabile.
Facile, no ?
Ma ho un dubbio io, adesso: come cavolo passo a[][] ad una funzione,
senza forzare un cast a (char *) ??
Sergio
--
--------------------------------------------------------------------------
Things will get better despite Sergio Ballestrero
our efforts to improve them. S.Ballestrero@iname.com
-- Will Rogers
Maggiori informazioni sulla lista
flug-tech