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

#671
El error se debe en parte a la declaración:
typedef struct
{
   st_num *head;
   st_num *last;
}fila;

Con ella no estas declarando una variable sino un alias o nombre alternativo "fila". Para declarar una variable con ese nombre debes cambiar la linea eliminando la palabra reservada "typedef":
struct
{
   st_num *head;
   st_num *last;
}fila;

Y como es una variable y no un puntero debes cambiar en tu programa todas las instancias de "fila->" por "fila.".

También hay otros errores como:
if(i=0) //Edicion de primer elemento
Ahí estas utilizando el operador de asignación "=" cuando debería ser el de comparación "==".

Un saludo
#672
Cita de: m@o_614 en  3 Octubre 2013, 20:22 PMTengo el siguiente codigo que me tiene que comprimir un archivo cuando aparecen las siguientes palabras: de , para , con , desde , al ,y se tienen que sustituir con los siguientes signos: *, /, + ,- ,@ y escribir el texto comprimido(con las sustituciones) en otro archivo.
Leer las lineas de texto del archivo y comprimirlas son dos operaciones que deberías separar en funciones, esto para hacer mas fácil el desarrollo del programa.

En la lectura del archivo sigues con algunos errores que ya te había comentado como almacenar el valor de retorno de fgetc en una variable de tipo char cuando debería ser de tipo int, si no lo haces puedes tener problemas para detectar el estado de fin de archivo.

En cuanto a la compresión puedes verificar cada carácter de la linea y si este es un espacio comparar el resto utilizando la función strncmp, un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char linea[] = "El libro de Mary es para la clase de mate con la maestra Ana";
   char *palabra[] = {" de "," para "," con "," desde "," al "};
   size_t num_pals = sizeof palabra / sizeof palabra[0];
   char ch[] = "*/+-@";
   size_t i;
   size_t j;
   
   i = 0;
   while (linea[i] != 0){
      if (linea[i] == ' ')
         for (j = 0; j < num_pals; j++)
            if (strncmp(linea + i, palabra[j], strlen(palabra[j])) == 0)
               break;
     
      if (linea[i] == ' ' && j != num_pals){
         putchar(ch[j]);
         i += strlen(palabra[j]);
      }else
         putchar(linea[i++]);
   }
   putchar('\n');
   
   return EXIT_SUCCESS;
}


También hay que considerar que la entrada puede tener alguno de los caracteres utilizados para la compresión ('*', '/', etc.), de existir lo usual es escapar el carácter agregando un carácter especial antes de este, por ejemplo en C para imprimir la diagonal invertida se debe utilizar '\\'.

Un saludo
#673
Cita de: ivancea96 en  4 Octubre 2013, 16:15 PMPor cierto,Función Variadica? De donde sacaste eso?
En mi vida lo oí
Son las funciones que reciben un numero variable de argumentos, por ejemplo printf o scanf. Mas información en la pagina (cortesía de Wikipedia) Variadic function.

Un saludo
#674
Cita de: XorNet en  4 Octubre 2013, 15:52 PMcómo se le denomina a esto que trato de entender?
Es solo una función que retorna un puntero, no tiene un nombre especial.

Un saludo
#675
Una explicacion en detalle de ese tema se encuentra en la pagina Evaluación de "cortocircuitos" en Microsoft Visual Basic .NET

Un saludo
#676
Programación C/C++ / Re: problema con archivos
3 Octubre 2013, 18:52 PM
Cita de: m@o_614 en  2 Octubre 2013, 23:55 PMAhora el programa ya me hace lo que le pido, solo que tengo que corregir esa ultima falla de si el nombre buscado se encuentra al final que tambien lo contabilice
Ademas de las recomendaciones que ya te dieron hay que cambiar el tipo de la variable "car" ya que el valor de retorno de fgetc es int, hay que cerrar el archivo con fclose y se puede eliminar el uso de feof si, en su lugar, se verifica el valor de retorno de fgetc:
j = 0;
do {
   if ((car = fgetc(fd)) == ',' || car == EOF){
      cadena[j] = '\0';
      if ((strcmp(cadena, nombre)) == 0)
         i++;
      j = 0;
   }else
      cadena[j++] = car;
}while (car != EOF);
fclose(fd);


Algo que no mencionas es si el archivo consiste de una sola linea o varias, en el segundo caso se debe considerar al avance de linea como otro separador. Una opciona aqui es utilizar la funcion fscanf para obtener cada uno de los nombres:
while (fscanf(fd, "%[^,\n]%*c", cadena) == 1)
   if ((strcmp(cadena, nombre)) == 0)
      i++;
