Newsgroup: it.comp.lang.c
Titolo: Problema stupido (funzioni)

ragazzi so che e' un porblema stupido ma e' da oggi che ci perdo tempo!
In poche parole devo passare un array di char da una funzione a un altra
come devo fare? 
Questo e' il codice:
#include <stdio.h>
void stampaintestazione(void);
int main()
{
        int i, j, lungarr;
        char c, stringa1[100], stringa2[100];
        stampaintestazione();
                for(i=0; (c=getchar()) != '\n'; i++) {
                stringa1[i] = c;
        }
        lungarr = i;
        for(i=0; i<lungarr; i++) {
            if (stringa1[i] == 97 || stringa1[i] == 101 || stringa1[i] ==
105 || stringa1[i] == 111 || stringa1[i] == 117) {
                stringa1[i] = stringa1[i] - 32;
            }
        }
 
        for(i=j=0; i<lungarr; i++) {
                if (stringa1[i] == 65 || stringa1[i] == 69 || stringa1[i] == 73 ||
stringa1[i] == 79 || stringa1[i] == 85) {
                stringa2[j] = stringa1[i];
                stringa2[j+1] = stringa1[i];
                j=j+2;
 
                } /* fine if */
 
                else {
                        stringa2[j] = stringa1[i];
                        j++;
                }       /* Fine else */
        } /* Fine for */
        printf("\nQuesta e' la stringa con le vocali doppie\n");
 
        for(i=0; i<=j; i++)
                printf("%c", stringa2[i]);
 
        printf("\n\n");
 
 
        return 0;
}
void stampaintestazione(void)
{
        printf("\nQuesto programma prende le vocali da una stringa, le raddoppia e
le rende maiuscuole se minuscole\n");
        printf("\nInserisci la frase e premi invio\n");
}
Saluti, 
Dario

                stringa1[i] = c;
p.s.: è il metodo sbagliato di leggere una stringa, anche perché non
imposti il terminatore nullo.  Usa fgets() invece.

 
il manuale ce l'ho, e' C Didattica e programmazione di Al Kelley e Ira Pohl,
che purtroppo, fa ca**re
Aveva gia' fatto entrambi i metodi che mi hai detto, ma non andava.
Evidentemente sbagliavo qualcosa.
Ciao e grazie

Evidentemente sbagliavo qualcosa.
Evidentemente sě, dubito che quel testo faccia esempi errati.

 Evidentemente sì, dubito che quel testo faccia esempi errati.
Semplicemente perche', all'universita', gira anche un'altro testo (scusa non
ricordo il titolo) con cui mi sono trovate sempre meglio.
Semplicemente perche', su un argomento complesso come gli alberi, dedica un
capitolo di poche pagine.
Potrei continuare, ma mi fermo qui

ricordo il titolo) con cui mi sono trovate sempre meglio.
Capisco, questione di gusti, però mi sarei aspettato una critica
tecnicamente più interessante.

 capitolo di poche pagine.
Se vuoi la mia opinione, posso dirmi d'accordo ma per il motivo opposto. 
Non ho letto il libro e pertanto il mio non è vero un gudizio sul libro 
ma semplicemente una conclusione tratta dalla tua osservazione.
L'argomento del libro è il linguaggio C. Il libro contiene un capitolo 
di poche pagine sugli alberi. La tua conclusione è che il libro fa 
cagare (perché per un argomento così complesso poche pagine non 
bastano). La mia conclusione è che il libro fa cagare (perché sugli 
alberi non dovrebbe contenere nemmeno una pagina).
Gli alberi sono un argomento per un testo di algoritmi e strutture dati. 
Non trovano posto in un testo sul C. A meno che la struttura albero (di 
cui si dia completamente per scontata la conoscenza a priori) non sia 
usata come esempio per illustrare qualche altro punto (per esempio l'uso 
dei puntatori nella costruzione di strutture linkate). Ma in tal caso 
non ci dedicherei un capitolo intero (per quanto breve).

 Questo e' il codice:
 > ....
