PDA

Visualizza la versione completa : [C]Dare in pasto ad una funzione un array di caratteri


Fix87
23-05-2012, 22:47
Salve ragazzi,
ho un problemone abbastanza comune tra neofiti credo, che però non riesco a risolvere.
Praticamente ho una funzione che mi converte in maiuscolo la prima lettera di una parola, se questa è minuscola, altrimenti la lascia inalterata.


void convertiMaiuscola(char string[]){
int i, l;
l = strlen(string);
for(i=0; i<1; i++){
if(string[i]>=97&&string[i]<=122) //la prima lettera e' minuscola?
{
string[i] = string[i]-32; //si lo e', fa questo
}
else{
printf("\nLa lettera e' gia' maiuscola!\n");
}
}
printf("%s", string);
}


Se io voglio dargli in pasto una parola contenuta in un array "char nome[15]" e fargli eseguire la funzione come mi devo comportare?
Dove poi andrò ad usare la funzione devo scrivere

convertiMaiuscola(nome)???

Scusate la domanda se banale

Who am I
23-05-2012, 23:31
Gli passi un puntatore:



void convertiMaiuscola(char* string)

Fix87
24-05-2012, 00:03
Cioè scusa non ho capito, io ho la mia funzione e per chiamarla con un array (ad esempio "nome") come devo fare?
Devo scrivere semplicemente

void convertiMaiuscola(char* cognome)

e la funzione mi parte e mie elabora la stringa cognome?

MItaly
24-05-2012, 00:06
Originariamente inviato da Fix87
Dove poi andrò ad usare la funzione devo scrivere

convertiMaiuscola(nome)
Esattamente. Quando tu passi un parametro ad una funzione, il corpo della funzione viene avviato con i suoi argomenti inizializzati con i parametri che gli passi.

Originariamente inviato da Who am I
Gli passi un puntatore:



void convertiMaiuscola(char* string)

In un argomento di funzione char* string e char string[] sono la stessa identica cosa.

Fix87
24-05-2012, 00:11
Esattamente. Quando tu passi un parametro ad una funzione, il corpo della funzione viene avviato con i suoi argomenti inizializzati con i parametri che gli passi.


Allora avevo capito il funzionamento, l'unico problema è che non mi funziona!

Praticamente quando vado a compilare mi da questo errore qua:

warning: conflicting types for 'convertiMaiuscola'
note: previous implicit decvlaration of 'convertiMaiuscola' was here

Cha diamine significa???? :dhò: :dhò: :dhò:

Fix87
24-05-2012, 00:17
Non ci posso credere, ho spostato la funzione prima del testo di dove poi verrà usata e ora funziona. Cioè se la scrivo dopo di quando la chiamo il compilatore non la vede??? :eek: :eek: :eek:

C'è un modo per far si che il compilatore vede le funzione anche alla fine del codice per esempio?

MItaly
24-05-2012, 00:21
In C è necessario dichiarare le funzioni prima di poterle utilizzare, mentre suppongo che tu abbia provato a chiamare convertiMaiuscola prima di averla definita:

Originariamente inviato da Fix87
warning: conflicting types for 'convertiMaiuscola'

vuol dire che "convertiMaiuscola" è stata dichiarata più volte, in maniera diversa, e

note: previous implicit declaration of 'convertiMaiuscola' was here
indica dove è stata dichiarata la prima volta; nello specifico, dice "implicit" declaration, ovvero ti indica che il compilatore ha visto che hai provato a chiamare convertiMaiuscola prima che fosse dichiarata, e si è "inventato" una dichiarazione che però non si è visto confermare al momento della definizione della funzione.

In sostanza quindi quello che devi fare è:
- spostare il corpo della funzione convertiMaiuscola prima di ogni suo utilizzo; questo costituisce contemporaneamente la dichiarazione (dico che esiste e che ha certi parametri) e la definizione (dico cosa fa) della funzione; da lì in poi il compilatore avrà presente la funzione e la potrai richiamare tranquillamente;
- oppure, lasciare il corpo della funzione (la sua definizione) dove ti pare, ma mettere prima di qualunque suo utilizzo il suo prototipo (la sua dichiarazione), che consiste semplicemente nella linea in cui specifichi, nome, tipo restituito e argomenti della funzione seguito da un punto e virgola; in questa maniera da lì in poi il compilatore avrà presente che quella funzione esiste e prende quei parametri (per cui sa come interpretare il tuo codice), e si preoccuperà solo in seguito di "agganciare" quelle chiamate a funzione al codice effettivo della funzione.

In genere si preferisce il secondo metodo: in cima al file (subito dopo i #include) o in un file di inclusione a parte si inseriscono tutti i prototipi delle funzioni definite nel file, in modo che siano "pronte all'uso" in ogni punto del file. Nel tuo caso quindi avrai:


#include <stdio.h>
/* ... altri file di inclusione ... */

/* prototipo di convertiMaiuscola */
void convertiMaiuscola(char* string);
/* ... eventuali altri prototipi ... */

int main(void)
{
char prova[]="prova";
convertiMaiuscola(prova);
return 0;
}

/* definizione della funzione */
void convertiMaiuscola(char string[]){
int i, l;
l = strlen(string);
for(i=0; i<1; i++){
if(string[i]>=97&&string[i]<=122) //la prima lettera e' minuscola?
{
string[i] = string[i]-32; //si lo e', fa questo
}
else{
printf("\nLa lettera e' gia' maiuscola!\n");
}
}
printf("%s", string);
}


Tra parentesi, per verificare se una lettera è minuscola puoi usare la funzione islower() di <ctype.h>, e per convertirla in maiuscolo puoi usare la toupper().

Fix87
24-05-2012, 01:29
Ti ringrazio, sei stato davvero molto esaustivo. Sai siccome è un progetto vorrei crearlo io l'algoritmo se possibile, quindi cercando di evitare funzioni presenti in librerie. Quindi mi conviene creare un sorgente con esclusivamente le funzioni da me create e poi in ogni altro sorgente dove ce n'è bisogno richiamo il file delle funzioni e ci piazzo il prototipo ad inizio file della funzione specifica che mi interessa ;)
Mi piace fare le cose ordinate e precise ;)
Grazie mille ancora
Alla prossima :unz:

Loading