Newsgroup: it.comp.lang.c
Titolo: Tabelle programmi

Salve
Volevo sapere se c'e' un modo per conoscere le locazioni di memoria
utilizzate da un determinato programma nel sistema e ,nel caso ci sia una
sorta di tabella di corrispondenza da qualche parte nella memoria gestita
dal sistema operativo, come accedervi.
Grazie.

Salve,
Devo passare una variabile array a una funzione per inserire i valori
all'array
Cosa devo fare per passare la variabile alla funzione e ritrovarmi il
vettore con i nuovi valori anche nel main e non solo all'interno della
funzione?



 ha scritto nel messaggio
news:CocK7.2165$263....@news1.tin.it...


 ha scritto nel messaggio
news:_rcK7.2173$263....@news1.tin.it...

Se ad esempio hai un vettore di int:
int * f(int * arr) {
     // arr[i] equivale a *(arr + i*sizeof(int))
    arr[0]=1;
    arr[1]=2;
    return arr;
}
int main() {
    int vec[2];
    f(vec);  // in questo caso il nome dell'array decade al puntatore al suo
primo elemento.
    /* ... */
    return 0;
}
Ciao,
Cecco

 ha scritto nel messaggio
news:TobK7.128992$sq5.6...@news.infostrada.it...

Io non ne ho la piů pallida idea, ma credo che questo sia un problema legato
al OS in questione, e non tanto al C di per se.
Ciao,
Cecco




I vettori, in C, generalmente decadono nel puntatore al loro
primo elemento.
Questo significa che, se nel main() hai dichiarato un
vettore e vuoi valorizzarlo nella funzione, ti basta
definire qualcosa di simile a:
void myfunction(int vect[], int n)
{
     int i;     
     for (i = 0; i < n; i++)
     {
         vect[i] = i * 2;         
     }          
}
e chiamarla con:
int main()
{
    int myvect[5];
    myfunction(myvect, (sizeof myvect / sizeof myvect[0]));
    return 0;
}
Nota che, per i parametri formali delle funzioni, scrivere:
int vettore[]
o
int* vettore
e' esattamente la stessa cosa.
Questo e' il motivo per cui devi passare anche il numero di
elementi da valorizzare, perche', in quanto puntatore, la
variabile perde il riferimento su quanti sono gli elementi
contenuti nel vettore.
-- 
The Follet

 }
In teoria, da come è definita la funzione, potrei assegnare qualunque valore
ad n, e se passo un valore superiore alla dimensione di vect sono nei
casini. Non c'è nessun modo per ovviare al problema?
Cecco

casini. Non c'č nessun modo per ovviare al problema?
Non si puo' pretendere di avere la botte piena e la moglie
ubriaca ;)
Non esiste un modo di ovviare al problema se non quello di
passare quel parametro n in modo corretto.
Cioe', se la funzione e' scritta a quel modo, *bisogna*
passare il valore giusto.
Non e' possibile fare in modo che il compilatore ci entri
nel cervello e si renda conto se stiamo facendo bene o meno
;)
Per quanto una funzione possa essere sicura (vedi la nuova
snprintf()) si assume sempre che il numero massimo di dati
memorizzabili passato sia corretto.
Se uso una snprintf() passandole un n sbagliato, ho
annullato la sicurezza offertami dalla funzione.
L'alternativa (che non e' un'alternativa) e' quella di
passare il vettore racchiuso in una struttura, ma non ne
vale troppo la pena, innanzitutto per la scomodita' del
metodo e poi perche', comunque, nella struttura l'array va
dichiarato con una dimensione precisa.
Dimensione che, anziche' essere dichiarata, puo' essere
passata alla funzione.
Cioe', immagina il seguente codice (non compilato):
#define N  23
struct miastruct { int vett[N]; } ;
void myfunction( struct miastruct *ps )
{
     int i;
     for (i = 0; 
          i < sizeof ps->vett / sizeof ps->vett[0]; 
          i++)
     {
          ps->vett[i] = i * 2;
     }
}
A mio avviso, non e' affatto conveniente rispetto a:
#define N 23
void myfunction( int vett[], int n )
{
     int i;
     for (i = 0; i < N; i++)
     {
          vett[i] = i * 2;
     }     
}
invocata con:
myfunction(myvett, N);
-- 
The Follet

 ha scritto nel messaggio
news:uYcK7.2253$263....@news1.tin.it...


    scanf ("%lf",&dot);
Se puoi, evita di usare scanf(): non ha controlli su quanto
puo' scrivere nel buffer.  Una funzione migliore, anche se
un tantino piu' laboriosa, e' fgets().
Ti ho riscritto il programma, in una forma che a me sembra
piu' corretta:
<CODE>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define N 5
void get_vector(double v[N], int n);
double calc_product(double v1[N], double v2[N], int n);
int main()
{
    double v1[N], v2[N];
    int i;
    printf("inserisci il primo vettore (da v[0] a
v[%d]):\n", N-1);
    get_vector(v1, N);
    printf("inserisci il secondo vettore (da v[0] a
v[%d]):\n", N-1);
    get_vector(v2, N);
    printf("prodotto scalare: %5.2f\n\n", calc_product(v1,
v2, N));
    puts("premi INVIO per terminare...");
    getchar();
    return 0;
}
double get_double(void)
{
       char buffer[64];
       fgets(buffer, sizeof buffer, stdin);
       buffer[strlen(buffer)] = '\0';
       return atof(buffer);
}
void get_vector(double v[N], int n)
{
     int i;
     for (i = 0; i < n; i++)
     {
         printf("v[%d] = ", i);
         v[i] = get_double();
     }
}
double calc_product(double v1[N], double v2[N], int n)
{
     int i;
     double p = 0;
 
     for (i = 0; i < n; i++)
     {
         p += v1[i] * v2[i];
     }
     return p;
}
</CODE>
-- 
The Follet

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

        return atof(buffer);
Manca l'inclusione dell'header stdlib.h.
Cecco

       return atof(buffer);
Ha ragione lui, al posto di math.h devi includere stdlib.h.
-- 
The Follet

 Cecco

 l'array originale..o sbaglio?
Non sbagli, e sinceramente non mi era neanche passato per la testa di non
far ritornare nulla. Comunque, in genere, funzioni come questa ritornano il
puntatore all'elemento passato (pensa ad una funzione come strcat, o in
generale quelle di manipolazione di stringhe).
Ciao,
Cecco

       buffer[strlen(buffer)] = '\0';
_____________________^^^^
forse errore poichč qualcuno (K&R) dice a riguardo di fgets 
"inserisce nel vettore s ... che viene terminato con '\0' "
d'altra parte se fgets non inserisse il terminatore di stringa '\0'
strlen funzionerebbe? Avete fatto la prova con stringhe non terminate
cosa succede?
Mi piacerebbe trovare un testo che descriva le funzioni di libreria
dicendo in poche parole quali sono i dati in entrata, e i
corrispondenti dati in uscita, come il K&R ma con qualche esempio in
piů e qualche riga di descrizione in piů.
Ho inserito qualche controllo sull'input
______________________________
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define N 5
void get_vector(double v[N], int n);
double calc_product(double v1[N], double v2[N], int n);
int main()
{
    double v1[N], v2[N];
   printf("inserisci il primo vettore (da v[0] a v[%d]):\n", N-1);
    get_vector(v1, N);
    printf("inserisci il secondo vettore (da v[0] a v[%d]):\n", N-1);
    get_vector(v2, N);
    printf("prodotto scalare: %5.2f\n\n", calc_product(v1, v2, N));
    puts("premi INVIO per terminare...");
    getchar();
    return 0;
}
int get_double(double *u)
{     char buf[64];
      int led=0, led1=0, i, n;
      if((fgets(buf, sizeof buf, stdin)!=NULL))
       {n=strlen(buf);
        for(i=0;i<n;i++){/*controlla il vettore*/
                if(buf[i]=='.'&& led==0) led=1;
                else if(buf[i]=='.' && led==1) return 3;
                else if(isspace(buf[i]) && led1==0) led1=1;
                else if(!isspace(buf[i]) && led1==1) return 4;
                else if(!isdigit(buf[i]) && buf[i]!='E' && buf[i]!='e'
         && buf[i]!='+' && buf[i]!='-' && !isspace(buf[i])) return 5;
                              }
        *u=atof(buf);
        if(errno!=ERANGE)return 0;
       }
      return 1;
}
void get_vector(double v[N], int n)
{
     int i;
     for (i = 0; i < n; i++)
     {
         printf("v[%d] = ", i);
         while(get_double(&v[i]) ){errno=0;
                          printf("\n Non ho capito il numero >");


"inserisce nel vettore s ... che viene terminato con '\0' "
In realta' andrebbe scritto buffer[strlen(buffer)-1] = '\0'.
Lo statement in questione, serve ad eliminare il carattere
'\n' che fgets() legge quando legge una stringa.


scusa non l'avevo capito,
ma '\n' non si trova in posizione strlen(buffer) [quindi giusto prima]
per quanto mi riguarda non ho tenuto in conto i possibili spazi
iniziali:
int get_double(double* u)
{     char buf[64];
      int led=0, led1=0, i=0, n;
      if((fgets(buf, sizeof buf, stdin)!=NULL))
       { n=strlen(buf);
         while(isspace(buf[i])) i++;
         for(;i<n;i++)       /*controlla il vettore*/


ma '\n' non si trova in posizione strlen(buffer) [quindi giusto prima]
Infatti ho detto che va scritto strlen(buffer)-1.