PDA

Visualizza la versione completa : [C++] Problema puntatore


Salvy95
21-08-2010, 20:27
Salve, ho un problema con questo codice


#include <iostream> #define MAXCHAR 10 using namespace std; char* getChar(); main(){ char* y; y=getChar(); cout << *y <<" vale" <<y; system("\npause"); return 0; } char* getChar(){ int x=0; char* y=0; char c[MAXCHAR]; while( cin.get()!= EOF){ c[x]=cin.get(); x++; } y = &c[0]; return y; }

Ho paura che l'errore stia nel cout, cioè sbaglio qui
cout << *y <<" vale" <<y;
ma come dovrei fare?

Ippo343
21-08-2010, 20:55
Problema di che tipo?
Cosa vuoi fare?

Copia il codice e poi mettici intorno i tag code a mano, se no è illeggibile.

Salvy95
22-08-2010, 00:11
Si scusami hai ragione!


#include <iostream>
#define MAXCHAR 10
using namespace std;
char* getChar();
main(){
char* y;
y=getChar();
cout << *y <<" vale" <<y; //Ho paura che il problema sia qui
system("\npause");
return 0;
}


char* getChar(){
int x=0;
char* y=0;
char c[MAXCHAR];
while( cin.get()!= EOF){
c[x]=cin.get();
x++;
}
y = &c[0];
return y;
}

In pratica ho passato un array alla funzione utilizzando il puntatore, ma poi non riesco ad estrarre il contenuto della variabile a cui punta y (Il puntatore ritornato nella funzione getchar)

Scusate la niubbiaggine :(

shodan
22-08-2010, 10:11
L'array c viene distrutto quando la funzione getChar ritorna, quindi y conterrà spazzatura. Se vuoi avere valori validi devi passare c alla funzione.

Salvy95
22-08-2010, 20:58
Ma come si passa un array alla funzione?

simo_85
22-08-2010, 21:09
Ma come si passa un array alla funzione?
Per argomento..


/*dichiarazione funzione*/
void foo(char bar[])
{
...
}
int main()
{
char bar[N];
...
foo(bar);
...
}

kirakira93
23-08-2010, 11:07
ciao salvy ho messo a posto un po' il codice ecco qui
ricordati di mettere il '\0' finale alle stringhe


#include <iostream>
#define MAXCHAR 10

using namespace std;
char* getChar();

int main()
{
char* y;

y = getChar();
cout << "y = " << y; //Ho paura che il problema sia qui
cout << "\n";

system("pause"); // non si può fare system("\npause")...xD
return 0;
}


char * getChar()
{
int x=0;
static char c[MAXCHAR]; //dichiarando la variabile static lo stack relativo a getChar non viene distrutto
c[0] = '\0';
char buf;
for(int i = 0; i < MAXCHAR - 1/*il -1 c'è xkè serve lo spazio per il NULL*/; i++) //fa in modo che il max numero di caratteri inseriti sia MAXCHAR
{
buf = cin.get();
if (buf == '\n') //fino a che premi invio il ciclo continua
break;
c[x] = buf;
x++;
}
c[x] = '\0'; //va messo il '\0' a fine stringa se la crei te carattere per carattere
cout << "c = " << c << endl;
return c;
}

Salvy95
23-08-2010, 13:46
#include <iostream>
#define MAXCHAR 80
using namespace std;
char* funzione_inutile(int x,int y);
main(){
int x;
int y;
char* p;
cout << "Inserisci due numeri\n\n";
cin >> x>>y;
p=funzione_inutile(x,y);
cout << "\n\n" << (char) p[4] <<"\n\n";
system("pause");
return 0;
}

char* funzione_inutile(int x,int y){
static char c[MAXCHAR];
int i;
i=0;
cout << "\n\nx+y= " << x+y << "\n\n Adessi inserisci un carattere\n\n\n";
while(c[i]=getchar()!=EOF){
i++;
}
c[i]='\0';
return c;
}




Salve, ho modificato in questo modo.

Ho aggiunto static, ho ritornato c che poi ho recuperato con il puntatore nella main...
cosa sbaglio ancora?

PS: ho cambiato il nome della funzione e aggiunto un piccolo programma per le addizioni, non badateci xD

kirakira93
24-08-2010, 15:43
non ha molto senso quello che hai scritto....
1 perchè scrivi EOF??? come fai a inserire EOF da console (almeno io NON riesco...)
invece di EOF metti '\n' //invio e prima del ciclo while scrivi anche fflush(stdin)...così azzera lo stream di input.

2 perchè vuoi stampare a video (char) p[4]????????????????? non hai mai esplicitamente assegnato niente a p[4]! piuttosto stampa p senza il cast a char cout << p;

3 ultimo consiglio, nell while metti while ( (c[i]=getchar()) != '\n' ) con le parentesi pr evitare di confonderti con le regole di precedenza associatività



codice a posto:

[CODE]
#include <iostream>
#define MAXCHAR 80
using namespace std;
char* funzione_inutile(int x,int y);
main(){
int x;
int y;
char* p;
cout << "Inserisci due numeri\n\n";
cin >> x >> y;
p=funzione_inutile(x,y);
cout << "\n\n" << p <<"\n\n";
system("pause");
return 0;
}

char* funzione_inutile(int x,int y){
static char c[MAXCHAR];
int i;
i=0;
cout << "\n\nx+y= " << x+y << "\n\n Adessi inserisci un carattere\n\n\n";
fflush(stdin);
while((c[i]=getchar()) != '\n')
{
i++;
}
c[i]='\0';
return c;
}

[

kirakira93
24-08-2010, 15:44
non ha molto senso quello che hai scritto....
1 perchè scrivi EOF??? come fai a inserire EOF da console (almeno io NON riesco...)
invece di EOF metti '\n' //invio e prima del ciclo while scrivi anche fflush(stdin)...così azzera lo stream di input.

2 perchè vuoi stampare a video (char) p[4]????????????????? non hai mai esplicitamente assegnato niente a p[4]! piuttosto stampa p senza il cast a char cout << p;

3 ultimo consiglio, nell while metti while ( (c[i]=getchar()) != '\n' ) con le parentesi pr evitare di confonderti con le regole di precedenza associatività



codice a posto:



#include <iostream>
#define MAXCHAR 80
using namespace std;
char* funzione_inutile(int x,int y);
main(){
int x;
int y;
char* p;
cout << "Inserisci due numeri\n\n";
cin >> x >> y;
p=funzione_inutile(x,y);
cout << "\n\n" << p <<"\n\n";
system("pause");
return 0;
}

char* funzione_inutile(int x,int y){
static char c[MAXCHAR];
int i;
i=0;
cout << "\n\nx+y= " << x+y << "\n\n Adessi inserisci un carattere\n\n\n";
fflush(stdin);
while((c[i]=getchar()) != '\n')
{
i++;
}
c[i]='\0';
return c;
}

Loading