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

#21
¿Nadie?
#22
Buenas, resulta que tengo que coger la información de un fichero .dat con la información de una matriz dinámica. Se supone que la estructura empleada es la siguiente:

typedef struct Matriz{
int f;
int c;
double **m;
}tMatriz;


He probado mil formas, pero no consigo coger correctamente la información del fichero. Ésta es la última forma que he probado:


int main()
{      
//Variables
FILE *fichero;
tMatriz *matriz;
char nombre[15];
int cantidad;
int i;
/****************************/

printf("Nombre del fichero: ");
gets(nombre);

if( (fichero= fopen(nombre, "rb") ) == NULL )
{
printf("\nEl fichero no existe. El programa se cerrará...");
Sleep(2500);
exit(1);
}

matriz = (tMatriz*) malloc( 20 * sizeof(tMatriz) );

matriz->m = (double**) malloc( 20* sizeof(double*) );

for(i=0; i < 20; i++)
matriz->m[i] = (double*) malloc( 20* sizeof(double) );


cantidad= fread(matriz, sizeof(tMatriz), 20, fichero);
printf("%d\n", cantidad);    //9
printf("%d\t%d", matriz->c, matriz->f);   //Basura

fflush(stdin);
getchar();

return 0;
}


El valor de 20 para las filas y columnas es uno elegido al azar.

Cuando imprimo los valores de 'c' y 'f', salen números que no tienen nada que ver con lo que corresponde. Y cuando intento imprimir los valores de la matriz, el programa peta y se cierra.

A ver si me podéis ayudar. Saludos.
#23
Muchísimas gracias a todos, ya lo he conseguido con vuestra ayuda. Gracias!!
#24
Hola, tengo que hacer una lista enlazada simple en la que los elementos que se insertan, sea de una forma ordenada (de menor a mayor). He hecho la función y no consigo que funcione como debe, no sé cuál es el fallo y cómo debo corregirlo...

