Autor Tema: Llamar a un array de punteros a caracteres en un bucle [C]. (lenguajec)  (Leído 5053 veces)

Pino1952

  • Sin experiencia
  • *
  • Mensajes: 21
    • Ver Perfil
Hola a todos.

Nuevamente por aquí, el enunciado del libro con el que estoy estudiando dice:

Citar
Escriba un programa que lea un carácter desde el teclado y que pruebe el carácter con cada una de las funciones de la biblioteca de manipulación de caracteres.


Como no quiero utilizar 20 if ni switch se me antojo hacerlo de esta manera, obviamente me da un error que no puedo solucionar, me podrían informar si esto es posible o si estoy proponiendo un disparate.-   
 
Código: [Seleccionar]
#include<stdio.h>
#include<string.h>

int main(int argc,char **argv){
char a, *funManCad[] = {"islower", "isupper", "isdigit"};
char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;

printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();
for(i=0; i<3; i++){
if(funManCad[i](a)){
printf("\n Ingreso %s", mensaje[i]);
}
}

printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
return 0;
}

A simple vista se nota que me faltan muchas funciones, pero esto es sólo para la consulta.-

Saludos.
Daniel
« Última modificación: 11 de Mayo 2015, 19:03 por Alex Rodríguez »
Abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Llamar a un array de punteros a caracteres en un bucle [C].
« Respuesta #1 en: 31 de Diciembre 2014, 11:06 »
Hola, la idea no parece mala pero tienes que tener en cuenta que el compilador tiene sus normas y que no puedes saltártelas aunque la idea sea buena.

La primera comprobación que he tratado de hacer es ejecutar algo como esto:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int main(int argc,char **argv){
char a, *funManCad[] = {"islower", "isupper", "isdigit"};
char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;

int resultado = 0;
for(i=0; i<3; i++){
            resultado = (funManCad[i])('h');
printf("\n El resultado obtenido es %d", resultado);

}

printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
return 0;
}

Si logras ejecutar algo así, luego puedes intentar lo otro. El error que me sale es error: called object 'funManCad[ i ]' is not a function

Es decir, que no te reconoce que porque recuperes una cadena con el nombre de la función eso sea una llamada a la función. El compilador hace un preprocesamiento en el que verifica que se usan identificadores válidos. Lo que tú intentas hacer funcionar como una función no es un identificador válido para el compilador y de ahí el fallo.

No obstante, esa misma idea existe en otros lenguajes de programación mediante sentencias que permiten dar lugar a "la ejecución" de una cadena de texto, pero en C desconozco que esto sea posible.

Lo que sí se me ocurre que podrías hacer es una función que reciba el caracter y devuelva un array con los resultados de aplicarle todas las funciones, aunque esto es complicarte ya que no lo pide el ejercicio...

Suerte!

Príncipe_Azul

  • Principiante
  • **
  • Mensajes: 71
    • Ver Perfil
    • Foro ArgentinaIRC - Ayuda de Programación General, IRC y mIRC Scripting!
Re:Llamar a un array de punteros a caracteres en un bucle [C].
« Respuesta #2 en: 31 de Diciembre 2014, 16:44 »
Hola, desde mi opinión, creo que no está mal tu planteo, es decir la forma en la que intentás llegar a ejecutar esas funciones, pero como bien te explicó Mastermind, primero todo pasa por el compilador.

Yo creo que lo mejor que puedes hacer, es usar condicionales if, esle if y else, por la simple razón de que C y C++ son los lenguajes más rápidos del mundo y los más utilizados, justamente porque son lenguajes compilados, de hecho muchísimas cosas (programas más exigentes) están hechas en C y C++.

Mirá te cuento algo Pino1952, el otro día quería hacer un programa, que en realidad ya lo hice y está terminado, este programa todavía no cuenta con la ventana, pero si con la consola en donde se muestran de que País es cada IP, es decir, lo que hace el programa que hice es decirte de que País probiene cada dirección de IP.