fclose(fd);


Un saludo
#677
La función "Descargar" la puedes acortar a:
Código (cpp) [Seleccionar]
DWORD WINAPI Descargar(void *Nada)
{
   int num_bytes;
   
   while ((num_bytes = recv(Socket, Buffer, Bufflen, 0)) > 0)
      fwrite(Buffer, 1, num_bytes, MyFile);

   return 0;
}


También debes abrir el archivo en modo binario con "wb" y falta cerrarlo llamando a fclose.

Un saludo
#678
Programación C/C++ / Re: Ayuda con punteros
2 Octubre 2013, 02:30 AM
El programa tiene algunos errores.

* El primer argumento de las funciones es "int *matriz[]" cuando debería ser "int *matriz" (también es valido "int matriz[]").

* No es necesario el uso del operador "dirección de" (el '&') en las llamadas a función:
CrearBaraja(&cartas, ncartas);
ImprimirBaraja(&cartas, ncartas);


* La declaración del array:
int ncartas=40;
int cartas[ncartas];

En el mejor de los casos es problemático ya que depende del estándar indicado al compilar (en C90 no se permite, en C99 si y en C11 es opcional).

El programa con los cambios:
#include <stdio.h>

#define NCARTAS  40

void CrearBaraja(int *matriz, int numerocartas);
void ImprimirBaraja(int *matriz,int numerocartas);

int main(void)
{
   int cartas[NCARTAS];

   CrearBaraja(cartas, NCARTAS);
   ImprimirBaraja(cartas, NCARTAS);

   return 0;
}

void CrearBaraja(int *matriz, int numerocartas)
{
   int j;
   for(j=0;j<numerocartas;j++)
   {
       matriz[j]=(j%10)+1;

   }
}

void ImprimirBaraja(int *matriz,int numerocartas)
{
   int j;
   for(j=0;j<numerocartas;j++)
   {
       printf("Carta %d = %d\n",j+1,matriz[j]);
   }
}


Un saludo
#679
Programación C/C++ / Re: problema con getc()
29 Septiembre 2013, 03:12 AM
Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMestas seguro que el getc() retorna un int?
Si.

Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMes que leia en una pagina que me regresaba el caracter leido del fichero
Cierto pero la función debe retornar el carácter leído (puede ser cualquiera) o bien EOF en caso de error o fin de archivo. Ese rango de valores (cualquier carácter mas EOF) es uno mas del que que se puede almacenar en una variable de tipo char, por eso las funciones getchar, getc y fgetc retornan un valor de tipo int.

Si no tienes un referencia de calidad es hora de conseguir una, así puedes resolver dudas de este tipo en cuestión de minutos.

Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMel unico problema es que no me imprime el caracter vacio pero si me imprime los 3 caracteres que le siguen, como puedo corregir esto?
Porque el espacio lo acabas de leer al utilizar fgetc, lo mas sencillo es regresar ese carácter al stream mediante la función ungetc antes de la llamada a fgets:
ungetc(car, fd);
fgets(palabra, strlen(p[i]), fd);


Aparte de eso en el programa tienes un bucle que itera una solo vez, no es necesaria la conversión explicita en la llamada a malloc y no tiene caso utilizar "sizeof(char)" ya que este siempre es igual a uno.

Un saludo
#680
Cita de: Miky Gonzalez en 28 Septiembre 2013, 12:01 PM
supongamos que sólo tengo una función que me permite cojer 1 solo caracter numérico (getch() - 48). ¿Cómo podría hacer para cojer mas de un caracter?.
Utilizas un bucle donde lees cada uno de los dígitos utilizando estos para generar el numero, el resto de la linea (por lo menos el '\n') lo descartas con otro bucle.

Un ejemplo básico (sin validaciones) utilizando la función getchar (tu caso es similar):
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int ch;
   int num;
   
   printf("Introduce el numero: ");
   fflush(stdout);
   num = 0;
   /* Procesamos cada uno de los digitos */
   while ((ch = getchar()) >= '0' && ch <= '9')
      num = num * 10 + ch - '0';
   /* Descartamos el resto de la linea */
   while (ch != EOF && ch != '\n')
      ch = getchar();
   
   printf("num == %d\n", num);
   
   return EXIT_SUCCESS;
}


Un saludo