Newsgroup: it.comp.lang.c++
Titolo: forse OT..!

Ciao a tutti.! ho poca esperienza in C/C++. Mi dite dov'è che sbaglio?
Grazie!
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
void inverso(char);
void main(){
     char str[20];
     cin >> str;
     inverso(str);
     }
void inverso(char *s){
     register int t;
     for(t=strlen(s)-1; t; --t) printf("%c", s[t]);
     }
In compil-time mi da due messaggi di errore:
Cannot convert 'char *' to 'char'.
Type mismatch in parameter 1 in call to 'inverso(char)'.
SALUTI

Prova a chiamare inverso(&str),
ciao :-)
Marco Zanon (
m.z...@usa.net
)
http://www.geocities.com/SiliconValley/Peaks/6455
(BUY CDS AT THE LOWEST PRICES through my site!!!
Zamorano fan page, free MIDI mailing list, Music db...)

void inverso(char *s){
Marco

      for(t=strlen(s)-1; t; --t) printf("%c", s[t]);
Il test deve essere per t >= 0 altrimenti salta il primo carattere della
stringa. Inoltre, perché mai utilizzare sia iostream che cstdio? Sarebbe
meglio che questa riga fosse riscritta così:
for(t=strlen(s)-1; t>=0; --t) cout << s[t];
EMG

 Prova a chiamare inverso(&str),
Spero sia uno scherzo...
EMG

     cin >> str;
*Pericolosissimo*: se su standard input c'e` una "parola"
di piu` di 19 caratteri (non 20, per lasciare spazio allo 0
di terminazione), questo puo` causare disastri.
Ti conviene programmare in C++, garantendo che il
tuo programma includa <string> e scrivendo:
void inverso(const std::string &s);    // passaggio per reference
int main()
{
    std::string str;
    std::cin >> str;
    inverso(str);
    return 0;
}
Naturalmente, a questo punto cambia anche la funzione:
void inverso(const std::string &s) {
    int t = s.length()-1;
    for(; t>0; --t)
        std::cout << s[t];
}
Puoi, volendo, omettere i vari std:: (che sono pero` una buona
abitudine da prendere, secondo me), in due modi diversi:
-- uno, ragionevolmente consigliato: all'inizio del tuo programma
    scrivi le dichiarazioni di using degli identificatori che desideri:
    using std::cin;
    using std::cout;
    using std::string
-- uno, sconsigliato: importa tutto il namespace std nel tuo:
    using namespace std;
In ambo i casi, puoi poi usare cin, cout, e string, senza dovere
usare ogni volta il prefisso "std::".
(Se il tuo compilatore e` molto arretrato rispetto allo standard,
e non supporta i namespace, dovrai certo omettere lo std::
per farlo contento:-).
Alex


Saluti :-)


 sfuggita, ma in quello che ho scritto dov'è l'errore?
Se la funzione inverso fosse stata dichiarata
void inverso( char * );
allora la chiamata corretta sarebbe stata
inverso( str );
Chiamando con
inverso( &str );
ci sarebbe stato un mismatch di tipo in quanto il tipo di &str è char
(*) [20], cioè un puntatore ad un array di venti caratteri, mentre la
funzione si aspetta un char *.
EMG


Questo è vero (cavoli, un'altra roba che mi era sfuggita :-((), ma non è che
dovrebbe dare comunque un errore dello stesso tipo? In fin dei conti,
inverso si aspetta char* e riceve char[20]! Oppure è una conversione che fa
automaticamente il compilatore? Scusa, ma quando uso le stringhe mi appoggio
sempre a CString... ;-)
Ciao :-)


 Scusa, ma quando uso le stringhe mi appoggio sempre a CString... ;-)
E fai bene. Ma ancora meglio sarebbe utilizzare le string della libreria
standard del C++.
EMG

 wrote in message
36C3E92A...@flashnet.it...