Os dejo la función (creo que no hace falta poner todo el programa, pero si así fuera decídmelo y lo pongo (igual me he líado con el nombre de alguna variable en la traducción jeje):

LISTA *meterElementoOrdenado(int num, LISTA *lista)
{
LISTA *nodo_aux, *inicio;
int cont = 1;

inicio = lista;
nodo_aux = (LISTA*) malloc( sizeof(LISTA) );

if(nodo_aux == NULL)
printf("\nNo hay sitio para mas elementos...\n");

if(lista == NULL)
{
nodo_aux->numero = num;
nodo_aux->siguiente = NULL;
return nodo_aux;
}

else
{
do
{
          if(num < lista->numero)
          {
                                   nodo_aux->numero = num;
                                   nodo_aux->siguiente = lista->siguiente;
                                  lista->siguiente = nodo_aux;
                                  cont = 0;
           }
           lista = lista->siguiente;

}while( (lista != NULL) && (cont != 0) );

nodo_aux = inicio;
return nodo_aux;
}

}


Gracias de antemano y saludos.
#25
Muchas gracias por responder rir3760, pero ya he descubierto mi fallo.

Para ejecutar las opciones, usaba la siguiente función:

void ejecutarOpcion(LISTA *lista, int opcion);

No me había dado cuenta de cuál era el fallo hasta que he copiado esa función en el main y sí funcionaba. En como parámetro tenía que pasarle la dirección de memoria de la lista, entonces había que definir el parámetro con un doble puntero, para que los cambios afectaran a todo el programa y no sólo en la función. Me alegro de haber podido corregir el fallo por mi cuenta  :D

De nuevo, gracias por tu atención.

Saludos
#26
Buenas, mi problema es el siguiente. Tengo una lista simplemente enlazada que la inicializo con los elementos de un array generados aleatoriamente. Esos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.

La estructura:


typedef struct lista{
int numero;
struct lista *siguiente;
}LISTA;


La función para crear la lista

LISTA *crearLista(int num)
{
LISTA *lista;

lista = (LISTA*) malloc( sizeof(LISTA) );

lista->numero= num;
lista->siguiente= NULL;

return lista;
}

La función de añadir un elemento:


LISTA *anyadirElementoAlPrincipio(int num, LISTA *lista)
{
LISTA *nodo_nuevo;

nodo_nuevo= (LISTA*) malloc( sizeof(LISTA) );
if(nodo_nuevo == NULL)
printf("\nNo hay sitio para más números.\n");

       else
       {
       nodo_nuevo->numero = num;
       nodo_nuevo->siguiente= lista;
       }

return nodo_nuevo;
}


La función de ver la lista entera:


void mostrarLista(LISTA *lista)
{
printf("%d\n", lista->numero);

if(lista->siguiente != NULL)
mostrarLista(lista->siguiente);
}


En el main el uso de la función de añadir un elemento es exactamente igual con los elementos del array y con el introducido desde el teclado... Si ayudara en algo, decídmelo y lo pongo también.

Gracias de antemano y saludos.

PD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
#27
Cita de: x64Core en 29 Marzo 2013, 18:09 PM
Estas seguro que esa es la salida de ese codigo?
Recordar que haces un pos incremento.
Sí, lo he probado con más de un compilador.
#28
Programación C/C++ / Incremento de punteros
29 Marzo 2013, 17:43 PM
Buenas, mi problema esta vez es el siguiente.

En realidad me gustaría que me explicarais el porqué de este resultado de este código.

El código:
#include <stdio.h>

#define MAXLINE 60

int main()
{
char *ptr;
ptr = (char*) malloc(MAXLINE * sizeof(char) );

printf("Introduce una frase: ");
fgets(ptr, MAXLINE+1, stdin);

printf("\n%p = %c", ptr,*ptr);
ptr++;
printf("\n%p = %c", ptr, *ptr);

printf("\n\n%p %p", ptr, ptr++);

getchar();

return 0;
}


El resultado:


Mi duda es, ¿por qué hace el incremento "al revés"? Después de haber incrementado el puntero en uno para que apunte al segundo carácter (ahí en cambio no hay problema), luego en el printf no es la misma dirección de memoria.

Saludos y gracias de antemano.
#29
Cita de: avesudra en 26 Marzo 2013, 20:25 PM
Fíjate en esta sentencia:
palabras[i] = '\0';
¿A qué le estás asignando el carácter nulo, al array de caracteres o al array de punteros? :silbar:



Menudo despiste... Pensaba que la aritmética de punteros ya la dominaba por completo  ;D

Muchas gracias.
#30
Buenas, mi ejercicio es el siguiente: tengo que guardar un string en un array, y luego decir cuál es la palabra que más se repite. Para ello, he pensado guardar cada palabra en un array de punteros, y luego hacer las comparaciones y tal.

El problema viene cuando intento copiar manualmente caracteres en los arrays de punteros. En el siguiente ejemplo:


void copiarPalabras(char *string, char *palabras[]);
{
         int  i = 0;
         //Para las primeras 10 letras, por ejemplo
         palabras[0] = (char*) malloc(10 * sizeof(char) );

        while( *(string+ i) != ' ' )   //Copiamos la primera palabra de la frase
       {
       *(palabras[0] + i) = *(string+ i);
       i++;
       }
palabras[i] = '\0';
}

Si, por ejemplo, guardo desde el teclado "hola que tal" en string, en palabras[0] no sólo no se copia "hola", sino basura (strlen me dice que hay 24 caracteres en total). Si compruebo las vueltas que ha dado el bucle, efectivamente son 4 , el número de letras, y además añado el '\0' al final. Funciona mal reserve el espacio que reserve con malloc.

PD: con calloc en lugar de malloc sí funciona correctamente, pero quiero saber qué es lo que hago mal en esa función como está.

Gracias y saludos.