Nel tuo codice non ci sono passaggi di parametri da una funzione ad 
un'altra. Potresti chiarire meglio? Cosa vuoi passare da quale funzione 
a quale funzione?
Remo D.

alberi non dovrebbe contenere nemmeno una pagina).
Entrambi fareste bene a rivedere i vostri giudizi.  Un libro non fa
"cagare" semplicemente perché dedica poche pagine ad un argomento o
perché, guarda caso, l'autore si prende la briga di trattare *ANCHE*
argomenti correlati di teoria dell'informazione.  Un libro sul C *PUO'
BENISSIMO* trattare degli alberi, come aggiunta agli argomenti
standard, illustrando come la loro teoria diventi pratica in
linguaggio C.  Scusate tanto se quell'autore vi sta aiutando a
comprendere meglio il linguaggio.

 comprendere meglio il linguaggio.
E ho anche scritto che trattare argomenti diversi da quello fondamentale 
è normale, sopratutto se utilizzati per illustrare come le 
caratteristiche di un linguaggio si utilizzano in situazioni specifiche.
Ho persino detto esplicitamente che non bisogna aspettarsi un 
trattamento completo di tali argomenti ma che, al contrario, la loro 
conoscenza dovrebbe essere apriori, proprio perché il "focus" del libro 
non è algoritmi e strutture dati ma piuttosto il linguaggio.
Ripeto: non critico ne il libro ne il suo autore (non posso: non l'ho 
letto). Ma critico la motivazione della critica mossa da Dario. Dire che 
un libro sul C fa cagare perché la trattazione degli alberi è scarsa è 
un assurdità. Potrebbe non trattarli per nulla ed essere un ottimo libro 
sul C. Semmai è possibile che il libro sia carente in direzione opposta: 
  se decide di trattare alcune strutture e/o alcuni algoritmi in via 
illustrativa allora dovrebbe rendere esplicito che non si ha a che fare 
con una trattazione completa ma semplcemte con una introduzione.
Non posso giudicare il testo. L'unico indizio in mio possesso è che 
contiene un capitolo dedicato agli alberi. Da un lato un intero capitolo 
mi pare tanto. Ma dipende da come è organizzato il libro (se ha decine 
di capitoli raggruppati in sezioni allora un breve capitolo è 
appropriato, una intera sezione sarebbe troppo. Se invece ha 7-10 
capitoli suddivisi in sottocapitoli, un intero capitolo sugli alberi è 
inappropriato per un testo sul C).

 Potrei continuare, ma mi fermo qui
Devo precisare il fatto che ci sono esempi dove usa typedef utilizzate
diverse pagine prima, e per andare a rivedere che cos'e' devi tornare
indietro anche di una decina di pagine?
Devo precisare che sullo stack dedica 1 pagina?
Che non c'e' assolutamente niente sui diagrammi di flusso? (ok, non e' una
cosa riguardante il c, ma IMHO una sezione che li spiega lo dovrebbe avere
ogni libro di programmazione)
Poi e' chiaro, quella e' una mia opinione detta mentra stavo leggermente
incazzato, io mi sto facendo il mazzo per imparare qualcosa, non ho ben
capito un argomento, ho chiesto spiegazioni per approfondire e mi si
risponde comprati un manuale...

Remo D. wrote:

Comevedi tutto il codice e' nel main.
Io volevo spezzettarlo il piu' possibile in funzioni, cosi che mi rivedo
bene il funzionamento delle stesse.
In particolare mi serve di passare un array da una funzione ad un altra.
Ora provo come mi ha detto andrea cmq

risponde comprati un manuale...
Certo e si fa bene a dirti comprati un manuale, proprio perché stai
imparando o forse credi che qui dentro, per il semplice fatto di
trattare un argomento come il C, ti debba essere insegnato
necessariamente il linguaggio ?

Andrea Laforgia wrote:

1) Semplice una volta che si conosce e' facile dirlo... 
2) Peccato che ci sono libri che ancora li trattano
3) Ma credi che uno che vuole imparare il c (o un qualsiasi linguaggio) non
stia gia facendo la sacrosanta pratica dell' RTFM? Ma, visto che una cosa
non mi e' chiara, questo mi sembrava il posto adatto a chiedere...Non ho
detto:"Ehi, insegnatemi il C" . Ho semplicemente chiesto un aiuto su un
determinato argomento. 
Ora, se vuoi continuare il flame fai pure, per me il discorso e' chiuso.
Regards,
Dario

stia gia facendo la sacrosanta pratica dell' RTFM? 
Non mi sembra, visto che sei qui a chiedere come passare un argomento
a una funzione, argomento che si trova in qualunque "fucking manual"
sul linguaggio.

Andrea Laforgia wrote:

Ti do ragione e la finiamo qua.
Ciao!

da intendere come critica al libro[...]
Se rileggo quello che hai scritto ci trovo della fuffa.
Giudicate i libri che parlano sul C quando sarete esperti
dell'argomento.

Ti do ragione e la finiamo qua.
D'altronde non puoi far altro...

Andrea Laforgia wrote:

Bene, d'altronde la ragione e' dei fessi...
-- 
Pgp key fingerprint:
7F69 35F3 64D4 C303 73DA  2212 28FC E5B2 B8AE B47A

 bene il funzionamento delle stesse.
Come dicevo qualche, parecchi, post fa il trucco sta nel pensare a cio' 
che accade in memoria.
Se hai:
char stringa1[100];
Immagina un blocchetto di memoria di 100 byte. L'indirizzo del primo è 
il valore di stringa1.
Quindi passare la stringa ad una funzione (ad es. funz(stringa1)) 
significa passargli l'indirizzo del blocchetto di memoria in cui la 
stringa è memorizzata.
Fin qui' la teoria. Prova a spezzare il tuo programma in funzioni e se 
non ti riesce domanda!
Remo D.

 Remo D.
Ti ringrazio molto della disponibilita', ora ti provo e ti faccio sapere ;)


Bene, d'altronde la ragione e' dei fessi...
Hai ragione.

il valore di stringa1.
Non è esattamente così.  Lo si è detto centinaia di volte: in C, il
nome di un array *DECADE* nel puntatore al primo elemento, *NON E'* il
puntatore al primo elemento.  Questo accade in tutti i casi, meno che
in tre circostanze specifiche.  Nel caso particolare delle funzioni,
poi, succede sempre che un array venga passato come puntatore al suo
primo elemento, sia che la dichiarazione del parametro formale sia di
un array, sia che sia di un puntatore (questo perché passando i dati
per uno stack, viene passata la copia dell'indirizzo e non l'intero
blocco di memoria).

 puntatore al primo elemento.
Lo so, infatti ho confessato il mio grave peccato nel post precedente. 
Espiero' il fio delle mie colpe nel girone dei programmatori Java ... :)
D'altra parte mi sembra chiaro che Dario ha dei dubbi di ben altro 
livello, cerchiamo di fargli superare quelli e poi gli complichiamo la 
vita a piacere!!!
Remo.


ROTFL
Ogni tanto sbandi di brutto. In tanti anni che ti conosco questo è e 
resta un tuo difetto.
Riguardo all'esperienza credo che 17 anni come professionista non siano 
proprio pochi (non conto la formazione, conto da quando ho aperto p.iva 
come sw developer in C e assembler. Il C++ è venuto, ovviamente, qualche 
anno dopo).

ROTFL
Hai poco da ridere AnalogFile e non sono affatto io a sbandare.
Riguardo gli anni che "mi conosci", ti ricordo che tu non mi conosci
affatto.  Non sto sbandando neanche in quest'occasione, in cui ti sto
ricordando che 17 anni da professionista (che non mi spaventano per
nulla) non sono affatto garanzia del fatto che tu conosca tanto il C,
da poterti ritenere un esperto.

vita a piacere!!!
Nessuno complica la vita a nessuno, se si limita a dire cose corrette.

 Smettila di battibeccare.  Quell'argomento è semplice in maniera
