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

#711
Porque:
1) "p" es la variable que puede almacenar una dirección de memoria.
2) "*p" es el objeto en la dirección indicada por "p".

En otras palabras "p" es la dirección y "*p" el objeto apuntado.

Un saludo
#712
Programación C/C++ / Re: Archivos
30 Agosto 2013, 04:22 AM
Cita de: m@o_614 en 30 Agosto 2013, 00:10 AMlo que no entiendo, por que con fopen() no me escribe en el archivo y con open si?
Porque estas mezclando funciones del estándar POSIX (open y write) con funciones del estándar ISO (fopen).

En el caso de write su primer argumento es el descriptor de archivo y es de tipo int, no puedes pasar el valor de retorno de fopen porque este es de tipo "FILE *".

Un saludo
#713
Para darte una solución (una que funcione) debes primero indicar el lenguaje de programación que utilizas y publicar el código fuente del programa.

Cita de: angelihsahn en 30 Agosto 2013, 03:14 AM
1 Se crea una Farmacia con su nombre direccion y un numero de medicamentos (reservo memoria para n medicamentos y para ]nombre y direccion)

...


Pero como hago para que, si el usuario entra en la opción de imprimir o la de cambiar el nombre de un medicamento antes de Crear una farmacia, el programa le diga que NO hay una farmacia creada (evitar desbordamiento de memoria)?
Lo usual al implementar las listas es tener un contador para el numero de farmacias y, para cada una, del inventario. Eso puede ser manual en el caso de utilizar arrays o reserva dinámica de memoria o automático en el caso de un contenedor en C++ (por ejemplo un vector).

En un caso así basta con verificar si el contador para el numero de farmacias es cero.

Como ya te comente mejor publica el código fuente del programa.

Un saludo
#714
Cita de: m@o_614 en 27 Agosto 2013, 21:38 PMel programa es algo como esto:

int main()
{
    char B[TAM],*array[N];
    int i;
    for(i=0;i < N;i++)
    {
        printf("Dame el %d dato: ",i+1);
        gets(B);
        *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));
        strcpy(array[i],B);
        nombre_funcion(array,i);
    }
    return 0;
}

int nombre_funcion(char *a[],int i)
{
    int c[TAM];
    for(????;????';????)
    return 0;
}


en nombre_funcion tengo que pasarle por parametro cada uno de los punteros a los que le asigne memoria en la funcion main, y en el for tengo que recorrer la cadena para hacer un X procedimiento
En ese caso debes modificar la función ya que no tienes porque pasar la dirección del array (como tampoco se necesita el segundo parámetro).

Con los cambios para que solo imprima los caracteres que componen la cadena:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAM  10
#define N    10

int fn(char *a);

int main(void)
{
   char B[TAM],*array[N];
   int i;
   
   for(i = 0; i < N; i++){
      printf("Dame el %d dato: ",i + 1);
      gets(B);
      array[i] = malloc((strlen(B) + 1));
      strcpy(array[i], B);
      fn(array[i]);
   }
   
   return 0;
}

int fn(char *a)
{
   int i;
   
   for (i = 0; a[i] != '\0'; i++)
      putchar(a[i]);
   putchar('\n');
   
   return 0; /* Hay que devolver un valor util */
}


Otro detalle que te falta en tu programa es liberar la memoria reservada.

Un saludo
#715
Programación C/C++ / Re: Archivos
29 Agosto 2013, 04:00 AM
Si no tienes un libro de calidad sobre C deberías conseguir uno, por ejemplo "The C Programming Language", en el se trata el tema de copia de archivos (utilizando la entrada y salida estándar) en el primer capitulo.

Un problema con tu programa es verificar si la función read (parte del estándar POSIX) retorna NULL para indicar error (en esa situación la función retorna -1).

Es mas fácil realizar esa operacion utilizando la biblioteca estándar de C, con ella solo tienes que abrir los archivos con fopen y a continuación utilizar un bucle donde lees un carácter de la entrada y lo envías a la salida. Mas o menos así:
FILE *entrada;
FILE *salida;
int ch;

/* Apertura de archivos */

/* Procesamos todos los caracteres */
while ((ch = fgetc(entrada)) != EOF)
   fputc(ch, salida);

/* Cierre de archivos */

/* etc */


Un saludo
#716
Errores importantes hay varios:

* No indicar el numero de elementos de los arrays:
struct airline {
   int flight_N; // Flight number
   char origin_airp[];  // Originating airport code (three characters)
   char desti_airp[]; //Destination airport code (three characters)
   int start_time[];  //Starting time
   int arrive_time[];  //Arrival time
};

Ahí los arrays de caracteres debes declararlos con cuatro elementos, los arrays de enteros con dos.

* El numero de elementos en los arrays "city1" y "city2" esta mal, deben tener cuatro elementos (para los tres caracteres mas el '\0').

* Declaras el array "myfli" con cuatro elementos pero solo asignas valores a los primeros tres.

Un saludo
#717
Por lo que comentas no puedes pasar a la función "a" porque seria (en la llamada) de tipo "char **" como tampoco "*a[1]" porque es de tipo "char". Debes utilizar "a[0]", "a[1]", etc.

Pero para estar seguros habría que revisar el programa completo.

Un saludo
#718
Como ya te comentaron lo mejor es utilizar instancias de la clase string, con ellas los pasos son:
1) Lees la linea completa mediante string::getline.
2) Verificas su tamaño (función miembro size) y si es mayor que el permitido descartas el exceso mediante la función string::erase.
Por ejemplo:
Código (cpp) [Seleccionar]
string primera;
getline(cin, primera);
if (primera.size() > max_chars) // max_chars == maximo numero de caracteres
   primera.erase(max_chars, string::npos);


Si por alguna razón debes utilizar arrays de caracteres para almacenar las lineas los pasos son:
1) Lees la linea mediante la función istream::get, su funcionamiento es idéntico a istream::getline pero con la diferencia que el carácter delimitador ('\n' a menos que se especifique otro) se queda en el bufer de la entrada estándar.
2) Descartas el resto de la linea (por lo menos el '\n') mediante la función istream::ignore.
Por ejemplo:
Código (cpp) [Seleccionar]

const int max_chars = 5; // 4 caracteres mas el '\0'

// ...

char primera[max_chars];
cin.get(primera, max_chars);
cin.ignore(numeric_limits<int>::max(), '\n');


Un saludo
#719
Programación C/C++ / Re: ¿Qué hago mal?
23 Agosto 2013, 17:14 PM
Otro problema es el uso de las constantes 'STX', 'VT', etc. en el bloque:
else if(texto[i]>='0' && texto[i]<=';')
   textoencriptado[i]=texto[i]+'STX';
else if(texto[i]>='<' && texto[i]<='M')
   textoencriptado[i]=texto[i]+'VT';
else if(texto[i]>'M' && texto[i]<='Z')
   textoencriptado[i]=texto[i]+'SOH';
else if(texto[i]>=']' && texto[i]<='i')
   textoencriptado[i]=texto[i]-'DC4';
else if(texto[i]<='j' && texto[i]<='u')
   textoencriptado[i]=texto[i]-'ETX';

Ya que su valor es "implementation defined" (depende de la implementación).

Un saludo
#720
Lo usual en un sistema con direcciones de 32 bits es acceder a 4GB de memoria (2^^32 es igual a 4,294,967,296). En el caso de MS Windows una referencia en linea es Virtual Address Space.

Un saludo