Las direcciones de IPs van guardadas en un archivo de texto y la base de datos en donde hago las comprobaciones, tambien es en formato .txt, si, es cierto que realmente no es una base de datos como sería si fuese en MySQL, pero bueno, de igual forma me sirve y ahí almaceno toda la información, es decir todos los rangos primarios y secundarios, osea desde donde comienza un rango y donde termina, eso sería para saber si la IP que checkea el programa, está en el rango de la línea en donde está buscando, si lo es, entónces ya encontró de que País viene esa IP.

Ahora, ¿que tiene que ver esto con tu pregunta/problema? Bueno, te lo explico para vos y para todos los demás.
Yo como necesitaba comparar que un X número esté en Rango entre X y Z, lo que yo hice, fué usar una función en Python, más especificamente la función range(), perooo que paso? ahh me dió error, porque? porque el número del primer rango de IP y el segundo que llevaba como parámetros esa función, me daba error el programa porque obviamente son números muy grandes que la función no se va la banca, entónces, busqué por Google y encontré "mi salvación" :D, que era otra función escrita en C, la misma es xrange(), bueeee hasta ahí todo de maravillas porque ya me funcionaba sin problemas las comprobaciones, pero...... luego que paso? ufff otro error más!! carajito dije yó! :S y ahora que pasó acá? bueno el tema era simple, cuando capturo el error, ví que también el problema era porque esos números que comparaba eran "demasiado largos" para una conversión a long en C, osea que la librería en C no podía pasar esos números a long en C, se entiende? es como que en intentés pasar a C un número muy largo a tipo long y te de error, bueno eso mismo.

Ahora, que hice? no me di por vencido, me puse a pensar y pensar hasta que dije, lo tengo! siiii! voy a probar esto!
Y pruebo ese método y siiiiiiii señor!!! funcionó perfectamente! osea ya podía comparar el rango de las IPs sin que el programa me lance el error, bueno, contento la verdad porque pude lograrlo, hoy hice una función con ese método y le puse un número bastante largo, pero largo realmente y funcionó perfectamente!!

Con respecto a tu código, está bien tu planteo, tu forma de querer llamar a esas funciones, pero las funciones seguramente son objetos, y vos lo que estás llamando son cadenas tipo string que por supuesto el compilador no te lo reconoce como una función válida.

Como dije, C es bastante rápido, no te hagas problemas por hacer 20, 1000 o 100000 if, else if's, el tema es llegar a lo que necesitás, si cláro que es bueno aprender a hacer cosas que no son habituales, como lo que trataste de hacer en tu código, es lo mismo que yo hice con mi programa, ni siquiera la función xrange() fué de ayuda ya que los números eran muy grandes.
Todo es cuestión de pensar e inventar cosas, obviamente mandate macanas que todos lo hacemos pero así vas a poder saber "porque falla" y "como resolverlo".

Espero que estas palabras te ayuden.

Por último quiero mostrarte estos 2 códigos que acabo de hacer en Python, veamoslo:

Código: [Seleccionar]
lista = "uno dos tres cuatro"

Contar = ".count(" ")"

print lista + Contar


raw_input()


Supuestamente ese código debería devolver:

3

y en ves de 3, devuelve:

uno dos tres cuatro.count()

Osea que no funciona... Ahora probemos así:

Código: [Seleccionar]
lista = "uno dos tres cuatro"

Contar = "count(" ")"

print lista. + Contar


raw_input()

y obtengo el siguiente error:

    print lista. + Contar
                     /\
SyntaxError: invalid syntax



Te mando 1 abrazo hermano, saludos y éxitos con tus códigos, seguí así inventando cosas que alguna vez vas a lograr algo innovador o alguna cosa que quizás muy pocos la saben, ¿porqué no?.

Saludos!
« Última modificación: 31 de Diciembre 2014, 17:09 por Principe_Azul »

Pino1952

  • Sin experiencia
  • *
  • Mensajes: 21
    • Ver Perfil
