Error con funciones (Solucionado, gracias!)

Iniciado por Erres, 12 Octubre 2012, 06:12 AM

0 Miembros y 1 Visitante están viendo este tema.

Erres

Hola, hay un error en funciones y no logro encontrarlo, primero que nada quiero que sepan que soy nuevo en esto de usar funciones, siempre eh hecho completamente mi programa en main y ahora estoy empezando a usar funciones.

Este codigo si corre bien, pero a la hora de poner la opcion 1, entra a la funcion "encode" y en la funcion encode, se supone que debe de preguntar el texto que se va a codificar, pero en vez de preguntarlo se lo brinca completamente.

Cabe aclarar que si lo pongo todo en main y no uso las funciones, si hace lo que tiene que hacer, pero en algun lado me equivoque con las funciones y simplemente se salta todo.

agradezco mucho la ayuda! (:


#include "stdafx.h"
#include <iostream>
#include <iomanip>

void encode();
int op(int);

int main()
{
int opciones, resultado;

opciones = 0;
resultado = op(opciones);

switch(resultado)
{
case 1: encode();
break;
default: std::cout << "nada!";
}

system ("pause");
return 0;
}

int op(int opciones)
{
std::cout << "Select an option:\n1.Encode\n";
std::cin >> opciones;
system("cls");
return opciones;
}

void encode()
{
int counter = 0;
FILE * filePad;
int lengthText = 0;
char text[50000];

filePad = fopen("TextEncrypted.txt", "a+");
std::cout << "Text:\n";
std::cin.getline(text, 50000);
}
En lo que sea, pero el mejor.

The Swash

Hola,

El problema radica en tu prototipo de función, claramente no hay necesidad del parámetro opciones en la función "op". Además si tu vas a retornar un valor, claramente ocuparás una variable que lo almacene y no puedes ocupar aquella que pasaste como parámetro.

Código (cpp) [Seleccionar]
#include "stdafx.h"
#include <iostream>
#include <iomanip>

void encode();
int op();

int main()
{
int  resultado;

resultado = op();

switch(resultado)
{
case 1: encode();
break;
default: std::cout << "nada!";
}

system ("pause");
return 0;
}

int op()
{
       int opciones = 0;
std::cout << "Select an option:\n1.Encode\n";
std::cin >> opciones;
system("cls");
return opciones;
}

void encode()
{
int counter = 0;
FILE * filePad;
int lengthText = 0;
char text[50000];

filePad = fopen("TextEncrypted.txt", "a+");
std::cout << "Text:\n";
std::cin.getline(text, 50000);
}


Así debería de funcionarte, en cuanto al código que coloques utiliza la etiqueta geshi y no code.

Saludos.

do-while

#2
¡Buenas!

No tiene nada que ver con lo anterior. En este caso da lo mismo que declares una variable dentro de la funcion como si la pasas como parametro. Es cierto que al no pasar una referencia ni un puntero (si no has visto esto todavia ya lo haras), realmente no estas modificando el valor fuera de la funcion, pero tampoco intentas acceder  al dato leido a traves del parametro sino que directamente lees el dato devuelto por la funcion, asi no tienes mayor problema.

La cuestion es que dentro de la funcion lees un dato utilizando el operador >> sobre cin. Este operador, siempre deja al menos un salto de linea en la entrada (cuando terminas de introducir los datos y pulsas intro estas introduciendo el salto de linea). Entonces, cuando dentro de la funcion encode llegas a
Código (cpp) [Seleccionar]

std::cin.getline(text, 50000);

getline lee hasta que encuentra un salto de linea. El mismo salto de linea que se ha quedado antes al utilizar el operador >> con cin y por lo tanto no te da la opcion de leer el texto que quieras introducir.

Para evitar esto, despued de utilizar >> con cin, siempre tendras que terminar de leer la linea (que como habiamos dicho, terminara en salto de linea). Para esto, cuando utilices >> con cin acostumbrate siempre ha hacer lo siguiente:
Código (cpp) [Seleccionar]

cin >> un_dato; //leemos el dato

//si ya no tenemos que leer mas datos
while(cin.get() != '\n'); //leemos los caracteres que queden en la linea


Aqui no he tenido en cuenta que pueda aparecer un EOF, por lo que el codigo tampoco es completamente correcto, pero creo que es lo suficientemente claro para que veas como funciona.

Termina de leer la linea dentro de la funcion op, y ya veras como ahora si te pedira que introduzcas el texto que quieras.

¡Saludos!

PD: En C++ creo que se podia descartar el contenido del buffer de entrada con una sola llamada a una funcion, pero ahora no recuerdo cual era...

Si buscas en la referencia de cplusplus la clase istream (cin es un objeto de esta clase) te saldran todas las funciones miembro que tiene esta clase y ahi estara la funcion que te digo (tendras que combinar un par, creo)
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Erres

#3
muchas gracias por las respuestas The Swash y do-while, pero creo que no me supe explicar bien, ninguna de las 2 resolvio el problema que tengo aunque si me fueron de ayuda!

ya mejore lo de las funciones (: ya que es cierto que no ocupaba tenerla como parametro.

y el siguiente codigo si no me equivoco es solo para detener el programa hasta que des un enter.

Código (cpp) [Seleccionar]
while(cin.get() != '\n');
En lo que sea, pero el mejor.

Erres

#4
pero de todos modos no lee el caracter =s, si pongo ese codigo y luego le digo imprime el caracter, no imprime nada =s, ya que (si no me equivoco) no leeyo nada realmente.

modifique esto en la parte de mero abajo nadamas:

parte de mero abajo:
Código (cpp) [Seleccionar]


filePad = fopen("TextEncrypted.txt", "a+");
std::cout << "Text:\n";
std::cin.getline(text, 50000);
while(std::cin.get() != '\n');
std::cout << "nice!";

std::cout << text;




codigo completo:
Código (cpp) [Seleccionar]


#include "stdafx.h"
#include <iostream>
#include <iomanip>

void encode();
int op();

int main()
{
int  resultado;

resultado = op();

switch(resultado)
{
case 1: encode();
break;
default: std::cout << "nada!";
}

system ("pause");
return 0;
}

int op()
{
       int opciones = 0;
std::cout << "Select an option:\n1.Encode\n";
std::cin >> opciones;
system("cls");
return opciones;
}

void encode()
{
int counter = 0;
FILE * filePad;
int lengthText = 0;
char text[50000];

filePad = fopen("TextEncrypted.txt", "a+");
std::cout << "Text:\n";
std::cin.getline(text, 50000);
while(std::cin.get() != '\n');
std::cout << "nice!";

std::cout << text;
}

En lo que sea, pero el mejor.

Erres

ohh que pena, ya me funciono.

quedo asi:

   
Código (cpp) [Seleccionar]
filePad = fopen("TextEncrypted.txt", "a+");
while(std::cin.get() != '\n');
std::cout << "Text:\n";
std::cin.getline(text, 50000);


Gracias!
En lo que sea, pero el mejor.

do-while

#6
Por lo que veo no has leido bien la explicacion que te he dado. Tienes que terminar de leer la linea despues de cada cin >>, sino siempre te quedara el salto de linea.

Si, lo he releido y estaba bien explicado y con un ejemplo. Si preguntas, molestate en leer con atencion las respuestas.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Erres

Cita de: Erres en 12 Octubre 2012, 15:18 PM
muchas gracias por las respuestas The Swash y do-while, pero creo que no me supe explicar bien

perdon do-while, me referia a qe (yo) no supe explicar bien mi pregunta; y muchas gracias!, gracias a tu explicacion aprendi algo nuevo hoy y me quedo mas que claro.
En lo que sea, pero el mejor.