• Miércoles 16 de Julio de 2025, 06:01

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Karman

Páginas: [1] 2 3 4
1
C/C++ / Re: Compartir memoria en C++, ¿alguna libreria?
« en: Miércoles 7 de Enero de 2009, 09:24 »
Cita de: "hfe.ib"
y como hacia tiempo que no actualizabas la pagina, no te escribi.
Mil gracias Karman!!!.

es que ando con poco tiempo... entre el laburo y la facu... no me quedan ganas... je

S2

2
C/C++ / Re: Compartir memoria en C++, ¿alguna libreria?
« en: Miércoles 7 de Enero de 2009, 06:57 »
hace mucho que no posteo acá... pero esto es lo que buscas:

en el H:
Código: Text
  1.  
  2. // ------------------------------------------------------
  3. // SharedMemoryLib.h
  4. // Shared memory functions HEADERS
  5. // by Ni Idea, modificated by Karman
  6. // ------------------------------------------------------
  7. #ifndef _SHAREDMEM_H_
  8. #define _SHAREDMEM_H_
  9.  
  10. #include <windows.h>
  11. #include <stdio.h>
  12.  
  13. typedef struct _SharedMemory_{
  14.   HANDLE hFile;
  15.   LPDWORD hView;
  16. }SharedMemory,*PSharedMemory;
  17.  
  18. #ifdef _cplusplus
  19. extern "C"
  20. {
  21. #endif
  22.   BOOL CreateSharedMemoryArea(PSharedMemory psm,LPSTR SMName,DWORD size);
  23.   BOOL OpenSharedMemory(PSharedMemory psm,LPSTR SMName);
  24.   BOOL DestroySharedMemoryArea(PSharedMemory psm);
  25.   VOID WriteOnSharedMemory(PSharedMemory psm,DWORD data, DWORD position);
  26.   VOID ReadFromSharedMemory(PSharedMemory psm,LPDWORD data, DWORD position);
  27. #ifdef _cplusplus
  28. }
  29. #endif
  30.  
  31. #endif /* _SHAREDMEM_H_ */
  32.  
  33.  

y en el C:
Código: Text
  1.  
  2. // ------------------------------------------------------
  3. // Shared memory func. by Ni Idea, modificated by Karman
  4. // ------------------------------------------------------
  5.  
  6. #include <SharedMemLib.h>
  7.  
  8. //--------------------------------------------------------
  9. //
  10. //--------------------------------------------------------
  11. BOOL CreateSharedMemoryArea(PSharedMemory psm,LPSTR SMName,DWORD size){
  12.   psm->hFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(DWORD)*size,SMName);
  13.   if(!psm->hFile)return FALSE;
  14.    
  15.     psm->hView = MapViewOfFile(psm->hFile,FILE_MAP_ALL_ACCESS,0,0,0);
  16.     if(!psm->hView){
  17.     CloseHandle(psm->hFile);
  18.         return FALSE;
  19.     }
  20.   return TRUE;
  21. }    
  22. //--------------------------------------------------------
  23. //
  24. //--------------------------------------------------------
  25. BOOL OpenSharedMemory(PSharedMemory psm,LPSTR SMName){  
  26.     psm->hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,SMName);
  27.   if(!psm->hFile)return FALSE;
  28.    
  29.   psm->hView= MapViewOfFile(psm->hFile,FILE_MAP_ALL_ACCESS,0,0,0);  
  30.     if(!psm->hView){
  31.     CloseHandle(psm->hFile);
  32.         return FALSE;
  33.     }
  34.   return TRUE;
  35. }
  36. //--------------------------------------------------------
  37. //
  38. //--------------------------------------------------------
  39. BOOL DestroySharedMemoryArea(PSharedMemory psm){
  40.     if(UnmapViewOfFile(psm->hView)&&CloseHandle(psm->hFile))return TRUE;
  41.     return FALSE;
  42. }
  43. //--------------------------------------------------------
  44. //
  45. //--------------------------------------------------------
  46. VOID WriteOnSharedMemory(PSharedMemory psm,DWORD data, DWORD position){    
  47.     psm->hView[position] = data;
  48. }
  49. //--------------------------------------------------------
  50. //
  51. //--------------------------------------------------------
  52. VOID ReadFromSharedMemory(PSharedMemory psm,LPDWORD data, DWORD position){
  53.     *data = psm->hView[position];
  54. }
  55.  
  56.  

uso:
Código: Text
  1.  
  2. #define shmemname "un nombre!!! xD"
  3. ...
  4. SharedMemory MyShMem;
  5. //Creamos un bloque de memoria compartida...
  6. if(!CreateSharedMemoryArea(&MyShMem,shmemname,2)){
  7.   MessageBox(NULL,"Fallo al alocar memoria...",0,0);
  8.   return FALSE;
  9. }
  10.  
  11. //Inicializamos...
  12. WriteOnSharedMemory(&MyShMem,variable,0);
  13. ****
  14. if(!OpenSharedMemory(&MyShMem,shmemname))
  15.     return FALSE;
  16. ReadFromSharedMemory(&MyShMem,(LPDWORD)&variable,0);
  17.  
  18.  

S2

3
C/C++ / Re: ¿es Factible Crear Un Software Libre + Facil K Pb?
« en: Sábado 21 de Junio de 2008, 03:54 »
bueno, son muchos los conceptos que se cruzan, en la práctica, cuanto más sencillo sea un lenguaje de aprender más limitaciones tendrá este y más recursos utilizará (vb solo corre en Windows, por lo cual necesitarías Windows y su licencia), porque no se puede crear un lenguaje inteligente todavía, esto que quiere decir? los lenguajes de 4º generación (vb, pb) se basan en conceptos o usos comunes y al generar los códigos no analizan si lo que se quiere hacer es un "hola mundo" o un programa para administrar una mega-empresa, con lo cual no se logra un grado de eficiencia (la eficiencia se mide con beneficio/costo), por ejemplo si vos necesitas un programa para capturar las transacciones de un supermercado, cajeros automáticos u otras empresas u organizaciones, (dependiendo de la complejidad) se podrían crear en C o C++ y el equipo para correr tu programa podría ser un pentium 1, mientras que si deseas utilizar un programa en vb, necesitarías equipos más grandes, y en una empresa que tiene 300 o más ordenadores, comprar 300 p1 es mucho más económico que comprar 300 P3 o P4, esa es una de las razones por la cual Vista no logró demasiada aceptación, (no cumple la regla beneficio/costo), además (de todas formas) más allá de existir lenguajes de ese tipo, existen librerías libres (si no importa la condición beneficio/costo) como wxWidgets o QT que permiten la realización de programas relativamente simples sobre C++ (añadiendo además la posibilidad de multiplataforma)...

S2

4
ABAP / Re: Metodologías De Programación
« en: Jueves 27 de Marzo de 2008, 04:38 »
TB está la programación lógica (prolog) que es utilizada para inteligencia artificial...

S2

5
C/C++ / Re: Algoritmo Formula
« en: Miércoles 19 de Marzo de 2008, 15:21 »
fijate esta pequeña librería:

Calculadora de funciones en strings del tipo:

"2^5/(2*8)+9^(1/2)-(ln(e(1)))*(cos(25)-sin(60))"

fue algo que me llevó mucho tiempo hacer y que lo hice sin nada de referencia así que posiblemente pueda ser optimizado...   :kicking:

source C
Código
Código: Text
  1.  
  2. /*
  3.   Name: StrCalc.c
  4.   Copyright: Exinferis Inc.- 1999-2006
  5.   URL: http://www.inexinferis.co.nr
  6.   Author: Karman
  7.   Date: 12/05/05 15:13
  8.   Version: 0.95
  9.   Description: Calculadora de Strings...
  10.  
  11.   Operandos:
  12.     Enteros, Reales y ()
  13.   Operaciones Permitidas:
  14.     Matemáticas:
  15.       + - / * % ^
  16.     Funciones:
  17.       asin(x) - ArcoSeno
  18.       acos(x) - ArcoCoseno
  19.       atan(x) - ArcoTangente
  20.       abs(x)  - Absoluto (+)
  21.       sin(x)  - Seno
  22.       sinh(x) - Seno hiperbólico
  23.       cos(x)  - Coseno
  24.       cosh(x) - Coseno hiperbólico
  25.       tan(x)  - Tangente
  26.       tanh(x) - Tangente hiperbólica
  27.       ln(x)   - Logaritmo natural
  28.       log(x)  - Logaritmo base 10
  29.       e(x)    - e a la n
  30.       rand(x) - Número aleatorio
  31.       rnd(x)  - Redondeo
  32.       int(x)  - Truncado a entero
  33.  
  34.   Example:
  35.  
  36.     Calculate(&#34;2^5/(2*8)+9^(1/2)-(ln(e(1)))*(cos(90)-sin(90))&#34;);
  37. */
  38. #include &#34;strcalc.h&#34;
  39.  
  40. //Modo radianes (rad=1) modo normal (rad=0)
  41. char rad=0;
  42. char *fstart=0,*errpos=0;
  43.  
  44. //Funciones válidas
  45. FUNC func[]={
  46.   {&#34;asin(&#34;,'a'},{&#34;acos(&#34;,'b'},{&#34;atan(&#34;,'d'},{&#34;abs(&#34;,'j'},{&#34;sin(&#34;,'s'},
  47.   {&#34;sinh(&#34;,'f'},{&#34;cos(&#34;,'c'},{&#34;cosh(&#34;,'g'},{&#34;tan(&#34;,'t'},{&#34;tanh(&#34;,'h'},
  48.   {&#34;ln(&#34;,'n'},{&#34;log(&#34;,'l'},{&#34;e(&#34;,'e'},{&#34;rand(&#34;,'r'},{&#34;rnd(&#34;,'u'},{&#34;int(&#34;,'i'}
  49. };
  50.  
  51. //********************************************************
  52. // Devuelve la posición del error... (si hubo alguno)
  53. //********************************************************
  54. unsigned char GetFunctionErrorPos(void){
  55.   return (unsigned char)(errpos-fstart);
  56. }
  57. //********************************************************
  58. // Devuelve el error... (si hubo alguno)
  59. //********************************************************
  60. char *GetFunctionError(void){
  61.   return errpos;
  62. }
  63. //********************************************************
  64. // Libera lista en caso de error...
  65. //********************************************************
  66. void freelist(PCALCS prim){
  67.   PCALCS tmp;
  68.   while(prim){
  69.     tmp=prim;prim=prim-&#62;sig;free(tmp);
  70.   }
  71. }
  72. //********************************************************
  73. // Calcula lista de operaciones-operandos...
  74. //********************************************************
  75. double CalcOp(PCALCS pcy){
  76.   double res=0;PCALCS tpcy;
  77.   while(pcy){
  78.     switch(pcy-&#62;op){
  79.       case '=':res=pcy-&#62;val;break;
  80.       case '^':res=pow(res,pcy-&#62;val);break;
  81.       case '%':res=fmod(res,pcy-&#62;val);break;
  82.       case '*':res=res*pcy-&#62;val;break;
  83.       case '/':res=res/pcy-&#62;val;break;
  84.       case '+':res=res+pcy-&#62;val;break;
  85.       case '-':res=res-pcy-&#62;val;break;
  86.       //Arc trig. functions
  87.       case 'a':
  88.         if(rad)res=asin(pcy-&#62;val);
  89.         else res=(asin(pcy-&#62;val)*180)/M_PI;
  90.       break;
  91.       case 'b':
  92.         if(rad)res=acos(pcy-&#62;val);
  93.         else res=(acos(pcy-&#62;val)*180)/M_PI;
  94.       break;
  95.       case 'd':
  96.         if(rad)res=atan(pcy-&#62;val);
  97.         else res=(atan(pcy-&#62;val)*180)/M_PI;
  98.       break;
  99.       //Trig. Functions
  100.       case 's':
  101.         if(rad)res=sin(pcy-&#62;val);
  102.         else res=sin((pcy-&#62;val*M_PI)/180);
  103.       break;
  104.       case 'c':
  105.         if(rad)res=cos(pcy-&#62;val);
  106.         else res=cos((pcy-&#62;val*M_PI)/180);
  107.       break;
  108.       case 't':
  109.         if(rad)res=tan(pcy-&#62;val);
  110.         else res=tan((pcy-&#62;val*M_PI)/180);
  111.       break;
  112.       //Hip. Functions
  113.       case 'f':res=sinh(pcy-&#62;val);break;
  114.       case 'g':res=cosh(pcy-&#62;val);break;
  115.       case 'h':res=tanh(pcy-&#62;val);break;
  116.       //Other functions
  117.       case 'n':res=log(pcy-&#62;val);break;
  118.       case 'l':res=log10(pcy-&#62;val);break;
  119.       case 'e':res=exp(pcy-&#62;val);break;
  120.       case 'j':res=fabs(pcy-&#62;val);break;
  121.       case 'r':res=fmod(rand(),pcy-&#62;val);break;
  122.       case 'i':modf(pcy-&#62;val,&res);break;
  123.       case 'u':res=ceill(pcy-&#62;val);break;
  124.       default:res=0;
  125.     }
  126.     tpcy=pcy;pcy=pcy-&#62;sig;free(tpcy);
  127.   }
  128.   return res;
  129. }
  130. //********************************************************
  131. // Obtiene el número del String...
  132. //********************************************************
  133. double GetNum(char **txt){
  134.   double tmp=0;unsigned char des=0;
  135.   while((**txt)&&(isdigit(**txt)||((**txt)=='.')||((**txt)==' '))){
  136.     //Controlamos espacios en blanco...
  137.     if(**txt==' '){
  138.       while(**txt==' ')(*txt)++;
  139.       continue;
  140.     }
  141.     if((**txt)=='.')
  142.       if(des){
  143.         errpos=*txt;
  144.         return 0;
  145.       }else{
  146.         des=1;
  147.         (*txt)++;
  148.         continue;
  149.       }
  150.     if(des)
  151.       tmp=tmp+((*((*txt)++)-0x30)/pow(10,des++));
  152.     else
  153.       tmp=(tmp*10)+(*((*txt)++)-0x30);
  154.   }
  155.   if(des&&tmp==0){
  156.     errpos=*txt;
  157.     return 0;
  158.   }
  159.   else return tmp;
  160. }
  161. //********************************************************
  162. // Genera lista de Operadores-Operandos y administra
  163. // resultados... (recursivo)
  164. //********************************************************
  165. static double Calc(char **py,char lop,double lval){
  166.   char *pyt,*opy,cp,trig,tmp[256];
  167.   unsigned char av,flen,nfunc=sizeof(func)/sizeof(func[0]);
  168.   PCALCS prim=NULL,tp=NULL,atp=NULL,tq,tt;
  169.   while(**py){
  170.     //Controlamos espacios en blanco...
  171.     while(**py==' ')*py++;
  172.     //Nuevo elemento...
  173.     if(tp)atp=tp;
  174.     tp=(PCALCS)malloc(sizeof(CALCS));
  175.     if(!prim)prim=tp;else tq-&#62;sig=tp;
  176.     tq=tp;tp-&#62;sig=NULL;  
  177.     //Operación?
  178.     if(lval){//Argumento enviado...
  179.       tp-&#62;val=lval;tp-&#62;op='=';lval=0;continue;
  180.     }
  181.     //primer operación...
  182.     if(isoper(**py))//Es una operación?
  183.       switch(**py){
  184.         //Suma Resta prioridad 3...
  185.         case '+':case '-':
  186.           switch(lop){
  187.             case '*':case '^':case '%':
  188.               atp-&#62;sig=NULL;free(tp);
  189.               return CalcOp(prim);
  190.             case '+':
  191.               tp-&#62;op=*(*py)++;
  192.             break;
  193.             default:
  194.               goto OnError;//Error...
  195.           }
  196.         break;
  197.         //Multiplicación Divición prioridad 2...
  198.         case '*':case '/':
  199.           switch(lop){
  200.             case '^':case '%':
  201.               atp-&#62;sig=NULL;free(tp);
  202.               return CalcOp(prim);
  203.             case '*':tp-&#62;op=*(*py)++;break;
  204.             case '+':
  205.               atp-&#62;val=Calc(&(*py),'*',atp-&#62;val);
  206.               atp-&#62;sig=NULL;free(tp);tp=NULL;tq=atp;
  207.               if(errpos!=fstart)
  208.                 goto OnError;//Error...
  209.             continue;
  210.             default:
  211.               goto OnError;//Error...
  212.           }
  213.         break;
  214.         //Modulo prioridad 1...
  215.         case '%':
  216.           switch(lop){
  217.             case '^':
  218.               atp-&#62;sig=NULL;free(tp);
  219.               return CalcOp(prim);
  220.             case '%':tp-&#62;op=*(*py)++;break;
  221.             case '+':case '*':
  222.               atp-&#62;val=Calc(&(*py),'%',atp-&#62;val);
  223.               atp-&#62;sig=NULL;free(tp);tp=NULL;tq=atp;
  224.               if(errpos!=fstart)
  225.                 goto OnError;//Error...
  226.             continue;
  227.             default:
  228.               goto OnError;//Error...
  229.           }
  230.         break;
  231.         //Potencia prioridad 0...
  232.         case '^':
  233.           switch(lop){
  234.             case '^':tp-&#62;op=*(*py)++;break;
  235.             case '+':case '*':case '%':
  236.               atp-&#62;val=Calc(&(*py),'^',atp-&#62;val);
  237.               atp-&#62;sig=NULL;free(tp);tp=NULL;tq=atp;
  238.               if(errpos!=fstart)
  239.                 goto OnError;//Error...
  240.             continue;
  241.             default:
  242.               goto OnError;//Error...
  243.           }
  244.         break;
  245.         default:
  246.           goto OnError;//Error...
  247.       }
  248.     else //Restantes opciones...
  249.       tp-&#62;op='=';
  250.     //Obtenemos argumento...
  251.     if(isdigit(**py)||((**py)=='.')){
  252.       tp-&#62;val=GetNum(&(*py));
  253.       if(errpos!=fstart)
  254.         goto OnError;//Error...    
  255.     }else{
  256.       trig=0;
  257.       //Parentesis...
  258.       if(**py=='(')goto CalcCont;
  259.       //Funciones...
  260.       for(av=0;av&#60;nfunc;av++){
  261.         flen=strlen(func[av].fname);
  262.         if(!strncmp(*py,func[av].fname,flen)){
  263.           (*py)+=flen-1;trig=func[av].func;
  264.           goto CalcCont;
  265.         }
  266.       }
  267.       //Tratamos Error...
  268.       goto OnError;//Error...
  269. CalcCont://Calculamos contenido de &#34;()&#34;
  270.       pyt=tmp;cp=1;(*py)++;opy=*py;
  271.       while(**py){
  272.         if(**py=='(')++cp;
  273.         if(**py==')')--cp;
  274.         if(!cp)break;
  275.         *(pyt++)=*(*py)++;
  276.       }
  277.       if(cp)
  278.         goto OnError;//Error...
  279.       *pyt=0;(*py)++;pyt=tmp;
  280.       tp-&#62;val=Calc(&pyt,'+',0);
  281.       if(errpos!=fstart){
  282.         *py=opy;
  283.         goto OnError;//Error...
  284.       }
  285.       //Resolvemos funciones...
  286.       if(trig){
  287.         tt=(PCALCS)malloc(sizeof(CALCS));
  288.         tt-&#62;sig=NULL;
  289.         tt-&#62;op=trig;
  290.         tt-&#62;val=tp-&#62;val;
  291.         tp-&#62;val=CalcOp(tt);
  292.       }
  293.     }
  294.   }
  295.   return CalcOp(prim);
  296.   OnError://Error...
  297.     errpos=*py;
  298.     freelist(prim);
  299.   return 0;
  300. }
  301. //********************************************************
  302. // Verifica String y llama a la función de cálculo...
  303. //********************************************************
  304. double Calculate(char *arg){
  305.   fstart=errpos=arg;
  306.   if(strlen(arg)&#62;256){//256 caracteres Máximo...
  307.     errpos=arg+256;
  308.     return 0;
  309.   }
  310.   return Calc(&arg,'+',0);
  311. }
  312.  
  313.  

source H
Código
Código: Text
  1.  
  2. #ifndef  _STRCALCLIB_H_
  3. #define  _STRCALCLIB_H_
  4.  
  5. #include &#60;string.h&#62;
  6. #include &#60;stdlib.h&#62;
  7. #include &#60;ctype.h&#62;
  8. #include &#60;math.h&#62;
  9.  
  10. //Operaciones válidas
  11. #define isoper(a) (a=='+')||(a=='-')||(a=='*')||(a=='/')||(a=='^')||(a=='%')
  12.  
  13. //********************************************************
  14. // Registro de funciones...
  15. //********************************************************
  16. typedef struct _FUNC_{
  17.   char fname[6],func;
  18. }FUNC;
  19.  
  20. //********************************************************
  21. // Lista de argumentos...
  22. //********************************************************
  23. typedef struct calcs{
  24.   double val;
  25.   char op;
  26.   struct calcs *sig;
  27. }CALCS,*PCALCS;
  28.  
  29. //********************************************************
  30. // Funciones Exportadas...
  31. //********************************************************
  32. double Calculate(char *arg);
  33. unsigned char GetFunctionErrorPos(void);
  34. char *GetFunctionError(void);
  35.  
  36. #endif //_STRCALCLIB_H_
  37.  
  38.  

S2

PD: más info como funciona en mi pag...

6
C/C++ / Re: Mi Propia Ventana
« en: Sábado 17 de Noviembre de 2007, 01:56 »
Citar
En realidad no es esto lo quiero del todo no hay algo para programar en nivel mas bajo casi en ensamblador.... en plan de yo crear el cuadrado de la ventana y esas cosas

Para qué? sería como re-programar un sistema operativo, además... estas "ventanas" son totalmente modificables y configurables... para qué querer reinventar la pólvora?

S2

7
C/C++ / Re: Mi Propia Ventana
« en: Viernes 16 de Noviembre de 2007, 14:08 »
fijate acá: Winapi

S2

8
C/C++ / Re: Dos Objetos De Clases 'hermanas' Reconociendose
« en: Martes 6 de Noviembre de 2007, 15:23 »
tu problema es un problema de diseño:

en tablero definís una matriz de células (genéricas) y cuando llamas a que imprima dicha matriz lo más obvio es que te lo imprima como células genéricas (no como especializadas), para que te las imprima como especializadas tenes varias opciones:

1º Que tu célula genérica solo contenga funciones virtuales puras, entonces en cada llamada a imprimir se llamará a las funciones derivadas, pero para eso tendrías que definir un nuevo tipo de célula (célula muerta?) que ocupe los casilleros vacíos<---- Polimorfismo

2º Definir un tercer tipo de célula (casilla por ejemplo) que derive de los dos tipos de células especializadas y que al imprimir analice el tipo y llame a uno u otro método, o imprima '_' <----- Derivación múltiple

3º (como te lo resolví) eliminar de las células especializadas las funciones redundantes y colocarlas únicamente en célula (la especialización es solo la identidad, pero el comportamiento creo que es el mismo, eso creo... cualquier cosa fijate) entonces al llamar a imprimir, la célula genérica se encarga de todo...

S2

9
C/C++ / Re: Alternativas Al Fflush Para Linux
« en: Martes 6 de Noviembre de 2007, 13:40 »
Es la única forma... pero podés usar algo como esto:

void clrbuf(void){
  while( getch()!='\n' );
}

S2

10
C/C++ / Re: Dos Objetos De Clases 'hermanas' Reconociendose
« en: Martes 6 de Noviembre de 2007, 01:38 »
No, no son suficientes detalles... tu problema es un problema de implementación... hay que ver como estás implementando tus clases y las relaciones...

S2

11
C/C++ / Re: Dos Objetos De Clases 'hermanas' Reconociendose
« en: Lunes 5 de Noviembre de 2007, 13:16 »
Citar
casilla[k][l] = Celula; //<- Esta es la linea donde me pide una expresión primaria antes del;

qué quieres hacer con esto? para que asignas a un array de objetos la clase? ya tienes el objeto creado, prueba hacer un:

casilla[j]->algo();

Citar
for (int i = 0; i < limi; i++){
   for (int j = 0; j < limj; j++)
     delete[] casilla[j];
   delete []casilla;
 }

S2

12
C/C++ / Re: Cuidao Con Los Punteros
« en: Sábado 27 de Octubre de 2007, 19:02 »
Código: Text
  1.  
  2. Por cierto ahora que lo veo con el tipo de retorno hiciste trampa:
  3.  
  4.  

No hice trampa...  "Main() must return int"...

S2

13
C/C++ / Re: Cuidao Con Los Punteros
« en: Sábado 27 de Octubre de 2007, 07:39 »
Citar
Ademas si lo que decis fuera cierto cadena de caracteres ocuparia 4 * caracter y eso no es asi ...

no... no dije que si tuviera una cadena cada elemento ocuparía un byte... ya que las cadenas se agrupan en bytes consecutivos y el procesador mediante el índice (byte) puede ir pasando de caracter a caracter....

Citar
QUOTE (Karman @ Octubre 26, 2007 03:09 pm)

es por eso que en muchos manuales te dicen que es recomendable usar solo variables int ya que de todas formas siempre utilizas 32 bits...


Me parece que estas confundiendo con el tema de "alineamiento" a 32 bits.

no... lo que yo digo es para definir variables comunes, como contadores, etc... no para el trabajo con strings... y recomendaban justamente eso por lo que te mostré en el código en assembler...

S2

14
C/C++ / Re: Cuidao Con Los Punteros
« en: Viernes 26 de Octubre de 2007, 15:09 »
La verdad en todas las plataformas que trabajé vi eso, fijate:

Código: Text
  1.  
  2.   char a,b,c;
  3.   a='A';
  4.   printf(&#34;hola %c&#34;,a);
  5.   b=a-1;
  6.   printf(&#34;chau %c&#34;,b);
  7.   c=a+b;
  8.   printf(&#34;%c&#34;,c);
  9.   return (int)b;
  10.  
  11.  


:004012FF BA41000000               mov edx, 00000041
:00401304 89542404                mov dword ptr [esp+04], edx

:00401308 E863050000              Call 00401870 (* Reference To: msvcrt.printf, Ord:027Fh)
:0040130D C7042408304000          mov dword ptr [esp], 00403008
:00401314 B840000000              mov eax, 00000040
:00401319 89442404                mov dword ptr [esp+04], eax

:0040131D E84E050000              Call 00401870 (* Reference To: msvcrt.printf, Ord:027Fh
)
:00401322 C7042481FFFFFF          mov dword ptr [esp], FFFFFF81

:00401329 E832050000              Call 00401860 (* Reference To: msvcrt.putchar, Ord:0281h)
:0040132E C9                      leave
:0040132F B840000000              mov eax, 00000040
:00401334 C3                      ret

es por eso que en muchos manuales te dicen que es recomendable usar solo variables int ya que de todas formas siempre utilizas 32 bits...

S2

PD: Y en el mejor de los casos, con instrucciones como:

mov byte ptr [edx], 41

el registro edx termina conteniendo: 0x00000041

15
C/C++ / Re: Cuidao Con Los Punteros
« en: Viernes 26 de Octubre de 2007, 06:14 »
Para que entiendas el tema del tamaño de un puntero, un puntero es una variable (un espacio de memoria) que contiene la dirección de otra variable o (en su defecto) de ninguna, te pongo un ejemplo simple:

char a='A';

Dependiendo de la máquina y del modelo de memoria que se utilice tenes las siguientes posibilidades:

Código: Text
  1.  
  2.  16bits               32bits                         64bits
  3. [00|56]       [00|00|00|56]    [00|00|00|00|00|00|00|56]
  4.  
  5.  

donde 56 = 'A' (no recuerdo si era ese valor... pero es un valor parecido si no), como ves, se desperdician varios bytes de memoria... pero eso es otro tema...
la cosa es que nuestra famosa variable a se puede encontrar en la posición de memoria:

Código: Text
  1.  
  2.  16bits               32bits                         64bits
  3. [23df]           [45ab87cd]            [53463bfade4525fe]
  4.  
  5.  

entonces:

char *p;

debe ser capaz de almacenar dicha dirección, es por esto que p, será de 16, 32, 64, 128 o el modelo de memoria que se utilice...

S2

16
C/C++ / Re: Redondeos En C++
« en: Viernes 26 de Octubre de 2007, 05:52 »
si tu problema únicamente es el redondeo, lo que te conviene hacer es:

d=n/100;

ceil(x) redondea el numero x al entero mas pequeno que no sea menor que x...
ej: ceil(9.2)=10

floor(x) redondea a x al entero mas grande no mayor de x...
ej: floor(9.2)=9

y luego lo vuelves a multiplicar por 100...

S2

17
C/C++ / Re: Problemas Con Strings En C++
« en: Viernes 12 de Octubre de 2007, 18:02 »
1º si no me equivoco el operador "+=" sirve para concatenar strings y no  chars, (no estoy seguro), pero se me hace que tu error podría estar ahí cuando busca el fin de línea empieza a leer memoria contigua que no pertenece a la variable.

Prueba así:

Código: Text
  1.  
  2.  char c[]={0,0};
  3.  c[0]=readchar();
  4.  while (not esSeparador (cin.peek (), MARCAFINAL))
  5.  {
  6.     c[0]=readchar();
  7.     letras += c;
  8.  }
  9. }
  10.  
  11.  

S2

18
C/C++ / Re: Una Duda Con C Y Un Warning
« en: Jueves 4 de Octubre de 2007, 03:32 »
hola...

 [Warning] passing arg 1 of `fscanf' makes pointer from integer without a cast

esto te dice que lo que estás pasando de parámetro 1 a fscanf es erróneo... si vemos la definición de fscanf:

int fscanf (FILE *stream, const char *template, ...)

se ve que el primer parámetro es la dirección a un identificador de archivo... pero vos no abriste ningún archivo... entonces deduzco que quisiste usar "scanf" y no fscanf, veamos la definición de scanf...

int scanf (const char *template, ...)

entonces lo que vos querés hacer se hace así:

scanf("%d",&opc);

PD: Cuando tengas un error y aparezca el nombre de una función como parte de la descripción, búscala en la web para saber cuales son sus argumentos...

S2

19
C/C++ / Re: Recompilar.. :(
« en: Jueves 20 de Septiembre de 2007, 16:58 »
Citar
¿Por qué Dev-C++ crea un ejecutable diferente en mi pc que en la de mi amigo con exactamente el mismo codigo?

Existen solamente 3 respuestas a tu pregunta:
1- Versión distinta de codigo
2- Versión distinta de compilador
3- Parámetros distintos de compilación

Lo que te lleva a: si las tres condiciones anteriores son falsas los ejecutables son iguales, y para comprobarlo existen varios programas que comparan códigos binarios (por ejemplo Ultra Compare <- Parte de Ultra Edit).

El error, lo más probable, es que sea una falla tuya, y el programa funciona mientras no se ejecuten ciertas sentencias (lo que se denomina "Exploit"), o en un caso más dificil, que las dll que utiliza tu programa sean distintas en cada máquina... pero es dificil...

S2

20
C/C++ / Re: Comprobar Textbox En C++
« en: Martes 18 de Septiembre de 2007, 02:44 »
wxTextCtrl::GetValue() devuelve un puntero a un objeto wxString, lo que deberías preguntar es si dicho string no es nulo mediante:

wxString::IsEmpty()

el código te quedaría:

if(WxEdit1->GetValue()->IsEmpty())
{
wxMessageBox("Debe escribir el nombre del fichero!!");
}
else
{
wxMessageBox("La ruta se guardo satisfactoriamente.");
}
}

S2

21
C/C++ / Re: Ejecutables Portables
« en: Domingo 16 de Septiembre de 2007, 06:23 »
La verdad no sé muy bien como es en esa versión del Visual Studio, pero en la 2003 tenés que ir a proyecto->Propiedades de... ->General -> y setear todo para que no incluya dependencias externas:

Citar
uso de mfc: utilizar librerías estandares

y las demás tb (depende qué características utilices)

espero te sirva de algo...  :blink:

S2

22
C/C++ / Re: Busco Libreria De Sonidos Para C++ Estandar
« en: Domingo 9 de Septiembre de 2007, 03:58 »
la función la hice hace mucho... y funcionaba con el viejo Mingw... fijate lo que encontré en la librería stdlib.h:

Código: Text
  1.  
  2. /*
  3.  * NOTE: Officially the three following functions are obsolete. The Win32 API
  4.  *       functions SetErrorMode, Beep and Sleep are their replacements.
  5.  */
  6. _CRTIMP void __cdecl  _beep (unsigned int, unsigned int);
  7. _CRTIMP void __cdecl  _seterrormode (int);
  8. _CRTIMP void __cdecl  _sleep (unsigned long);
  9.  
  10.  

Tendrías que probar con sus remplazos del Win32 API (en "Windows.h") si programás en windows o esas mismas funciones pero sin los "_" si lo hacés en linux...

Saludos

23
C/C++ / Re: Busco Libreria De Sonidos Para C++ Estandar
« en: Jueves 6 de Septiembre de 2007, 16:01 »
si querés usar sonidos monotonos... fijate esta función, la creé hace unos cuantos años basándome en una función de QBASIC...

Código: Text
  1.  
  2. //Devuelve las potencias de un número entero (usada por play)
  3. //Nota: la función pow() en &#34;math.h&#34; realiza también esta tarea pero
  4. //esta diseñada para números del tipo double...
  5.  
  6. int pot(int x, int p)//funcion usada por play...
  7. {int x1;if(p)x1=x;else x1=1;
  8. for(int a=1;a&#60;p;a++)x1=x1*x;
  9. return x1;}
  10.  
  11. /*Reproduce notas musicales por el altavoz del sistema
  12. (solo letras en mayusculas)
  13.  
  14. Comandos de octava y tono:
  15. O-Octava    Establece la octava actual (0 - 6).
  16. A - G      Toca la nota especificada en la octava actual.
  17.  
  18. Comandos de duración y tempo:
  19. L-duración  Define la duración de cada nota (1 - 64).
  20.              L1 es redonda, L2 es blanca, etc..
  21. P-pausa     Hace una pausa (1 - 64). P1 es una pausa de redonda,
  22.            P2 es una pausa de blanca.
  23. */
  24.  
  25. void play(char *mu)//#include stdlib.h & string .h
  26. {
  27. int t,tn,o,nota,a,va,xt,x[2];
  28. tn=1536;o=4;//Parametros por defecto
  29. int ox[]={6,7,1,2,3,4,5};
  30.  
  31. for(int s=0;s&#60;strlen(mu);s++){a=int(mu[s]);
  32. if(a==76||a==80){xt=0;va=0;//P y L
  33. for(int av=0;av&#60;2;av++){x[av]=int(mu[s+(2-av)])-48;
  34. if(x[av]&#60;=9)xt+=x[av]*pot(10,va++);}
  35. if(a==80)_sleep(tn/xt);else t=tn/xt;} //P
  36. if(a==79)o=(int(mu[++s])-48)%8;//O
  37. if(a&#62;64&&a&#60;72)//A,B,C,D,E,F,G
  38. {nota=pot(2,o+3)*(ox[a-65]+7)+16;_beep(nota,t);}}}
  39.  
  40. /*
  41. Ejemplo:
  42. play(&#34;L12FP32L4DCD&#34;);
  43. ...
  44. play(&#34;O0L5C&#34;);
  45. */
  46.  
  47.  

S2

24
C/C++ / Re: Puntero, Cantidad De Caracteres En Una Cadena
« en: Sábado 1 de Septiembre de 2007, 04:58 »
tu problema está acá:

Código: Text
  1.  
  2. if(s[i]==s){
  3.  
  4.  

primero, guardás el caracter a buscar en un string: gets(t);
gets almacena un estring, no un caracter, entonces estás comparando un caracter (s) con un string (s) que en realidad tendría que ser t, pero que no deja de ser un string, la forma correcta de hacerlo sería:

Código: Text
  1.  
  2. char t;
  3. ...
  4. t= (char)getchar();
  5. ...
  6. if(s[i]==t){
  7. ...
  8.  
  9.  

Saludos

25
C/C++ / Re: Colores
« en: Sábado 1 de Septiembre de 2007, 04:47 »
la forma correcta sería con cprintf, cputs, etc... pero desconozco si el conio.h que trae por defecto el devcpp las incluye... si no las incluye tendrías que bajarte alguno de los emuladores de CONIO que hay dando vueltas por la web... uno está justamente en mi sitio... je...

Saludos

Páginas: [1] 2 3 4