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 - neveldine

#11
Ya está solucionado, el problema era que al visualizar los registros el bucle tiene que ser:


fread(p_per, sizeof(t_persona), 1, pf);
while (!feof(pf) && !ferror(pf)) {
printf("%s\n", p_per->nombre);
printf("%s\n", p_per->direccion);
printf("%d\n", p_per->telefono);
fread(p_per, sizeof(t_persona), 1, pf);
}
#12
Bases de Datos / Problema con relación 1:1
25 Noviembre 2015, 14:01 PM
Tengo esta base de datos:

Código (sql) [Seleccionar]

CREATE TABLE ehbd.Clientes (
idClientes INT NOT NULL AUTO_INCREMENT ,
    nombre VARCHAR(64) NOT NULL,
    PRIMARY KEY (idClientes),
    FOREIGN KEY (idUsuarios) REFERENCES ehbd.Usuarios(idUsuarios)
) engine=innodb;

create table ehbd.Usuarios (
idUsuarios int not null auto_increment ,
   username varchar(64) not null,
   email varchar(64) not null,
   primary key(idUsuarios),
   foreign key(idClientes) references ehbd.Clientes(idClientes)
) engine=innodb;



Necesito relacionar estas dos bases de datos con una relación 1:1. Esto me da error porque en la primera tabla defino una foreign key a una tabla Usuarios que todavía no existe.

¿Cómo podría hacer esto sin juntar las tablas?

Gracias anticipadas.

Un cordial saludo
#13
Hola,
Tengo un problema con este programa. Como podéis ver cuando muestro los registros del fichero los duplica.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "MemoryManager.h"

#define N 80
#define SALIR 4

typedef struct {
char nombre[N];
char direccion[N];
int telefono;
} t_persona;


int tolower(int);
int menu(void);
void crearFichero(FILE **pf);
void introducirRegistros(FILE *pf);
void visualizarFichero(FILE *pf);

/**
* Punto de entrada y salida al programa principal
*/
int main()
{
int op = 0;
FILE *pf = NULL;

do {
op = menu();

switch (op)
{
case 1: // crear fichero
crearFichero(&pf);
break;

case 2: // introducir registros
introducirRegistros(pf);
break;

case 3: // visualizar registros
visualizarFichero(pf);
break;

case 4: // salir
printf("bye bye\n");
break;
}
} while (op != SALIR);

fclose(pf);
MemoryManager_DumpMemoryLeaks();
return 0;
}

int tolower(int c)
{
const int dsp = 'a' - 'A';

if (c >= 'A' && c <= 'Z')
return c + dsp;
return c;
}

int menu(void)
{
int op = 0;
char linea[N] = { 0 };

do {
printf("\n");
printf("1. Crear fichero\n");
printf("2. Introducir registros\n");
printf("3. visualizar registros\n");
printf("4. salir\n");

printf("\topcion: ");
fgets(linea, N, stdin);
sscanf(linea, "%d", &op);
} while (op < 1 || op > 4);

return op;
}

void crearFichero(FILE **pf)
{
char nomFichero[N] = { 0 };
char resp = 0;
char linea[N] = { 0 };

printf("Nombre del fichero: ");
fgets(nomFichero, N, stdin);
nomFichero[strlen(nomFichero) - 1] = 0;

if (*pf != NULL) {

// existe, preguntar si se sobreesribe
do {
printf("Desea sobreescribir el fichero");
fgets(linea, N, stdin);
sscanf(linea, "%c", &resp);
} while (tolower(resp) != 's'
&& tolower(resp) != 'n');

if (tolower(resp) == 'n')
return;
}

*pf = fopen(nomFichero, "w+b");
}

void introducirRegistros(FILE *pf)
{
char resp = 0;
char linea[N] = { 0 };

t_persona *p_per = malloc(sizeof(t_persona));
memset(p_per, 0, sizeof(t_persona));
if (p_per == NULL)
{
printf("memoria insuficiente");
exit(-1);
}


do {
printf("\n------\n");
printf("Nombre: ");
fgets(p_per->nombre, N, stdin);
p_per->nombre[strlen(p_per->nombre) - 1] = 0;

printf("Direccion: ");
fgets(p_per->direccion, N, stdin);
p_per->direccion[strlen(p_per->direccion) - 1] = 0;

printf("Telefono: ");
fgets(linea, N, stdin);
sscanf(linea, "%d", &p_per->telefono);

rewind(pf);
fwrite(p_per, sizeof(t_persona), 1, pf);

do {
printf("\nDesea introducir otro registro: ");
fgets(linea, N, stdin);
sscanf(linea, "%c", &resp);
} while (tolower(resp) != 's'
&& tolower(resp) != 'n');
} while (tolower(resp) == 's');

free(p_per);
}

void visualizarFichero(FILE *pf)
{
char linea[N] = { 0 };
int pos = 0;

t_persona *p_per = malloc(sizeof(t_persona));
if (p_per == NULL)
{
printf("memoria insuficiente");
exit(-1);
}

rewind(pf);

while (!feof(pf) && !ferror(pf)) {
fread(p_per, sizeof(t_persona), 1, pf);
printf("%s\n", p_per->nombre);
printf("%s\n", p_per->direccion);
printf("%d\n", p_per->telefono);
}

free(p_per);
}




1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 1
Nombre del fichero: red.datos

1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 2

------
Nombre: Marina
Direccion: vereda
Telefono: 234
Desea introducir otro registro: n

1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 3

Marina
vereda
234
Marina
vereda
234


Gracias anticipadas.

Un cordial saludo
#14
Si lo necesitas siempre puedes hacer una compilación condicional


#ifdef WIN32
system("cls");
#else
system("clear");
#endif
#15
Vale, por lo que me dices, entiendo que el sistema operativo detecta el fallo de segmento cuando te sales del rango de direcciones que te asigna, ¿verdad?

Creo que voy a tener que leer más sobre el heap...
#16
Lo que intentas se puede solucionar con realloc:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void leer(double **);

int main()
{
    double *p = NULL;
    leer(&p);
    free(p);

    return 0;
}

void leer(double **pdata)
{
    int i = 1;
    char opc;

    do {
        printf("dato: ");
        *pdata = realloc(*pdata, sizeof(double) * i);
        scanf("%lf", *pdata+(i-1));
        i++;
        getchar();
        printf("mas datos (s/n)? ");
        scanf("%c", &opc);
    } while (opc == 's' || opc == 'S');
}

#17

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SUP 33799

int main()
{
   int *cad = NULL;
   int i;

   cad = malloc(sizeof(int) * 2);

   for (i = 0; i < SUP; i++) {
       cad[i] = i;
       printf("%d ", cad[i]);
   }
   printf("\n");
   
   return EXIT_SUCCESS;
}


Si SUP es, por ejemplo, 20, no hay Segment fault. Si le doy un valor, por ejemplo, 33799 lanza este error al ejecutar el programa.

¿Por qué no da error de segmento a partir de cad[2]?

Gracias de antemano