Cosi` ha parlato Andrea Laforgia ;-)
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

Andrea Laforgia wrote:

Quando qualcuno mi chiede cos'e' linux io potrei iniziare a parlare di open
source, di filesystem e/o kernel a rotta di collo (le prime tre cose che mi
sono venute in mente), ma prima dovrei spiegargli che cosa sono...
Con questo non dico che mi devi spiegare il c (cosa che neanche ti ho
chiesto) e' solo per farti capire che, anche se una cosa e' giusta, non e'
detto che sia di facile comprensione per tutti


 Giovanni
ROTFL... :D:D
Bellissima anche la firma!


 
Evidentemente sei nuovo del NG


 Giovanni
in effetti si...
perche'? ;)


 migliore dei modi.  
Ognuno ha il suo stile Andrea. Nel campo della programmazione (e forse 
non solo in quello) nessuno puo' *insegnare* qualcosa a qualcun'altro, 
al massimo possiamo aiutare gli altri ad imparare (da soli) quello che 
abbiamo imparato noi.
A Dario ho detto una cosa che, nel suo caso specifico, funzionava, con 
Runner sono stato piu' preciso perche' il suo problema lo richiedeva.
Dire tutto cio' che c'e' da dire in modo ultra-corretto ed 
ultra-lapidario non aggiunge nulla a cio' che si trova sui libri. Se 
qualcuno chiede č perchč vuole instaurare un dialogo e capire meglio.
Pensa se alle elementari spiegassero il volume dei solidi come 
l'integrale nello spazio di una funzione. Senz'altro piu' corretto ma 
incomprensibile.
Comunque, questo č il bello dei Newsgroup. Io ho offerto a Dario una 
spiegazione imprecisa ma funzionale ed intuitiva, tu puoi aggiungere le 
informazioni per rendere il tutto piu' corretto e lui puo' trarre 
vantaggio da tutte e due le spiegazioni.
Potenza della Rete!
Remo D.
P.S. Come ho detto all'inzio, ognuno ha il suo stile. Quanto ho detto 
sopra vale per me ed č il mio modo di frequentare il newsgroup, altri, 
come nel tuo caso, hanno una visione diversa perfettamente valida ed 
alla quale si attengono. Vive la diversité!

 Questo e' il codice:
Ecco la mia versione:
#include <stdio.h>
#include <string.h>
#define L 100
void stampaintestazione(void);
void touppervocals(char *b, int l);
void doublevocals( char *b1, char *b2, int len );
void stampaintestazione(void) {
	printf("Questo programma prende le vocali da una stringa, ");
	printf("le raddoppia e le rende maiuscuole se minuscole\n");
	printf("Inserisci la frase e premi invio\n");
}
void touppervocals(char *b, int l) {
	for (;l>=0;l--)
		if ( b[l]=='a' || b[l]=='e' || b[l]=='i'|| b[l]=='o' || b[l]=='u')
			b[l] &= 223;
}
void doublevocals( char *b1, char *b2, int len ) {
	int i,j;
	for (i=j=0; i<len; j++, i++ ) {
		if (b1[i]=='A' || b1[i]=='E' || b1[i]=='I' || b1[i]=='O' || b1[i]=='U')
		{
			b2[j] = b2[j+1] = b1[i];
			j++;
		}
		else b2[j] = b1[i];
	}
	b2[j]='\0';	/* NULL Terminated */
}
int main()
{
	int i, j, lungarr;
	char c, stringa1[L], stringa2[L*2];
	stampaintestazione();
	fgets( stringa1, L, stdin ); 	/* Salva anche '\n' e '\0' */
	lungarr = strlen( stringa1 );
 
	touppervocals( stringa1, lungarr );
	printf("Questa e' la stringa touppervocals():\n%s",stringa1);
	doublevocals( stringa1, stringa2, lungarr );
	printf("Questa e' la stringa con doublevocals():\n%s",stringa2);
	return 0;
}

 come devo fare? 
Ecco la 'mia' versione:
