Newsgroup: it.comp.lang.c
Titolo: sommare elementi argv

Salve, stavo cercando di fare un programma che mi sommasse gli
elementi passati tramite argv:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
int sm;
	for (i=1;i<argc;i++)
		{
	sm += atoi(argv[i]);
		}
printf("> SOMMA = %d\n", sm);
}
il problema è che mi restituisce l' indirizzo di sm, ma se levo quel +
davanti, mi restituisce solo l' ultimo elemento che gli passo, dov' è
che sbaglio ?
grazie . . .

 int sm;
 int sm = 0;
M

 che sbaglio ?
Basta partire con sm azzerato!
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 wrote:

grazie, ma perchè succede questo ?
c' è perchè devo inizzializzare il valore 0 alla variabile sm ?

 il valore 0 alla variabile sm ?
Le variabili automatiche non vengono inizializzate ma mantengono il 
contenuto della memoria lasciato da un precedente uso.  Se non parti 
con un valore zero alla fine te lo ritrovi nella sommatoria che vuoi 
ottenere.
Una variabile statica, al contrario, viene inizializzata di default a 
zero.


   
Perche' e' una variabile 'automatica' , che ha visibilita' solo all' 
interno del blocco {}.
Nei sistemi normali viene allocata sullo stack e non viene 
esplicitamente inizializzata,
per cui il valore che contiene e' del tutto casuale: dipende da come è 
stata usata in precedenza
quell' area di memoria.
Il fatto che NON venga inizializzata è stabilito dalla standard e ha 
anche molto senso:
il C non esegue operazioni 'nascoste' e inoltre inizializzazioni non 
desiderate possono
partare via tempo ed essere initili.
Pensa a funzioni con molte variabili automatiche: tutte le volte che 
vengono chiamate
dovrebbero inizializzarle tutte quante, quando poi verranno sovrascritte 
da altri valori
e solo per avere un discutibile valore iniziale.
Diverso è il caso delle variabili STATICHE, ovvero con cope globale: queste
vengono (quasi (*) ) sempre inizializzate perche' questa operazione e' 
eseguita solo
una volta allo start-up del programma.
Cito dall standard C99:
If an object that has automatic storage duration is not initialized 
explicitly, its value is
indeterminate. If an object that has static storage duration is not 
initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) 
zero;
— if it is an aggregate, every member is initialized (recursively) 
according to these rules;
— if it is a union, the first named member is initialized (recursively) 
according to these
rules.
Ciao,
Brix
(*) In realta', in alcune particolari implementazioni per piccole CPU è 
possibile evitare
anche di inizializzare le variabili statiche: l'implementazione non è 
standard, ma privilegia
la velocita' di partenza del programma.

On 22 Mag, 14:35, brix99luftballons

ah qundi se avrei fatto cosi:
static int sm;
sarebbe andato bene comunque ?
ultima cosa, se invece dei numeri  volessi concatenare tutte le
stringhe passate da linea di comando tipo:
nome_programma  uno due tre
ecco, uno due tre, vorrei mettere tutta la stringa in una variabile da
ottenere  unoduetre, è possibile ?
se si come potrei fare ?
cmq. grazie ad entrabi per le spiegazioni :)

   
Certo che puoi ;-)
Ci sono molte soluzioni, senza toccare la memoria passata in ingresso
ti necessita di un buffer di grandezza adeguata a contenere tutte
le stringhe
Piu' o meno puoi fare cosi' , il codice e' 'as is' possono
esserci bachi ....
int main(....)
{
    size_t   maxLen;
    char*   pString;
    int      j;
    maxLen=0;
    for(j=1; j < argc; j++)
    {
         maxlen += strlen(argv[i] );
    }
    if(maxLen)
    {
       if(NULL ==( pString=malloc(maxLen+2)))
             return(EXIT_FAILURE);
       *pString=0;  /* stringa nulla */
        for (i=1;i<argc;i++){
            strcat(pString,argv[i]);
    }
    // Etc....
   return(0);
}

On 22 Mag, 16:03, brix99luftballons

non riesco a capire, mi da errore:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    size_t   maxLen;
    char*   pString;
    int      j;
    maxLen=0;
    for(j=1; j < argc; j++)
    {
         maxlen += strlen(argv[i]);
    }
    if(maxLen)
    {
       if(NULL ==( pString=malloc(maxLen+2)))
             return(EXIT_FAILURE);
       *pString=0;
        for (i=1;i<argc;i++){
            strcat(pString,argv[i]);
    }
	printf("%s\n",pString);
   return(0);
}
}
non ci ho capito nulla eh ?  eheh . . .
solo una domanda, perchè nella malloc fai: malloc(maxLen+2), invece di
allorare lo spazio occupato, cioè usando il sizeof  ?
thx, ciauz

 }
forse una graffa di troppo?
E.

 allorare lo spazio occupato, cioè usando il sizeof  ?
Perché sizeof ti da la dimensione di un elemento, ma qui ne devi 
allocare tanti: (maxLen+1)*sizeof(char). Ma sappiamo che sizeof(char) è 
sicuramente 1. Mi pare che maxLen+1 sia sufficiente, invece che 
maxLen+2. Un solo carattere in più per il terminatore di stringa.
E.

   
C'e' una graffa di troppo e  un for che usa una variabile<i> non definita:
basta usare j ;-)
Ti ho avvertito che l' esempio conteneva dei bachi e typos!
Il sizeof e' un operatore statico e agisce a compile time: non puo' essere
applicato ad oggetti con size dinamicamente definito come le stringhe
di ingresso ! Il +2 è una deformazione mentale, basta un +1  per il 
terminatore
di stringa...
brix

..poi c'e' un altro errore logico, ma te lo lascio trovare da solo ;-)
brix

 brix
niente non ci riesco:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    static size_t  maxLen;
    char          *pString;
    int            j, i;
for(j=1;j<argc;j++)
    {
         maxLen += strlen(argv[i]);
    }
if(maxLen)
    {
if(pString = (int *)malloc(maxLen + 1) == NULL){
return(EXIT_FAILURE);}
else{
pString=0;
for (i=1;i<argc;i++)
    {
          strcat(pString,argv[i]);
    }
	printf("%s\n",pString);
    }
    }
return(0);
}
penso di aver risolto l' errore logico giusto ?

Ma solo per stavolta!!!!
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    size_t   maxLen;
    char*   pString;
    int      j;
    maxLen=0;
    for(j=1; j < argc; j++)
    {
         maxLen += strlen(argv[j]);
    }
    if(maxLen)
    {
       if(NULL ==( pString=malloc(maxLen+2)))
             return(EXIT_FAILURE);
       *pString=0;
        for (j=1;j<argc;j++){
            strcat(pString,argv[j]);
        }       
        printf("%s\n",pString);
    }
 
    free(pString);
    return(0);
}

brix99luftballons ha scritto:

Sorry, Il free deve essere spostato , ovviamente....

On 23 Mag, 18:29, brix99luftballons

eeeeeh, vabbè  XDXDXD solo per stavolta   :D
vabbè mi salvo il source come studio  :D
grazie, ciauz ;)