Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - rir3760

#451
Programación C/C++ / Re: Problema con loop
2 Marzo 2014, 16:59 PM
Cita de: wiD^ en  2 Marzo 2014, 05:22 AMSoy nuevo con los arrays, y no entiendo cuando te referís a un array de arrays de carácteres, me darías un ejemplo?
1) Cuando se manejan valores del mismo tipo en lugar de un montón de variables se utiliza un array, por ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define NUM_ELEM 10

int main(void)
{
   int num[NUM_ELEM]; /* array de int */
   int i;
   
   for (i = 0; i < NUM_ELEM; i++){
      num[i] = i;
      printf("%d\n", num[i]);
   }
   
   return EXIT_SUCCESS;
}


2) En C una cadena se almacena en un array de caracteres. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char palabra[] = "Jeremias"; /* array de caracteres */
   
   printf("%s\n", palabra);
   
   return EXIT_SUCCESS;
}


Combinando los puntos anteriores si tu programa debe procesar varias cadenas estas se almacenan en un array de cadenas y como las cadenas se almacenan en arrays de caracteres eso resulta en un array de arrays de caracteres:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char pal[][5] = {
      "Hugo",
      "Paco",
      "Luis"
   };
   int num_pals = (int) (sizeof pal / sizeof pal[0]);
   int i;
   
   for (i = 0; i < num_pals; i++)
      printf("%s\n", pal[i]);
   
   return EXIT_SUCCESS;
}


El uso de sizeof lo veras mas adelante, esta ahí porque lo políticamente correcto es no indicar el numero de elementos de un array si se utiliza (como en el ejemplo) una lista de valores para inicializarlo.

Un saludo
#452
Programación C/C++ / Re: Problema con loop
1 Marzo 2014, 22:52 PM
Errores importantes hay dos:

* El primero como ya te comentaron esta en el bucle: no le das un valor inicial a la variable "j", la variable "x" sobra, la condición del bucle debe ser "j < i" y tienes un punto y coma demás justo antes del cuerpo del bucle.

* El segundo es utilizar un array de chars para almacenar las palabras cuando deberia ser un array de arrays de caracteres.

Otro detalle es utilizar un array de longitud variable ya que estos se soportan en C99 y son opcionales en C11. Para el caso puedes reservar memoria con malloc.

El programa con las correcciones:
#include <stdio.h>
#include <stdlib.h>

#define NUM_CHARS  128

int main(void)
{
   char (*palabra)[NUM_CHARS];
   int num_pals;
   int i;
   
   puts("Numero de productos:");
   if (scanf("%d", &num_pals) != 1)
      return EXIT_FAILURE;
   
   palabra = malloc(num_pals * sizeof *palabra);
   
   for (i = 0; i < num_pals; i++){
      printf("Nombre del producto no %d:\n", i + 1);
      scanf("%s", palabra[i]);
   }
   
   /* ... */
   
   free(palabra);
   return 0;
}


Por ultimo hay que evitar el uso de scanf con "%s" ya que tiene los mismos riesgos que gets (mejor utilizar fgets).

Un saludo
#453
Debes cambiar la condicion del if:
if (pFile==NULL && newFile==NULL)
   perror ("Error opening file");

Ya que el mensaje de error solo se presentara si la apertura de ambos archivos falla (se debe sustituir "&&" por "||").

Y si piensas leer caracter por caracter puedes utilizar las funciones fgetc y fputc. Por ejemplo:
#include <stdio.h>

int main(void)
{
   FILE * pFile;
   FILE * newFile;
   int ch;
   
   if ((pFile = fopen("Hola.exe", "rb")) == NULL)
      perror("Hola.exe");
   else if ((newFile = fopen("EXE.exe", "wb")) == NULL)
      perror("EXE.exe");
   else
      while ((ch = fgetc(pFile)) != EOF)
         fputc(ch, newFile);
   
   if (pFile != NULL)
      fclose(pFile);
   if (newFile != NULL)
      fclose(newFile);
   
   return 0;
}


Sin embargo el programa lo unico que hace es una copia del archivo original, para el caso mejor utiliza una funcion cortesia del SO (en MS Windows puedes utilizar CopyFile y CopyFileEx).

Un saludo
#454
Cita de: vangodp en  1 Marzo 2014, 11:43 AMUna pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
No. Antes de utilizar esas dos funciones debes incluir <cstdio>.

Cita de: vangodp en  1 Marzo 2014, 11:43 AM¿O también sirve para cout?
Para utilizar cin, cout y cerr primero debes incluir <iostream>.

Un saludo
#455
Cita de: <<<-Underwar->>> en 27 Febrero 2014, 05:16 AM1.  Hola bueno lo que necesito es simple, Quiero tomar un fichero binario y transformarlo en texto... luego cuando tengo el texto quiero transformarlo a exe.
Como ya te comentaron un archivo es una secuencia de bytes, imprimir el valor de cada uno literalmente (65, 97, etc. en base 10 o cualquier otra base) o como un carácter de algún juego de caracteres (por ejemplo en ASCII A, a, etc.) es cuestión del usuario.


Cita de: <<<-Underwar->>> en 27 Febrero 2014, 05:16 AM2.  Quisiera saber también como leer este fichero en Binario.
En el caso de C basta con abrir el archivo en modo binario "rb" y leer los caracteres con funciónes como fread, fgetc, etc. pero no estoy seguro si eso es lo que buscas.

