Normas del foro
Bienvenido(a),
Visitante
. Favor de
ingresar
o
registrarse
.
¿Perdiste tu
email de activación?
- Diciembre 05, 2008, 05:54:11
Visita:
Articulos
-
Juegos Gratis
-
Da Foros
Comunidad Underground Hispana
|
Programacion
|
Programación
|
Carbide C/C#/C++
(Moderador:
Fashion
) | Tema:
-resuelto; palindromes, error facil de solucionar
0 Usuarios y 1 Visitante están viendo este tema.
« anterior
próximo »
Páginas:
[
1
]
Autor
Tema: -resuelto; palindromes, error facil de solucionar (Leído 470 veces)
lann
Habitual
Desconectado
Mensajes: 322
maamamma
-resuelto; palindromes, error facil de solucionar
«
en:
Febrero 06, 2008, 09:58:20 »
bien alguien puede hayar el problema con este codigo, no se pueden usar funciones de alguna otra libreria ( ni estandar ).
este es el code
Código:
char* getSToWork( char* oStr, int size )//get string to work
{
char SToWork[ size ];
int count = 0;
for( int i = 0; i < size; i++ )
{
if( (oStr[i] >= 'a') && (oStr[i] <= 'z') )
SToWork[ count++ ] = oStr[ i ];
else
if( (oStr[i] >= 'A') && (oStr[i] <= 'Z') )
SToWork[ count++ ] = oStr[ i ];
else
if( ( oStr[i] >= 0 ) && ( oStr[i] <= 9 ) )
SToWork[ count++ ] = oStr[ i ];
}
SToWork[ count ] = '\0';
return SToWork;
}
una string por ej. "Hola, como estas?!!"
debe regresar "Holacomoestas"
cual es el problemuto?
«
Última modificación: Marzo 30, 2008, 03:01:31 por lann
»
En línea
am
Ni0
Gran Colaborador
Desconectado
Mensajes: 1362
Ni0-inside the source code
Re: palindromes, error facil de solucionar
«
Respuesta #1 en:
Febrero 06, 2008, 10:22:48 »
a mi me dice:
[Warning] address of local variable `SToWork' returned
tenes que hacer a SToWork global, no la declares dentro de getSToWork, pero de esa forma no sabrias si es suficiente la cantidad de espacio que le diste, podrias hacer:
char *SToWork;
y dentro de getSToWork:
SToWork = (char*)malloc(size);
te quedaria asi el codigo:
Código:
char *SToWork;
char* getSToWork( char* oStr, int size )//get string to work
{
int count = 0;
SToWork = (char*)malloc(size);
for( int i = 0; i < size; i++ )
{
if( (oStr[i] >= 'a') && (oStr[i] <= 'z') )
SToWork[ count++ ] = oStr[ i ];
else
if( (oStr[i] >= 'A') && (oStr[i] <= 'Z') )
SToWork[ count++ ] = oStr[ i ];
else
if( ( oStr[i] >= 0 ) && ( oStr[i] <= 9 ) )
SToWork[ count++ ] = oStr[ i ];
}
SToWork[ count ] = '\0';
return SToWork;
}
pero tenes que incluir a stdlib, pero no se si se puede hacer eso xD; de ultima haces:
char SToWork[100];
y modificas el codigo, no usas la variable size, y en el for haces:
for( int i = 0; oStr
!= '\0'; i++ )
salu2!
En línea
Inside The Source Code
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
Linux Registred User #460377
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #2 en:
Febrero 06, 2008, 10:43:41 »
E incluido las libs para usar strlen, calloc y printf
cambie la notacion( me mola la hungara ) y en general cambie casi todo el code pero en sencia es el mismo y hace lo que quieres
.
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int IsAlphaNum( char cChar )
{
if ((cChar >= 'a' && cChar <= 'z') ||
(cChar >= 'A' && cChar <= 'Z') ||
(cChar >= '0' && cChar <= '9'))
return 1;
return 0;
}
char *getSToWork( const char* psStr, int iSize )
{
int iCount = 0, iPos = 0;
char *psRet = NULL;
if (!iSize)
return NULL;
psRet = calloc( iSize + 1, sizeof( char ));
for( ; iPos < iSize; ++iPos) {
if (!IsAlphaNum( psStr[iPos] ))
continue;
psRet[ iCount++ ] ^= psStr[ iPos ];
}
return psRet;
}
int main( void )
{
char *psStr = "Hola, como estas?!! 10";
printf("%s\n", getSToWork( psStr, strlen( psStr )));
return 0;
}
PD: Ups, casi me olvido tenias mal lo de comprobar si era numero ya que comprobaba si era un caracter en el rango de 0( byte nulo) a 9( no recuerdo que es ), y realmente tendria que ser de '0' a '9'. Si tienen tele hay se ven.
Att:
DarkIker
«
Última modificación: Febrero 06, 2008, 10:45:39 por DarkIker
»
En línea
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> Colombia Underground Team
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> My Blog
Anibal784
Miembro
Desconectado
Mensajes: 53
Re: palindromes, error facil de solucionar
«
Respuesta #3 en:
Febrero 07, 2008, 09:00:17 »
Creo que hacer:
Código:
char SToWork[ size ];
no está permitido. Segundo, lo que pedís de sin librerías, ni siquiera la estándar es medio complicado ya que no tenés forma de asignar memoria dinámicamente. Ahora volviendo al problema, se puede solucionar de varias formas, primero, podrías recibir la dirección de dónde querés que te deposite el resultado, o bien usar una variable
static
la cual retornarás, pero deberás tener cuidado de que cuando tomes el resultado, seas conciente de eso y lo copies a mano, lo de no permitir el uso de librerías me parece que podría deberse a, por ejemplo, que esté dentro de un fichero que no contenga includes.
Código:
void getSToWork( char* oStr, char *ret)//get string to work
{
/**
* Copia tu código aquí, éste es el que me gusta a mi, usa punteros
* y todo eso.
*/
for(; oStr != '\0'; oStr++ ) {
if((*oStr >= 'a' && oStr <= 'z') ||
(*oStr >= 'A' && oStr <= 'Z') ||
(*oStr >= '0' && oStr <= '9')){
*ret = *oStr;
ret++;
}
}
*ret = '\0';
}
Código:
/* O BIEN PODRÍAS SER ASÍ */
char* getSToWork( char* oStr)//get string to work
{
#define MUY_GRANDE 100
static char strRet[MUY_GRANDE];
char *aux;
/**
* Copia tu código aquí, éste es el que me gusta a mi, usa punteros
* y todo eso.
*/
for(aux=&strRet[0]; oStr != '\0'; oStr++ ) {
if((*oStr >= 'a' && oStr <= 'z') ||
(*oStr >= 'A' && oStr <= 'Z') ||
(*oStr >= '0' && oStr <= '9')){
*aux = *oStr;
aux++;
}
}
*aux = '\0';
return &strRet[0]; /* Recordar que es una variable estática y que la próxima llamada sobreescirbe, por lo tanto el llamador debería preocuparse de copiar el string retornado antes de continuar, o por lo menos antes de rellamar a ésta función */
}
A mi en particular me gusta más la primera, pero... queda en vos, por ejemplo si yo quiero llamar a ésta función desde un main podría hacer:
Código:
int main(int argc, char *argv[]){
char ret[10];
getSToWork("Hola mundo", ret);
/* En ret estaría la palabra "Holamundo" */
return 0;
}
En línea
"UNIX is simple. It just takes a genius to understand its simplicity."
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #4 en:
Febrero 07, 2008, 11:06:21 »
Esto se pone bueno comenzemos a destripar
:
Código:
for(; oStr != '\0'; oStr++ )
1. El uso de la negacion es muy bien visto en C ( en C++ no tanto.
2. oStr != '\0' no es valido ya comprobaria el valor del puntero no del contenido de la memoria, lo correcto es "*oStr != '\0'", si seguimos el punto 1 entonces seria "!(*oStr)".
3. El preincremento es mas rapido que el postincremento, por lo tanto tendriamos hasta el momento:
Código:
for( ; !(*oStr); ++oStr)
continuando, no puedes aumentar punteros fijos por que desafortunadamente estarias modificando la cadena "remota" asi que se perderian tantos los resultados en *ret como el source en *oStr, hay que declararlos constantes o usar variables que apunte a ellas(echale un ojo a los prototipos de la mayoria defunciones de <string.h> ).
Código:
void getSToWork( const char* oStr, const char *ret)
Lo que impedira modificar la drieccion del puntero pero si la posicion de memoria.
Me gusta la idea de iann de pasar el tamaño de la cadena, esto permite trabajar con bytes nulos y si que llega a ser util en muchos casos, y desamito totalmente la idea de usar variables static y el desuso de memoria dinamica, inclusive en mi code hay un fallo y es que deberia de comprobar si iSize es <= 0 y no solo si es igual a 0, recordemos que los numeros negativos cuando pasan a unsigned no quedan muy bonitos que digamos. Ya por ultimo y como para hacerla completa xD, queda el reclacar que el postincremento si sirve cuando se usa correctamente claro esta como por ejemplo aca:
Código:
*(aux++) = *oStr;
Salu2.
Si tiene tele hay se ven.
Att:
DarkIker
En línea
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> Colombia Underground Team
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> My Blog
Anibal784
Miembro
Desconectado
Mensajes: 53
Re: palindromes, error facil de solucionar
«
Respuesta #5 en:
Febrero 07, 2008, 11:33:15 »
Vamos por partes dijo Jack el destripador...
Citar
Esto se pone bueno comenzemos a destripar :
Código:
for(; oStr != '\0'; oStr++ )
1. El uso de la negacion es muy bien visto en C ( en C++ no tanto.
2. oStr != '\0' no es valido ya comprobaria el valor del puntero no del contenido de la memoria, lo correcto es "*oStr != '\0'", si seguimos el punto 1 entonces seria "!(*oStr)".
Es verdad, no me había dado cuenta un pequeño error lo comete cualquiera y no he compilado el código, debería de haber sido *oStr = '\0', también es cierto lo de post y pre incremento, pero y bueno en el apuro no lo hice con pre incremento...
Citar
continuando, no puedes aumentar punteros fijos por que desafortunadamente estarias modificando la cadena "remota" asi que se perderian tantos los resultados en *ret como el source en *oStr, hay que declararlos constantes o usar variables que apunte a ellas(echale un ojo a los prototipos de la mayoria defunciones de <string.h> ).
Lo poco que le dan bola a la potencia que tiene C, también es cierto eso que decís que la mayoría de las librerías en C, pero los punteros se pasan por
copia
y no por
referencia
, esto nos lleva a que si yo modifico el puntero no modifico la cadena, aunque podría llegar a darse un pequeño error en éste punto:
Código:
getSToWork("Hola mundo", ret);
perdón, no había interpretado bien lo que dijiste, si al primer parámetro (oStr) puede llegar a ser const, pero el seguno tiene que permitirme poder modificarlo, sino no se donde poner todo...
Citar
Me gusta la idea de iann de pasar el tamaño de la cadena, esto permite trabajar con bytes nulos y si que llega a ser util en muchos casos, y desamito totalmente la idea de usar variables static y el desuso de memoria dinamica, inclusive en mi code hay un fallo y es que deberia de comprobar si iSize es <= 0 y no solo si es igual a 0, recordemos que los numeros negativos cuando pasan a unsigned no quedan muy bonitos que digamos. Ya por ultimo y como para hacerla completa xD, queda el reclacar que el postincremento si sirve cuando se usa correctamente claro esta como por ejemplo aca:
A mi no me gusta el hecho de tener que pasar el tamaño de la cadena, aunque algunas veces es necesario, el problema viene dado por el hecho de que yo puedo pasarle una cadena cuya longitud es de 10 y como segundo parámetro un 25, adios al cajo, se pudre todo overflow y la re pu... que te re mil pu.. parió...
El problema de static es cierto, pero como bien dice iann es que no se pueden usar librerías, ni siquiera las estándar, ¿cómo pido memoria dinámica sin siquiera una librería?, entrá a meter código ensamblador, para buscar la forma de acceder a las rutinas que piden memoria al kernel y toda la bola.
Citar
Salu2.
Si tiene tele hay se ven.
Att: DarkIker
Si tengo tele, pero dudo verme por ahí...
En línea
"UNIX is simple. It just takes a genius to understand its simplicity."
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #6 en:
Febrero 07, 2008, 12:02:55 »
El caso hipotetico se situa en que tenes una apliocacion que usa sockets y ecibis informacion binaria que debes parsear, usarias strlen?, recv retorna el numero de bytes recibidos sin importar si hay o no nulos en la cadena, si es mejor en mi concepto, por optimizacio y seguridad pasar el tamaño a una funcion, ya que desde el punto que se invoca a la funcion se suele conocer el origen de la informacion y si es o no correcto el tamaño, mientras que en la funcion la unica posibilidad es usar strleny entonces si el buffer tiene como primer byte 0 y despues de ello la cadena que planeabamos recibir que pasa?. Referente a lo de las librerais creo que iannn desaprobaba mas bien el uso de "toupper", "isalpha", "isnum" y cualquier otra que le ayudara en el "diagnostico" de los bytes de la cadena, no croe que le disguste callo y si es asi entonces algo se improvisa. Hay nos olemos. Salu2.
Att:
DarkIker
En línea
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> Colombia Underground Team
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> My Blog
V4mp1r3
Recien Llegado
Desconectado
Mensajes: 12
<~ Rin ~> ~ <~ 吸血鬼 ~>
Re: palindromes, error facil de solucionar
«
Respuesta #7 en:
Febrero 08, 2008, 04:57:20 »
aver, que empieze el quoteo !
Cita de: lann en Febrero 06, 2008, 09:58:20
bien alguien puede hayar el problema con este codigo, no se pueden usar funciones de alguna otra libreria ( ni estandar ).
este es el code
Código:
char* getSToWork( char* oStr, int size )//get string to work
{
char SToWork[ size ];
int count = 0;
for( int i = 0; i < size; i++ )
{
if( (oStr[i] >= 'a') && (oStr[i] <= 'z') )
SToWork[ count++ ] = oStr[ i ];
else
if( (oStr[i] >= 'A') && (oStr[i] <= 'Z') )
SToWork[ count++ ] = oStr[ i ];
else
if( ( oStr[i] >= 0 ) && ( oStr[i] <= 9 ) )
SToWork[ count++ ] = oStr[ i ];
}
SToWork[ count ] = '\0';
return SToWork;
}
una string por ej. "Hola, como estas?!!"
debe regresar "Holacomoestas"
cual es el problemuto?
uh, empezemos, primero usa memoria dinamica asi retornas un puntero .. ^^
Cita de: Ni0 en Febrero 06, 2008, 10:22:48
a mi me dice:
[Warning] address of local variable `SToWork' returned
tenes que hacer a SToWork global, no la declares dentro de getSToWork, pero de esa forma no sabrias si es suficiente la cantidad de espacio que le diste, podrias hacer:
char *SToWork;
y dentro de getSToWork:
SToWork = (char*)malloc(size);
te quedaria asi el codigo:
Código:
char *SToWork;
char* getSToWork( char* oStr, int size )//get string to work
{
int count = 0;
SToWork = (char*)malloc(size);
for( int i = 0; i < size; i++ )
{
if( (oStr[i] >= 'a') && (oStr[i] <= 'z') )
SToWork[ count++ ] = oStr[ i ];
else
if( (oStr[i] >= 'A') && (oStr[i] <= 'Z') )
SToWork[ count++ ] = oStr[ i ];
else
if( ( oStr[i] >= 0 ) && ( oStr[i] <= 9 ) )
SToWork[ count++ ] = oStr[ i ];
}
SToWork[ count ] = '\0';
return SToWork;
}
pero tenes que incluir a stdlib, pero no se si se puede hacer eso xD; de ultima haces:
char SToWork[100];
y modificas el codigo, no usas la variable size, y en el for haces:
for( int i = 0; oStr
!= '\0'; i++ )
salu2!
yo cambiaria ese malloc() por un malloc propio,no olviden que
malloc puede dar null y el programa terminaria en segfault =P
se llama "controlar errores" xD
Código:
void* safe_malloc(size_t size){
void* ret = malloc(size);
if (ret==0){
#ifdef WINDOWS_LEAN_AND_MEAN
MessageBox(0,"Memoria Insuficiente ! \nAbortando ....","Critical Error", MB_OK | MB_ICONWARNING);
#else
fprintf(stderr,"Memoria Insuficiente ! \nAbortando ....");
#endif
abort(0);
}
return ret;
}
sigamos xD
Cita de: DarkIker en Febrero 06, 2008, 10:43:41
E incluido las libs para usar strlen, calloc y printf
cambie la notacion( me mola la hungara ) y en general cambie casi todo el code pero en sencia es el mismo y hace lo que quieres
.
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int IsAlphaNum( char cChar )
{
if ((cChar >= 'a' && cChar <= 'z') ||
(cChar >= 'A' && cChar <= 'Z') ||
(cChar >= '0' && cChar <= '9'))
return 1;
return 0;
}
char *getSToWork( const char* psStr, int iSize )
{
int iCount = 0, iPos = 0;
char *psRet = NULL;
if (!iSize)
return NULL;
psRet = calloc( iSize + 1, sizeof( char ));
for( ; iPos < iSize; ++iPos) {
if (!IsAlphaNum( psStr[iPos] ))
continue;
psRet[ iCount++ ] ^= psStr[ iPos ];
}
return psRet;
}
int main( void )
{
char *psStr = "Hola, como estas?!! 10";
printf("%s\n", getSToWork( psStr, strlen( psStr )));
return 0;
}
PD: Ups, casi me olvido tenias mal lo de comprobar si era numero ya que comprobaba si era un caracter en el rango de 0( byte nulo) a 9( no recuerdo que es ), y realmente tendria que ser de '0' a '9'. Si tienen tele hay se ven.
Att:
DarkIker
en ctypes esta la funcion isalpha =P
desaconsejo mucho el uso de NULL, usen 0
Cita de: Anibal784 en Febrero 07, 2008, 09:00:17
Creo que hacer:
Código:
char SToWork[ size ];
no está permitido. Segundo, lo que pedís de sin librerías, ni siquiera la estándar es medio complicado ya que no tenés forma de asignar memoria dinámicamente. Ahora volviendo al problema, se puede solucionar de varias formas, primero, podrías recibir la dirección de dónde querés que te deposite el resultado, o bien usar una variable
static
la cual retornarás, pero deberás tener cuidado de que cuando tomes el resultado, seas conciente de eso y lo copies a mano, lo de no permitir el uso de librerías me parece que podría deberse a, por ejemplo, que esté dentro de un fichero que no contenga includes.
Código:
void getSToWork( char* oStr, char *ret)//get string to work
{
/**
* Copia tu código aquí, éste es el que me gusta a mi, usa punteros
* y todo eso.
*/
for(; oStr != '\0'; oStr++ ) {
if((*oStr >= 'a' && oStr <= 'z') ||
(*oStr >= 'A' && oStr <= 'Z') ||
(*oStr >= '0' && oStr <= '9')){
*ret = *oStr;
ret++;
}
}
*ret = '\0';
}
Código:
/* O BIEN PODRÍAS SER ASÍ */
char* getSToWork( char* oStr)//get string to work
{
#define MUY_GRANDE 100
static char strRet[MUY_GRANDE];
char *aux;
/**
* Copia tu código aquí, éste es el que me gusta a mi, usa punteros
* y todo eso.
*/
for(aux=&strRet[0]; oStr != '\0'; oStr++ ) {
if((*oStr >= 'a' && oStr <= 'z') ||
(*oStr >= 'A' && oStr <= 'Z') ||
(*oStr >= '0' && oStr <= '9')){
*aux = *oStr;
aux++;
}
}
*aux = '\0';
return &strRet[0]; /* Recordar que es una variable estática y que la próxima llamada sobreescirbe, por lo tanto el llamador debería preocuparse de copiar el string retornado antes de continuar, o por lo menos antes de rellamar a ésta función */
}
A mi en particular me gusta más la primera, pero... queda en vos, por ejemplo si yo quiero llamar a ésta función desde un main podría hacer:
Código:
int main(int argc, char *argv[]){
char ret[10];
getSToWork("Hola mundo", ret);
/* En ret estaría la palabra "Holamundo" */
return 0;
}
gcc lo permite, el compiler del visual creo que no xD
y si, sin librerias, no se puede pedir mucho xD
otra cosa, complicas mucho, es facil con un puntero alcanza y sobra
Cita de: DarkIker en Febrero 07, 2008, 11:06:21
Esto se pone bueno comenzemos a destripar
:
Código:
for(; oStr != '\0'; oStr++ )
1. El uso de la negacion es muy bien visto en C ( en C++ no tanto.
2. oStr != '\0' no es valido ya comprobaria el valor del puntero no del contenido de la memoria, lo correcto es "*oStr != '\0'", si seguimos el punto 1 entonces seria "!(*oStr)".
3. El preincremento es mas rapido que el postincremento, por lo tanto tendriamos hasta el momento:
Código:
for( ; !(*oStr); ++oStr)
continuando, no puedes aumentar punteros fijos por que desafortunadamente estarias modificando la cadena "remota" asi que se perderian tantos los resultados en *ret como el source en *oStr, hay que declararlos constantes o usar variables que apunte a ellas(echale un ojo a los prototipos de la mayoria defunciones de <string.h> ).
Código:
void getSToWork( const char* oStr, const char *ret)
Lo que impedira modificar la drieccion del puntero pero si la posicion de memoria.
Me gusta la idea de iann de pasar el tamaño de la cadena, esto permite trabajar con bytes nulos y si que llega a ser util en muchos casos, y desamito totalmente la idea de usar variables static y el desuso de memoria dinamica, inclusive en mi code hay un fallo y es que deberia de comprobar si iSize es <= 0 y no solo si es igual a 0, recordemos que los numeros negativos cuando pasan a unsigned no quedan muy bonitos que digamos. Ya por ultimo y como para hacerla completa xD, queda el reclacar que el postincremento si sirve cuando se usa correctamente claro esta como por ejemplo aca:
Código:
*(aux++) = *oStr;
Salu2.
Si tiene tele hay se ven.
Att:
DarkIker
1) depende, el codigo siempre es 100% relativo al proyecto, osea, los "bien visto" y "mal visto"
no van xD
sino diria que hacer operaciones matematicas al pelado, es mal visto, que use bit shift y bitwise
2) exacto, aunque tambien se puede usar directamente el indice [] sin usar el operador *
es mas, siempre lo hago asi ^^
3) si, pero, mirá, querés que siga con lo de bit shift y bitwise ? xD yo normalmente no
uso postincremento, si ando apurado y no uso bitwise y bit shift, uso nombrevariable+=numovariable;
despues el compiler lo traduce a una instruccion de ASM
el prototipo
Código:
char* getSToWork(char* Str,unsigned int size);
y si hablamos de C++ :
Código:
char* getSToWork(char* Str,unsigned int size = 0);
despues un if y se elige si es automatico el calculo (asumiendo que hay un EOF, o sea, usando strlen)
Cita de: DarkIker en Febrero 07, 2008, 12:02:55
El caso hipotetico se situa en que tenes una apliocacion que usa sockets y ecibis informacion binaria que debes parsear, usarias strlen?, recv retorna el numero de bytes recibidos sin importar si hay o no nulos en la cadena, si es mejor en mi concepto, por optimizacio y seguridad pasar el tamaño a una funcion, ya que desde el punto que se invoca a la funcion se suele conocer el origen de la informacion y si es o no correcto el tamaño, mientras que en la funcion la unica posibilidad es usar strleny entonces si el buffer tiene como primer byte 0 y despues de ello la cadena que planeabamos recibir que pasa?. Referente a lo de las librerais creo que iannn desaprobaba mas bien el uso de "toupper", "isalpha", "isnum" y cualquier otra que le ayudara en el "diagnostico" de los bytes de la cadena, no croe que le disguste callo y si es asi entonces algo se improvisa. Hay nos olemos. Salu2.
Att:
DarkIker
deberia ser opcional, como puse en C++ LoL ^^
pero si, absoluta razon
Adieu !
En línea
It's not about lines, it's about performance ...
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #8 en:
Febrero 08, 2008, 05:17:46 »
Citar
en ctypes esta la funcion isalpha =P
desaconsejo mucho el uso de NULL, usen 0
precisamente eso es lo que iann no queria supondre, aunque ya se hace raro que no se halla pronunciado, igual seria un desperdicio usar isalpha e isnum siendo que ya esta al igual que toupper o tolower,
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
es un macro de casting equivalente a 0, se veria un poco feo comparar punteros a 0 aunque tecnicamente es correcto ya que es la posicion de memoria lo que se compara.
Citar
yo cambiaria ese malloc() por un malloc propio,no olviden que
malloc puede dar null y el programa terminaria en segfault =P
se llama "controlar errores" xD
Depende el ambito y la aplicacion, aunque si es posible que falle tambien es posible que hala vida en el centor de la tierra; pero ya que usas malloc no estaria de mas setear la memoria a 0 no cae mal en el safe malloc. ( si estuvieramos en C++ te recuerdo que existe ASSERT ).
Citar
3) si, pero, mirá, querés que siga con lo de bit shift y bitwise ? xD yo normalmente no
uso postincremento, si ando apurado y no uso bitwise y bit shift, uso nombrevariable+=numovariable;
despues el compiler lo traduce a una instruccion de ASM
Depende del compilador sobretodo( Mingw Te odio hijo de .. ), igual el preincremento siempre ser mas rapido que el post y conjuntamente en una aplicaicon hem "normal" se suelen hacer un numero de bucles considerable, lo que hace pesar el performance, y no me salgan que tenemos procesadores de nose cuantos mil nucleos y que el performance vale madres por que eso es en pro de una buena constumbre programacion aparte de.
Att:
DarkIker
En línea
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> Colombia Underground Team
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> My Blog
V4mp1r3
Recien Llegado
Desconectado
Mensajes: 12
<~ Rin ~> ~ <~ 吸血鬼 ~>
Re: palindromes, error facil de solucionar
«
Respuesta #9 en:
Febrero 08, 2008, 05:51:07 »
Cita de: DarkIker en Febrero 08, 2008, 05:17:46
Citar
en ctypes esta la funcion isalpha =P
desaconsejo mucho el uso de NULL, usen 0
precisamente eso es lo que iann no queria supondre, aunque ya se hace raro que no se halla pronunciado, igual seria un desperdicio usar isalpha e isnum siendo que ya esta al igual que toupper o tolower,
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
es un macro de casting equivalente a 0, se veria un poco feo comparar punteros a 0 aunque tecnicamente es correcto ya que es la posicion de memoria lo que se compara.
Citar
yo cambiaria ese malloc() por un malloc propio,no olviden que
malloc puede dar null y el programa terminaria en segfault =P
se llama "controlar errores" xD
Depende el ambito y la aplicacion, aunque si es posible que falle tambien es posible que hala vida en el centor de la tierra; pero ya que usas malloc no estaria de mas setear la memoria a 0 no cae mal en el safe malloc. ( si estuvieramos en C++ te recuerdo que existe ASSERT ).
Citar
3) si, pero, mirá, querés que siga con lo de bit shift y bitwise ? xD yo normalmente no
uso postincremento, si ando apurado y no uso bitwise y bit shift, uso nombrevariable+=numovariable;
despues el compiler lo traduce a una instruccion de ASM
Depende del compilador sobretodo( Mingw Te odio hijo de .. ), igual el preincremento siempre ser mas rapido que el post y conjuntamente en una aplicaicon hem "normal" se suelen hacer un numero de bucles considerable, lo que hace pesar el performance, y no me salgan que tenemos procesadores de nose cuantos mil nucleos y que el performance vale madres por que eso es en pro de una buena constumbre programacion aparte de.
Att:
DarkIker
si, pero en C++ te recuerdo que sino se hace un cast implicito
y como c++ tiene a hacer los cast en runtime (vease reinterpret_cast) se perderia ciclos de cpu ..
esta bien usar 0
ahora, si, si queres usar null, como quieras xD
y lo del malloc, mira, yo programo aplicaciones GORDAS, games, y ahi necesitas controlar bien la memoria ..
ademas, no es remota la posibilidad
en un programa chico no es posible, pero en uno grande Si ..
es cuestion de tomar costumbres xD
lo de la performance, es obvio, mira mi firma (?) xD
mirá, lo del post no lo discuto, lo que si digo que si nos ponemos a ver esto, pasemos a los operadores de bits lol xD
y si, el mingw es una caca XD
siempre dije : todo suma y en bucle multiplica
Adieu !
En línea
It's not about lines, it's about performance ...
Anibal784
Miembro
Desconectado
Mensajes: 53
Re: palindromes, error facil de solucionar
«
Respuesta #10 en:
Febrero 08, 2008, 06:31:49 »
Bien, aca o saben muy mucho, o saben muy poco.
Primero:
Post-incremento, pre-incremento, es cierto el pre-incremento es mucho más rápido pero si vamos al caso también deberías saber que hacer un for de size-1 a 0 es tambíen mucho más rápido que de 0 a size-1, ya que es más rápido comparar contra 0. Además todavía estoy acostumbrado a que cuando escribo sin fijarme hacer c++ y no ++c, la fuerza de la costumbre vio.
El mignw no lo he usado mucho, pero si el que uso es el gcc, y por lo menos el mignw comparado con el visual c++ (por lo menos hasta la versión 6) es mucho mejor, todavía recuerdo cosas como no poder hacer:
Código:
for(int i=0; i < algo; ++i){
/**Código **/
}
/** más código **/
for(int i=0; i < algo; ++i){
/** VC no compila, da error de que la variable i ya fue declarada **/
}
El de borland no lo conozco, pero genera adicciones sobre librerías como la conio.h que cuando cambiás de compilador te das cuenta los dolores de cabeza que trae.
Además de que esta pregunta era sobre c ¿no? y no sobre c++, de ser así tendríamos el querido operador new que no necesita librería y tenemos memoria dinámica
.
Lo de comparar punteros con 0 en lugar de con NULL, hasta el mismo Bjarne Stroustrup aconseja que se compare con 0, pero en mi opinión yo prefiero ver un puntero comparado con NULL, es más si no confiás en cómo lo definió tu compilador podés hacer un undef y lo definís como 0...
En línea
"UNIX is simple. It just takes a genius to understand its simplicity."
V4mp1r3
Recien Llegado
Desconectado
Mensajes: 12
<~ Rin ~> ~ <~ 吸血鬼 ~>
Re: palindromes, error facil de solucionar
«
Respuesta #11 en:
Febrero 08, 2008, 07:26:41 »
Cita de: Anibal784 en Febrero 08, 2008, 06:31:49
Bien, aca o saben muy mucho, o saben muy poco.
Primero:
Post-incremento, pre-incremento, es cierto el pre-incremento es mucho más rápido pero si vamos al caso también deberías saber que hacer un for de size-1 a 0 es tambíen mucho más rápido que de 0 a size-1, ya que es más rápido comparar contra 0. Además todavía estoy acostumbrado a que cuando escribo sin fijarme hacer c++ y no ++c, la fuerza de la costumbre vio.
El mignw no lo he usado mucho, pero si el que uso es el gcc, y por lo menos el mignw comparado con el visual c++ (por lo menos hasta la versión 6) es mucho mejor, todavía recuerdo cosas como no poder hacer:
Código:
for(int i=0; i < algo; ++i){
/**Código **/
}
/** más código **/
for(int i=0; i < algo; ++i){
/** VC no compila, da error de que la variable i ya fue declarada **/
}
El de borland no lo conozco, pero genera adicciones sobre librerías como la conio.h que cuando cambiás de compilador te das cuenta los dolores de cabeza que trae.
Además de que esta pregunta era sobre c ¿no? y no sobre c++, de ser así tendríamos el querido operador new que no necesita librería y tenemos memoria dinámica
.
Lo de comparar punteros con 0 en lugar de con NULL, hasta el mismo Bjarne Stroustrup aconseja que se compare con 0, pero en mi opinión yo prefiero ver un puntero comparado con NULL, es más si no confiás en cómo lo definió tu compilador podés hacer un undef y lo definís como 0...
claro, comparas contra 0 en vez de accesar memoria y revisar valor xD
y si, pero es un foro de C/C++/C# no manejo c# y por lo tanto explico para los dos que sé ^^
y si, pero ademas es mas comodo y mas lindo de ver el 0 ..
si bien está ese define, es sugerible usar el 0 directamente por una cuestion estética...
Adieu !
En línea
It's not about lines, it's about performance ...
Anibal784
Miembro
Desconectado
Mensajes: 53
Re: palindromes, error facil de solucionar
«
Respuesta #12 en:
Febrero 08, 2008, 07:38:56 »
Cita de: V4mp1r3
claro, comparas contra 0 en vez de accesar memoria y revisar valor xD
No entendí
Cita de: V4mp1r3
y si, pero es un foro de C/C++/C# no manejo c# y por lo tanto explico para los dos que sé ^^
cierto, lenguajes que tienen mucho y a la vez tan poco que ver, a C# yo tampoco lo conozco, sólo vi un par de códigos dando vuelta por internet, un java medio cmasmiado, en fin una por***, C++ tiene un poco más que ver con C, pero te empezás a meter en el lenguaje y las referencias, los operadores new, delete, el manejo de flujos, en fin termina siendo na' que ve' con C.
Cita de: V4mp1r3
y si, pero ademas es mas comodo y mas lindo de ver el 0 ..
[/qoute]
Depende, a mi me gusta más ver un a == NULL, ya que ahí veo que a es un puntero y no un entero.
Cita de: V4mp1r3
si bien está ese define, es sugerible usar el 0 directamente por una cuestion estética..
Como dije antes, lo de estética está en vos, o en que la empresa en la que trabajás te obligue por cuestiones de mantener coherencia en el código, es lo mismo hay gente que le gusta la llave una línea abajo así:
Código:
if(condicion)
{
//código
}
else
{
//otro código
}
pero a mi me resulta más lindo y cómodo así:
Código:
if(condicion){
//codigo
}else{
//otro código
}
La cosa no viene tanto por estética sino por ser coherente a lo largo de todo lo que uno escribe.
En línea
"UNIX is simple. It just takes a genius to understand its simplicity."
V4mp1r3
Recien Llegado
Desconectado
Mensajes: 12
<~ Rin ~> ~ <~ 吸血鬼 ~>
Re: palindromes, error facil de solucionar
«
Respuesta #13 en:
Febrero 08, 2008, 07:43:35 »
Cita de: Anibal784 en Febrero 08, 2008, 07:38:56
Cita de: V4mp1r3
claro, comparas contra 0 en vez de accesar memoria y revisar valor xD
No entendí
Cita de: V4mp1r3
y si, pero es un foro de C/C++/C# no manejo c# y por lo tanto explico para los dos que sé ^^
cierto, lenguajes que tienen mucho y a la vez tan poco que ver, a C# yo tampoco lo conozco, sólo vi un par de códigos dando vuelta por internet, un java medio cmasmiado, en fin una por***, C++ tiene un poco más que ver con C, pero te empezás a meter en el lenguaje y las referencias, los operadores new, delete, el manejo de flujos, en fin termina siendo na' que ve' con C.
Cita de: V4mp1r3
y si, pero ademas es mas comodo y mas lindo de ver el 0 ..
[/qoute]
Depende, a mi me gusta más ver un a == NULL, ya que ahí veo que a es un puntero y no un entero.
Cita de: V4mp1r3
si bien está ese define, es sugerible usar el 0 directamente por una cuestion estética..
Como dije antes, lo de estética está en vos, o en que la empresa en la que trabajás te obligue por cuestiones de mantener coherencia en el código, es lo mismo hay gente que le gusta la llave una línea abajo así:
Código:
if(condicion)
{
//código
}
else
{
//otro código
}
pero a mi me resulta más lindo y cómodo así:
Código:
if(condicion){
//codigo
}else{
//otro código
}
La cosa no viene tanto por estética sino por ser coherente a lo largo de todo lo que uno escribe.
lo primero, dejah, paja de explicar -.- (la oracion lo dice OBVIO)
umm, si, deberian separar foros, pero bueh xD
Au Revoir !
En línea
It's not about lines, it's about performance ...
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #14 en:
Febrero 08, 2008, 08:11:40 »
Esto del quote es malo no? xD, a lo que vampire se refiere con lo de comparar contra 0 es que esto no es un bucle de n itineraciones como tal por lo menos en tu codigo con punteros ya que lo que se compara es el valor del puntero, en los otros codes si aplica y no aplica al tiempo ya que copiamos una cadena y si la metemos como vos sugeris en orden inverso no da joda reverserla y se pierden ciclos de cpu?. Siempre que se conserve la esencia de C programando en C++ sentiras que estas programando en C pero muy estructuradamente xD. C# fucki#~#~ @#~#~etc.., y java peor, en mi opinion el 0 no es estetico cuando se usa con un puntero y visual C++ 6.0 es mucho, muchisimo mejor y de lejos que mingw, inclusive y aun sin meterle los service pack( es para andar actualizados que se los metes ).
Si tienen tele hay se ven.
Att:
DarkIker
En línea
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> Colombia Underground Team
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
--> My Blog
lann
Habitual
Desconectado
Mensajes: 322
maamamma
Re: palindromes, error facil de solucionar
«
Respuesta #15 en:
Febrero 09, 2008, 12:29:54 »
de hecho no puedo usar librerias de terceras personas ni malloc() y asi... el operador new diran, pero yo dire que no... =p bueno
esto se debe a que debo de utilizar unicamente las cosas que me an enseñado para resolver
el ejercicio, uds. diran y como sabemos lo que te an enseñado... pues no se jajaj.
pero por el momento no puedo usar eso, podria usar funciones de utileria pero creadas por mi. con conceptos algo basicos pero bien utilizados.
el usar cosas abstractas o muy profundas sin funciones si se vale =p
bueno solo queria algunas opiniones ( esto es a los que me digan "y como vamos a saber lo que debes o no debes usar?!" )
lo de que dice darkiker bueno de los numeros los puse como int en ves de char, bueno hasta me dio verguenza, la verdad los habia puesto como char pero no se por que hise los cambie en el ultimo momento, pero bueno eso olvidenlo fue de esos momentos "high".
no habia publicado nada por mi nuevo trabajo y la escuela, y yo casi nunca habia sido un hombre ocupado.
no e resuelto esto pero me e dado cuenta de que solo funciona con los primero 4 bytes, 4 bytes hmmm...
y otro punto lo estoy haciendo en c++ pero en este momento no tiene casi diferencia a c por lo que decia anibal del operador new, y no se quien dijo algo de c# alomejor por que penso que no habia operador new en c++ o no se, si lei bien que despistado y si no pues que despistado yo, si mañana no me voy a tomar unas heineken publico el code que necesito.
En línea
am
Anibal784
Miembro
Desconectado
Mensajes: 53
Re: palindromes, error facil de solucionar
«
Respuesta #16 en:
Febrero 09, 2008, 10:50:40 »
Citar
Esto del quote es malo no? xD, a lo que vampire se refiere con lo de comparar contra 0 es que esto no es un bucle de n itineraciones como tal por lo menos en tu codigo con punteros ya que lo que se compara es el valor del puntero, en los otros codes si aplica y no aplica al tiempo ya que copiamos una cadena y si la metemos como vos sugeris en orden inverso no da joda reverserla y se pierden ciclos de cpu?.
[/qoute]
A ver dónde perdés ciclos de cpu en ésto:
Código:
size = strlen(cadena1);
for(int i = size -1; i >= 0; --i){
cadena2[i] = cadena1[1];
}
/**
* Es decir que si cadena1 = "Hola", a cadena 2 iría llenado así:
* cadena2: "# @1a"
* cadena2: "# @la"
* cadena2: " @ola"
* cadena2: "Hola"
*/
Me vas a decir que tengo que dar vuelta la cadena así, además a mi entender lo de vampire se refiere es a comparar un puntero contra 0 para saber si apunta a "Nada", no tiene nada que ver con el bucle, en mi bucle es verdad yo me equivoqué (y creo ya haberlo dicho) de que es *oStr == '\0'.
Citar
Siempre que se conserve la esencia de C programando en C++ sentiras que estas programando en C pero muy estructuradamente xD. C# fucki#~#~ @#~#~etc.., y java peor, en mi opinion el 0 no es estetico cuando se usa con un puntero y visual C++ 6.0 es mucho, muchisimo mejor y de lejos que mingw, inclusive y aun sin meterle los service pack( es para andar actualizados que se los metes ).
Algo que no entiendo es si te referís al compilador visula c++ 6.0 o a la IDE (más allá, que los dos para mi son una reverenda g @rch @, te quiero ver compilando algo para Solaris, FreeBSD, GNU/Linux con visula c++), ahora si lo que me decís es porque genera un ejecutable más chiquito, y anda más rápido, ah! que casualidad es de MS del mismo que creó el sistema sobre el que corre, es como que los procesadores pentium andan mucho mejor sobre placas madre INTEL
.
Volviendo al tema, como dice Iann no se puede usar el malloc (o sea, todavía no le ensañaron sobre memoria dinámica), ahora ¿cómo resolvés un problema si no podés usar memoria dinámica?.
1.- Arreglos static dentro de la función, pero la próxima llamada a ésta función sobreescribís los datos anteriores.
2.- Un arreglo global, ídem anterior.
3.- Con pasaje de parámetro, debés pasarle un puntero con la memoria suficiente.
No queda otra opción.
En línea
"UNIX is simple. It just takes a genius to understand its simplicity."
DarkIker
Habitual
Desconectado
Mensajes: 272
Colombia Underground Team
Re: palindromes, error facil de solucionar
«
Respuesta #17 en:
Febrero 09, 2008, 11:00:17 »
Hem y esta es otra opcion?:
Código:
#include <stdio.h>
int mystrlen( const char *sCad )
{
int iCount = 0;
while (sCad[iCount++]);
return iCount;
}
int IsAlphaNum( char cChar )
{
if ((cChar >= 'a' && cChar <= 'z') ||
(cChar >= 'A' && cChar <= 'Z') ||
(cChar >= '0' && cChar <= '9'))
return 1;
return 0;
}
char *getSToWork( char* psStr, int *iSize )
{
int iCount = 0, iPos = 0;
char *psRet = NULL;
if (!(psRet = psStr) || iSize <= 0)
return NULL;
for( ; iPos < *iSize; ++iPos) {
if (!IsAlphaNum( psStr[iPos] ))
continue;
psRet[ iCount++ ] = psStr[ iPos ];
}
psRet[ (*iSize = iCount) ] = 0;
return psRet;
}
int main( void )
{
char *psStr = "Hola, como estas?!! 10";
int iSize = mystrlen( psStr );
printf("\"%s\" %d\n", psStr, iSize);
getSToWork( psStr, &iSize);
printf("\"%s\" %d\n", psStr, iSize);
<