Re:Llamar a un array de punteros a caracteres en un bucle [C].
« Respuesta #3 en: 31 de Diciembre 2014, 18:49 »
Hola.
Muchas gracias a ambos dos por ocuparse del tema.-
Bueno a continuación dejo el código que como verán está basado en array de puntero a función, funciona óptima mente y es lo que pretendía lograr, si bien ya pase por puntero a función no lograba implementarlo y lo puse de esa manera (mi primer post de este tema) porque no sabía cómo mostrarlo con puntero a función, la idea rondaba mi subconsciente pero no lograba plasmarlo.-
Mastermind, entiendo perfectamente a que te refieres, pero los de capricornios somos así de obstinados y cuando una idea ronda nuestro bocho no respetamos demasiado las lógicas y además viene al caso aclarar que soy un apasionado del código conciso (utilizar la menor cantidad de líneas posibles), si bien no hace al código muy legible para otros es mi pasión y gracias a esta técnica aprendí muchas cosas (en los foros y buscando en la web) que de otra manera me hubiesen resultado esquivas.-
Principe_Azul, muchas gracias por tus consejos y por exponer tu experiencia, es muy reconfortante para gente como yo que está tan sólo estudiando encontrar este tipo de exposiciones, es como que se creara una pequeña amistad, en general la gente que responde en los foros es muy técnica y ni siquiera te saluda al despedirse, tal vez sea porque Uds. Tienen 20 años y yo pronto a cumplir los 63, no sé pero el saludo acerca a la gente.-               

Código: [Seleccionar]
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc,char **argv){
int (*pFun[3])(int) = {islower, isupper, isdigit};
char a, *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;
   
printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();

for(i=0; i<3; i++){
if(pFun[i](a)){
printf("\n Ingreso %s", mensaje[i]);
}   
}
 
printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
return 0;
}
/*
islower  -  Determina si el argumento es ua minuscula.
Devuelve un valor distinto de cero si es cierto. en otro caso devuelve 0
isupper  -  Determina si el argumento es una mayuscula.
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
isdigit  -  Determina si el numero es un digito decimal.
Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0
isalpha  -  Determina si el argumento es alfabetico.
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0.
isalnum  -  Determina si el argumento es alfanumerico.
Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0
isxdigit -  Determina si el argumento es un digito hexadecimal.
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
isspace  -  Determina si el argumento es un espacio en blanco.
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
('\f' - '\n' - '\r' - '\t' - '\v')
ispunct  -  Determina si el argumento es un caracter de puntuacion.
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0

isascii  -  Determina si el argumento es un caracter ASCII.
Devuelve un valor disitinto de cero si es cierto; en otro caso devuelve 0
isblank  -  Devuelve cierto si caracter es un espacio en blanco o un tabulador.
iscntrl  -  Determina si el argumento es un caracter ASCII de control.
- Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
isgraph  -  Determina si el argumento es un caracter ASCII grafico (hex 0x21 -0x7e; octal 041 -176).
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
isprint  -  Determina si el el argumento es un caracter ASCII imprimible (hex 0x20 -0x7e; octal 040 -176).
Devuelve un valor distinto de cero si es cierto; en otro caso devuelve 0
*/

Citar
Te mando 1 abrazo hermano, saludos y éxitos con tus códigos, seguí así inventando cosas que alguna vez vas a lograr algo innovador o alguna cosa que quizás muy pocos la saben, ¿porqué no?.
Muy pero muy reconfortante.-

saludos.
Daniel
Abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Príncipe_Azul

  • Principiante
  • **
  • Mensajes: 71
    • Ver Perfil
    • Foro ArgentinaIRC - Ayuda de Programación General, IRC y mIRC Scripting!
Re:Llamar a un array de punteros a caracteres en un bucle [C].
« Respuesta #4 en: 31 de Diciembre 2014, 22:29 »
De nada compañero, estamos todos para ayudarnos.
Quiero comentar, que un día llegué a este Foro mediante Google, y realmente me llamó bastante porque realmente me llamó bastante la atención de la educación que tienen los moderadores de este Foro, a pesar de yo ser Administrador de un Foro y a su vez de tener también la misma educación de todos ellos, sin embargo me sorprendí por la forma en la que saludaban tanto al principio de cada mensaje, como al final, cuando me registré en este Foro, lo primero que hice fué presentarme en el Foro correspondiente y comenté lo que ahora acabo de comentar, es más, hasta los felicité.