Con todo un ejemplo sencillo (un "poor man's hex viewer") en C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define NOM_ACHIVO  "main.exe"
#define NUM_COLS  16

int main(void)
{
  FILE *in;
  unsigned char ch[NUM_COLS];
  size_t nc;
  size_t i;
 
  if ((in = fopen(NOM_ACHIVO, "rb")) == NULL){
     perror(NOM_ACHIVO);
     return EXIT_FAILURE;
  }
 
  while ((nc = fread(ch, 1, NUM_COLS, in)) != 0){
     for (i = 0; i < NUM_COLS; i++)
        if (i < nc)
           printf(" %02x", ch[i]);
        else
           printf("   ");
     
     printf("  |  ");
     
     for (i = 0; i < nc; i++)
        if (ispunct(ch[i]) || isalnum(ch[i]))
           putchar(ch[i]);
        else
           putchar(' ');
     
     printf("  |\n");
  }
   fclose(in);
 
  return EXIT_SUCCESS;
}

La idea es imprimir valores hexadecimales (lo usual) y también como texto (cuando sea posible).

Un saludo
#456
Cita de: vangodp en 28 Febrero 2014, 22:30 PM#include <string>Eso es una cosa que no sabia usaba stdio.h
En C para utilizar las funciones de entrada/salida (printf, scanf, etc.) primero se debe incluir el encabezado <stdio.h> (<cstdio> en C++), en el caso de las funciones para el manejo de cadenas y memoria (str___ y mem___) el encabezado a incluir es <string.h> (<cstring> en C++).

Un listado de las bibliotecas estándar de C y C++ (C99 y C++98) es Dinkumware Manuals

Un saludo
#457
Cita de: patilanz en 28 Febrero 2014, 18:05 PMOsea que la función estaba mal o free hace otra cosa aparte de liberar la memoria
La función esta mal, lo correcto es:
int *func()
{
   int *to_return = (int *) malloc(2 * sizeof(int));
   
   to_return[0] = 1;
   to_return[1] = 2;
   
   return to_return;
}


Un saludo
#458
Cita de: patilanz en 28 Febrero 2014, 13:56 PM
Como funciona este codigo:
Código (cpp) [Seleccionar]
int* func( )
{
  int* to_return = (int*)malloc( 2 * sizeof( int ) );

  to_return[ 0 ] = 1;
  to_return[ 1 ] = 2;

  free( to_return );
}


ya que nunca devuelve. Creo que free no devuelve o si?
Correcto, el tipo de retorno de la función free es void, para solucionarlo solo tienes que sustituir la sentencia "free( to_return );" por "return to_return;".

Un saludo
#459
Cita de: xaps en 25 Febrero 2014, 18:29 PMNo creo que sea buena idea incitar a la gente que está empezando a programar a usar bucles sin condición de los que se saldrá mediante breaks, no es una buena práctica.

Yo te animo a que intentes hacer un bucle con condición y te olvides del break.
Mas que una mala practica es una cuestión de estilos.

Una opción es utilizar un bucle con una salida al medio con la ventaja del mínimo de expresiones:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num;
   int rv;
   int ch;
   
   while (1){
      printf("Introduce un numero (1 .. 9): ");
      fflush(stdout);
      if ((rv = scanf("%d", &num)) == EOF)
         return EXIT_FAILURE;
      else
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
     
      if (rv == 1 && num >= 1 && num <= 9)
         break;
     
      puts("Entrada no valida");
   }
   
   printf("Numero: %d\n", num);
   
   return EXIT_SUCCESS;
}


Otra es un bucle "while ..." o "do ... while" con expresiones repetidas:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int num;
   int rv;
   int ch;
   int ok;
   
   do {
      printf("Introduce un numero (1 .. 9): ");
      fflush(stdout);
      if ((rv = scanf("%d", &num)) == EOF)
         return EXIT_FAILURE;
      else
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
     
      ok = rv == 1 && num >= 1 && num <= 9;
      if (!ok)
         puts("Entrada no valida");
   }while (!ok);
   
   printf("Numero: %d\n", num);
   
   return EXIT_SUCCESS;
}


Una tercera es colocar toda la operación (en este caso lectura) en una función, mas o menos así:
while ((rv = fn(...)) == 0){
   /* Entrada no valida o fuera de rango */
}
if (rv == EOF){
   /* Error critico */
}

/* ... (OK) */


----

Cita de: leosansan en 25 Febrero 2014, 19:47 PMP.D: Juraito, juraito que el código está bien indentado, pero no sé que pasa últimamente que al ponerlo en las Code se "desparrama".
Eso se debe a que en tu editor de texto estas indentando el código fuente con tabuladores en vez de espacios.

Un saludo
#460
Cita de: dmacias en 24 Febrero 2014, 22:26 PMSin esta linea, como comento en el comentario de arriba, el resultado a veces no es correcto
a2 = b2 = c2 = d2 = e2 = 0;
Eso sucede porque si no se inicializa una variable local su valor inicial es no definido o basura.

Con las variables a1, b1, etc. no hay problema porque lo primero que haces con ellas es asignarles un valor, por ejemplo:
case 1:
   a1 = a * n;


Pero con las variables a2, b2, etc. lo primero que haces con ellas es utilizar su valor, por ejemplo:
case 1:
   a1 = a * n;
   a2 += a1; /* a2 = a2 + a1 == ALGUN_VALOR + a1 */


Y deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

Un saludo