Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con Programa en C

Estas en el tema de Problema con Programa en C en el foro de C/C++ en Foros del Web. Buenas tardes, estoy en primero de carrera y estoy empezando con este lenguaje (C). Me piden que entregue un programa antes de las 23:00(hora española, ...
  #1 (permalink)  
Antiguo 10/05/2015, 10:12
 
Fecha de Ingreso: mayo-2015
Mensajes: 1
Antigüedad: 8 años, 11 meses
Puntos: 0
Problema con Programa en C

Buenas tardes, estoy en primero de carrera y estoy empezando con este lenguaje (C).
Me piden que entregue un programa antes de las 23:00(hora española, 17:00 en este foro), de hoy y tengo varios problemas.
Supongo que para vosotros sera una tonteria, pero llevo una semana buscandole los fallos, que creo que se deben a los punteros, y no encuentro la forma de hacer que el programa funcione.
Si por favor, pueden echarle un vistazo y ver en que me estoy equivocando.
Al compilarlo, no me da ningun tipo de error. Pero al ejecutarlo, y al llegar a la parte de encolar(), a ese bucle for, el programa se cuelga, diciendome que ha dejado de funcionar, y que cierre el programa.

El programa trata sobre una cola circular. El programa lo ejecutamos con <nombredelprograma> y el nombre de 6 ficheros. A continuacion se lanza un dado, y se añaden a la cola, los primeros x ficheros(x es el numero que se saque con el dado), añadiendole a cada nombre la extension .txt . Luego se muestra en pantalla la cola, y a continuacion de desencola el primer fichero de la cola. Luego se pregunta si quiere que se repita el proceso, o si quiere terminar.

Código:
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <conio.h>

#define N 10+1
#define Nficheros 7
#define numcaracteresmax 12

typedef struct{
		char *arraycola[N];
		int inicio;
		int final;
} tCola;

void inicializarCola(tCola cola);
int compColaLlena(tCola cola);
int compColaVacia(tCola cola);
void encolar(tCola cola,char *array[],int i);
void desencolar(tCola cola);
void imprimeCola(tCola cola);

int main (int argc, char*argv[]){

int errorvar;
int i;
int v;
int tamano;
int tirada;
int compLlena;
int compVacia;
int decision;
tCola cola;

/* Comprobacion de Errores */
errorvar=0;
compLlena = 0;
compVacia = 0;

	if (argc != Nficheros){
		errorvar = 1;
		printf("\nError. Debe ejecutar el programa de la siguiente manera:\n<nombredelprograma> <fichero1> <fichero2> <fichero3> <fichero4> <fichero5> <fichero6>");
	}else{
		for(i=0; i<argc; i++){
			tamano = (int)strlen(argv[i]);
			if(tamano > numcaracteresmax){
			printf("\nError. El fichero numero %d tiene un nombre demasiado grande.\nMaximo %d caracteres.", i, numcaracteresmax);
			errorvar = 1;
			}
		}
	}
/* */
	if(errorvar != 1){
		inicializarCola(cola);
		printf("\nSe procedera a tirar un dado");
		printf("\nPresione una tecla...");
		getch();
		do{
		tirada = 1+rand()%6;
		printf("\nLa tirada es %d", tirada);
		printf("\nSe procedera a encolar los primeros %d ficheros\nPulse una tecla para continuar...", tirada);
		getch();
		for(v=0;v<tirada;v++){
			if(compLlena != 1){
			encolar(cola, argv, v);
			printf("\n Se ha encolado el fichero %s en el puesto %d",cola.arraycola[v+cola.final],v);
			compLlena = compColaLlena(cola);
			}
			else{
				printf("\n No se ha encolado el fichero numero %d porque la cola esta llena",v);
			}
		}
		printf("\nFinalizado proceso de encolado...");
		getch();
		imprimeCola(cola);
		compColaVacia(cola);
		if(compVacia != 1){
			desencolar(cola);
			printf("\nSe ha desencolado %s.txt",cola.arraycola[cola.inicio]);
		}else{
			printf("\nLa cola esta vacía. No se puede desencolar.");
		}
		printf("\nPulse 0 si desea finalizar o pulse 1 si desea volver a realizar una tirada.");
		scanf("%d", &decision);
		}while(decision != 1);
		printf("Finalizado");
	}
	return 0;
}
void inicializarCola(tCola cola){
	cola.inicio = 0;
	cola.final = 0;
}
int compColaLlena(tCola cola){
	int boolean;
	if ((cola.final+1)%N == cola.inicio){
		boolean = 1;
	}
	else{
		boolean = 0;
	}
	return boolean;
}
int compColaVacia(tCola cola){
	int boolean;
	if (cola.inicio == cola.final){
		boolean = 1;
	}else{
		boolean = 0;
	}
	return boolean;
}
void encolar(tCola cola,char *array[],int i){
		strcat(array[i+1], ".txt");
		strcpy ( cola.arraycola[i+cola.final], array[i+1]);
		cola.final = (cola.final+1)%N;
}
void desencolar(tCola cola){
	cola.inicio = (cola.inicio+1)%N;
}
void imprimeCola(tCola cola){
	int indice;
	printf("\n El contenido de la cola es: ");
	for(indice=cola.inicio; indice != cola.final; indice=(indice+1)%N){
	 printf("\n %s", cola.arraycola[indice]);
 }
}
Muchas gracias por todo :)

Última edición por jmcano; 10/05/2015 a las 10:25
  #2 (permalink)  
Antiguo 11/05/2015, 01:09
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problema con Programa en C

Código C:
Ver original
  1. char *arraycola[N];

¿Qué estás pretendiendo conseguir con esa declaración?
  • almacenar un número indeterminado de cadenas de longitud N??
  • almacenar N cadenas de longitud indeterminada??
  • almacenar una única cadena de caracteres pero te has confundido al añadir el asterisco??

Si tu respuesta es una de las dos primeras tengo una mala noticia para tí... el asterisco indica que hay memoria que vas a gestionar de forma dinámica (con malloc, free)... pero tú no estás haciendo tal cosa. En su lugar estás accediendo a memoria no reservada (y eso es lo que hace que tu programa falle).

Imagino que lo que intentas es la opción 2... en ese caso puedes evitar el uso de memoria dinámica si pasas a usar una array de longitud fija:

Código C:
Ver original
  1. char arrayCola[N][100];

El ejemplo anterior declara un array de N elementos, cada uno de los cuales te permitirá almacenar una cadena de hasta 100 caracteres (no te olvides de que el caracter nulo de final de cadena también cuenta). Basta con que adaptes ese '100' a tus necesidades.

Un saludo

Etiquetas: char, funcion, int, lenguaje, numero, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:16.