Y les dije que nunca olviden esa costumbre que tienen de saludar siempre, porque siempre veo el "Hola" y eso yo lo valoro bastante.
Yo he tenido problemas en varios Foros con Moderadores de los mismos por tener una forma de ser bastante desafiante, mala, egoista, y hasta te maltratan. Pero aún así yo no cambio mi forma de ser, yo nací como soy y me voy a ir de esta vida siendo como soy, hay gente que está en los Foros y por saber "demasiado", maltratan a los usuarios y nadie les dice nada (Los dueños de ese X Foro lo permiten), ni siqueira los Administradores, por la simple razón de que no quieren perder a un gran colaborador de su Foro.

Yo no soy así, yo siempre voy a mantener la ética y la buena conducta ya que eso es mi escencia, y si algún día tengo que correr a un moderador por abusar de su poder y/o maltratar a los usuarios y/o por creerse más que los demás, lo voy a hechar sin pensarlo y me importa muy poco lo que pueda llegar a saber y quien sea.

Volviendo al tema, ya imaginé que eras un hombre grande, te calculé más de 50 años, andube cerca y vos le pegaste más cerca todavía porque yo tengo 25 años y dentro de muy poco tendré 26.
Creo que la educación y el buen trato a los demás no es producto de la edad, yo conozco a niños de 5 años que están aprendiendo a decir malas palabras y tienen 5 años, como también conozco a gente muy mayor con un vocabulario bastante sorprendente (atrevido), como así también conozco a niños y ancianos que son muy educacos. La educación y el buen trato hacia las demás personas es por la formación y el aprendizaje que tubo esa persona en su vida y su desición para ser alguien de bien.

Y cláro que se puede llegar a hacer una amistad, más vale que si, yo siempre aspiro a eso.

Quiero comentar otra cosa, una vez mi mujer tenía una sala de chat en un servidor de chat que en ese momento, yo y mi mujer no teníamos nuestro propio chat, en ese chat en el que ella estaba, había un Moderador de ese Chat IRC que era bastante atrevido y ni te saludaba, es más, hasta te expulsaba para burlarse de vos y era un tipo desafiante, que si le contestabas algo, te expulsaba de toda la red entera.
Un día después de mucho tiempo que no entrabamos ahí a ese chat porque ya teníamos  nuestro propio chat y toda la gente de ahí nunca nos trató bien a nosotros y a los amigos de mi mujer, ese día que estaba aburrido, entré al Foro de ese servidor de chat y mirando por el Foro logro ver algo que me llamó la atención y lean esto!!!! Veo que el Dueño de ese chat había agradecido a esta persona que nos trató siempre mal, le estaba agradeciendo porque había hecho un aporte a su chat, osea al chat del dueño, este aporte era por supuesto dinero, osea que esta persona maltratadora estaba ayudándolo al dueño de ese chat con dinero y se sentía seguramente que también era de él, entónces si era así, no lo ayudaba, porque cláro es obvio, osea que el dueño permitía que esta persona maltrate a los demás porque le ayudaba a pagar su chat, sabiendo el dueño que esta persona maltraba a los usuarios y un día le dijo a mi mujer algo, después de que ella le reclamara de porque no hace algo al respecto con esa persona que maltrata y el le contestó: "algún día voy a hacer una limpieza de Staff"

ja ja ja ja ja y ja, ese chat cerró hace unos años, no existe más y jamás el dueño hizo esa limpieza de Staff como dijo.

En fin, un tema para hablarlo tomando mates, disculpen que me vaya del tema, es que hablo mucho.

Bueno con respecto a tu código, me parece fantástico que lo hayas logrado!!! te felicito y me alegro mucho que lo hayas podido lograr, eso te dá una satisfacción de superación a vos mismo y es realmente confortable.

Por otro lado, gracias por compartir el método que hiciste para lograr lo que pretendiste, gracias.

Citar
Muy pero muy reconfortante.-

Cláro que si, si estuvieses al lado mío, cláro que te doy un abrazo, yo soy un tipo muy amiguero!! :D :D

Te deseo un excelente resto del día mi estimado, buena suerte y cualquier cosita, lo que sea, me hablas por privado, que yo te ayudaré y/o al que quiera hablar conmigo, que me mande un MP.

Mis Saludos Y Deseos de Más Éxitos!!!
« Última modificación: 31 de Diciembre 2014, 22:40 por Principe_Azul »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".