PDA

Ver la versión completa : [Ayuda] Programando en Windows y C



Bizkaitarra
02/07/2010, 10:14
Buenas,

Tengo unas prácticas de PVM en C pendientes de hacer para un asignatura. Si las hago apruebo así que tengo que hacerlas si o si ;)

Bueno, el caso es que como no tengo curro ahora mismo y me ha dicho el jefe que haga tutoriales C pues que mejor momento para hacer la práctica en el curro.

Estoy intentando hacer un Hello Word simple.

He descargado el Eclipse para C:


Eclipse IDE for C/C++ Developers

Version: Helios Release
Build id: 20100617-1415

Y cuando quiero compilar el código me dice que no están configurados los makefiles.

Tengo una ligera idea de lo que es un makefile de en su día utilizarlos en las asignaturas de sistemas operativos, pero no encuentro por ningún lado un makefile de C válido para windows y el eclipse

¿Qué tengo que hacer para poder compilar con windows y eclipse?

Mi idea es ir programando tareas no dependientes de PVM en el curro y luego en casa con Ubuntu y PVM añadirle los comandos necesarios e integrar todo.

¿Alguien me ayuda?

Jurk
02/07/2010, 10:28
a mi los makefiles me dan patras...

yo utilizo dev-cpp que me a como la seda

Bizkaitarra
02/07/2010, 11:30
a mi los makefiles me dan patras...

yo utilizo dev-cpp que me a como la seda


Ok, voy a probar porque yo lo que quiero es simplemente ir aprendiendo C para cuando tenga que hacer en linux... me da igual el IDE

< - >
Perfecto, sencillo y para toda la familia!!!

Justo lo que buscaba

Muchas gracias!!

Nathrezim
02/07/2010, 13:43
a mi los makefiles me dan patras...

yo utilizo dev-cpp que me a como la seda

+1, para proyectos de tamaño medio es lo mejor que hay, antes de meterse con el mastodóntico Visual C++. Si estuviera un poco depurado el tema de depuración sería simplemente perfecto. Además tiene un montón de paquetes de librerías preconfigurados y configuraciones para usar librerías externas más que fáciles facilísimas.

Drumpi
03/07/2010, 01:20
Dev-c++, aunque odiado por cientos de programadores, es lo más sencillo para iniciarse en la programación.
Yo estoy usando eclipse y... bueno, eso de usar... si es un proyecto con makefiles sí, pero de C, ni idea, y claro, un "hola mundo" requiere aprender bases de C y de hacer makefiles... o usar el tipo de proyecto "hello world" que te lo da todo hecho.

Hoy día, si no puedo usar dev-c++, uso la linea de comandos. En serio, escribir "gcc hola.c -o hola.exe" o "g++ hola.cpp -o hola.exe" es más sencillo que usar eclipse (en mi caso arm-none-linux-gnueabi-g++ ...).

Bizkaitarra
03/07/2010, 12:00
Sigo con las dudas:

Tengo un fichero con los datos de la siguiente forma:


......
9.9066113281250000e+002 4.8840050585567951e-003
9.9067181396484375e+002 9.7680101171135902e-003
9.9068249511718750e+002 9.7680101171135902e-003
9.9069317626953125e+002 9.7680101171135902e-003
9.9070391845703125e+002 9.7680101171135902e-003
......Los datos que me interesan son los de la segunda columna, deben tratarse como double.

Estoy utilizando scanf pero en lugar de obtener 9.9066113281250000e+002 me obtiene solo el 9.... ¿Alguna sugerencia?


Pongo el código que estoy usando para ver si podeis echarme un cable que me estoy desesperando...



#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <conio.h>


void transformar(int num, char fichero[] ) {

printf("Voy a abrir el fichero\n %s \n",fichero);


FILE *archivo;
char caracter;
double numGuardado;

archivo = fopen(fichero,"r");
if (archivo == NULL){

printf("\nError de apertura del archivo. %s \n\n",fichero);
}else{


printf("\nSe va tratar el fichero \n\n");

while (feof(archivo) == 0)
{

fscanf(archivo,"%d",&numGuardado);
printf("\n\n %e \n\n",numGuardado);
printf("\n\n %d \n\n",numGuardado);
break;
}
}




}
EL fichero que se le pasa y abre bien tiene los siguientes primeros datos:


9.8962322998046875e+002 1.4652014710009098e-002
9.8963391113281250e+002 1.7094017937779427e-002
9.8964459228515625e+002 1.4652014710009098e-002
9.8965527343750000e+002 1.7094017937779427e-002
9.8966601562500000e+002 2.1978022530674934e-002
9.8967669677734375e+002 1.9536020234227180e-002
9.8968737792968750e+002 1.7094017937779427e-002Y la salida del programa me da lo siguiente:


2.758910e+262


9

Wave
03/07/2010, 12:22
fscanf(archivo,"%d",&numGuardado);
Con el %d coge un entero, has de usar uno de estos:
e,E,f,g,G Floating point: Decimal number containing a decimal point, optionally preceeded by a + or - sign and optionally folowed by the e or E character and a decimal number. Two examples of valid entries are -732.103 and 7.12e4 float *
http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

Bizkaitarra
03/07/2010, 12:47
fscanf(archivo,"%d",&numGuardado);
Con el %d coge un entero, has de usar uno de estos:
e,E,f,g,G Floating point: Decimal number containing a decimal point, optionally preceeded by a + or - sign and optionally folowed by the e or E character and a decimal number. Two examples of valid entries are -732.103 and 7.12e4 float *
http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/


Muchas gracias

Y de todos esos, ¿cual cogerías tu?


Esto de C es una liada bien grande jeje

Voy ha hacer la prueba con E haber si cuela....

Realmente lo que me interesa es almacenarlos en una variable para luego hacer cálculos con ellos y que sean lo más precisos posibles

<>
He probado ya con E y lo que más extraño me resulta es que pese a que el primer número del fichero es 9.8962322998046875e+002 el número que recoge es 2.758911e+262

¿Porque me coge este número que no éxiste en el fichero que está abriendo? Y he comprobado que está abriendo el fichero que está abriendo y no ningún otro a base de renombrar el fichero en cuestión para que de error y luego volver a ponerle su nombre.

< - >
Al final lo he pillado como un string y luego lo he transformado a double.

Como String me pilla todo con total precisión pero luego el Double me pilla solo 9.896232e+002, vamos que redondea

¿Cual es el tipo de dato float más grande en C para que no me haga este redodeo?



void transformar(int num, char fichero[] ) {

printf("Voy a abrir el fichero\n %s \n",fichero);


FILE *archivo;
char caracter;
double numGuardado;
char strGuardado[256];

archivo = fopen(fichero,"r");
if (archivo == NULL){

printf("\nError de apertura del archivo. %s \n\n",fichero);
}else{


printf("\nSe va tratar el fichero \n\n");
int numPalabras = 0;
while (feof(archivo) == 0)
{

//fscanf(archivo,"%e",&numGuardado);
fscanf(archivo,"%s",strGuardado);

numPalabras++;
printf("\n\n %s \n\n",strGuardado);
numGuardado = atof ( strGuardado);

printf("\n\n %e \n\n",numGuardado);
break;
}
printf("\n\n El total de numeros almacenado es : %d \n\n",numPalabras);
}




}He descubierto que es long double pero no encuentro ninguna función diferente a atof que me lo convierta con la precisión de un long double...


Por lo que parece me hace bien la cosa, me guarda todo pero al printear es cuando acorta.

He realizado la prueba de restar 1 al número double almacenado y me encontrado con que el printeo es el mismo que sin quitarle con lo que deduzco que está bien guardado :)

Pues nada, siguiente paso que es guardar todo lo que me vale en un array :):)

Wave
03/07/2010, 12:58
Yo es que estoy bastante oxidado de C xD pero bueno me alegra haber servido algo de ayuda.

Bizkaitarra
03/07/2010, 13:43
Yo es que estoy bastante oxidado de C xD pero bueno me alegra haber servido algo de ayuda.

Sip, de bastante ayuda además :):)

Muchas gracias!!

Nathrezim
03/07/2010, 14:07
Si quieres sacar más precision con el print mírate los parámetros del print, detrás del %f puedes formatear como se escribe el número, diciendo entre otras cosas el número de decimales que quieres que te saque en dicho print. Ahora mismo no me acuerdo si separando con una coma y poniendo un número te pone ese mismo número de decimales (rellena con 0 si la variable no tiene suficiente precision), pero googleando no creo que te cueste encontrarlo.

FlipFlopX
03/07/2010, 14:29
Si quieres sacar más precision con el print mírate los parámetros del print, detrás del %f puedes formatear como se escribe el número, diciendo entre otras cosas el número de decimales que quieres que te saque en dicho print. Ahora mismo no me acuerdo si separando con una coma y poniendo un número te pone ese mismo número de decimales (rellena con 0 si la variable no tiene suficiente precision), pero googleando no creo que te cueste encontrarlo.


Yep, con %.xf siendo x el número de decimales que quieres.

Bizkaitarra
03/07/2010, 16:10
Si quieres sacar más precision con el print mírate los parámetros del print, detrás del %f puedes formatear como se escribe el número, diciendo entre otras cosas el número de decimales que quieres que te saque en dicho print. Ahora mismo no me acuerdo si separando con una coma y poniendo un número te pone ese mismo número de decimales (rellena con 0 si la variable no tiene suficiente precision), pero googleando no creo que te cueste encontrarlo.


Yep, con %.xf siendo x el número de decimales que quieres.


Muchas gracias a los dos.

Lo que realmente quiero es en el bucle que tengo ir pillando los números que me interesan y almacenarlos en un array de doubles así que de momento me da igual que no se imprima bien ;)

hardyx
04/07/2010, 02:20
Aquí tienes un tutorial de C muy sencillo:
http://www.elrincondelc.com/cursoc/cursoc.html

Bizkaitarra
05/07/2010, 19:04
Aquí tienes un tutorial de C muy sencillo:
http://www.elrincondelc.com/cursoc/cursoc.html


Muy útil :)

Ya le echado un ojo :)


Tengo un expediente X.....

Tengo un código con una variable int pasada por parámetro llamada tamano.
La printeo y me pone tal y como debe ser, 8192.
La vuelvo a printear sin aparentemente hacer nada extraño y me sale


double obtenerMedia(int limiteInf, int limiteSup,int tamano,double arrNums[]) {

//Recorrer el array y sumar todos sus contenidos para luego dividir entre el tamano
double suma =0;
double media;

int i=limiteInf;
printf("\n\n Loop de %d a %d con tamano %d",limiteInf,limiteSup,tamano);
printf("\n\n El tamano es : %d \n\n",tamano);
printf("Press ENTER to continue...\n");
getchar();

while (i<limiteSup) {
//printf("\n\n Sumando numero %d con valor %d",i,arrNums[i]);
suma += arrNums[i];
i++;
}

//Pasa mal el tamano, eso es lo que tengo que mirar
printf("\n\n El tamano para dividir es : %d \n\n",tamano);
printf("Press ENTER to continue...\n");
getchar();
printf("\n\n La media sera %d entre %d ",suma,tamano);
media = suma / tamano;
printf("\n\n La media es %d ",media);
getchar();
return media;
}Y la salida en pantalla es


El tamano para dividir es : 8192
Press ENTER to continue...

La media sera 456922880 entre 1085745437

La media es 456922880
Estoy desesperado... solo se me ocurre que se esten pisando la memoria o algo así...

SplinterGU
05/07/2010, 19:54
%d es int (entero)
%ld es long
%u es unsigned int
%hd es short
%hu es unsigned short
%f es float/double
%e es float/double con notacion cientifica
%g es float/double con notacion cientifica o no, segun cantidad de digitos

http://manpages.ubuntu.com/manpages/jaunty/es/man3/printf.3.html

google es manifico cuando uno tiene dudas

< - >
otra cosa, cuidado cuando haces operaciones con datos de diferentes tipos, las operaciones pueden cambiar al tipo de dato que no esperamos.

para evitar dudas y errores, te recomiendo usar variables del mismo tipo o castearlas, por ejemplo.

int a;
double c, b;

c = b / ( double ) a;

o

c = ( ( double ) a ) / b;

siempre usa casteos y parentesis, aunque parezca estupido y sepas realmente el orden de precedencia de los operadores, esto evita futuros errores accidentales o incluso errores de interpretacion en un futuro analisis.

saludos.

hardyx
05/07/2010, 21:13
El problema que tienes está en la propia instrucción que imprime los dos valores mal. suma es una variable double, y la tienes que poner en el printf como double con %f. Si imprimes un double como %d (entero) los parámetros ya no coinciden y por eso te imprime basura.

Este es el código correcto:


printf("\n\n La media sera %f entre %d ",suma,tamano);

Aunque te parezca complejo ahora, una vez que domines los tipos básicos es sencillo. :)

Nathrezim
05/07/2010, 21:16
Y luego la gente dice que no tiene por qué ser malo aprender a programar en C :lol: Con Pascal te habrías dado cuenta del error en tiempo de compilación.

swapd0
05/07/2010, 21:42
Y luego la gente dice que no tiene por qué ser malo aprender a programar en C :lol: Con Pascal te habrías dado cuenta del error en tiempo de compilación.

Pues programas en C++, haces un


std::cout "La media sera " << media << " entre "<< tamano << std::endl;


Y asunto resuelto.

Jurk
05/07/2010, 22:48
puffff...

cout es dios! te quita cualquier problema que tengas de un plumazo!
si quieres usarlo, Bizkaitarra, no te olvides de

#include <iostream>
using namespace std;

ademas, deberias de probar el cin, que tambien es la ostia, mucho mejor que scanf

Aunque eso si, cout y cin no son parte de c, sino de c++

SplinterGU
06/07/2010, 00:10
por dios no cometas el pecado de usar c++.

eso de "quitarte el problema", es lo que discutiamos hace un tiempo sobre malos habitos...

Jurk
06/07/2010, 00:53
ya, si uso printf scanf cin y cout indistintamente, pero hay que admitir que que si son usdos bien cin y cout estan muy bien

Drumpi
06/07/2010, 02:42
por dios no cometas el pecado de usar c++.

eso de "quitarte el problema", es lo que discutiamos hace un tiempo sobre malos habitos...

Hábitos que se fomentan desde que te dicen que se compila pulsado el botón de "compile & run". Pues no me dió quebraderos de cabeza cambiar de IOSTREAM a NCURSES (juer, aprendí más C en 2 días que en dos semanas de clases).

También hay que decir que tanto scanf y printf no son funciones "normales" o "intuitivas", yo aun no me se ni la mitad del significado de cada %letra.
Hay dos cosas que dan pie a muchos misterios de C: olvidarse de usar los cambios de tipo, y de inicializar las variables :lol:

Bizkaitarra
06/07/2010, 08:29
Vale, he actualizado mi código, y ahora tengo un expediente X más raro.

Asumo que la media la calculo bien porque el número que sale es lógico.

Pero el problema viene cuando printeo con la misma línea la variable calculada en la función dentro de la función y cuando la printeo fuera de ella:
//Parte de funcion que llama al calculo de media

int tamano = numPalabras / num;
printf("\n\n El tamano es : %d \n\n",tamano);
printf("Press ENTER to continue...\n");
getchar();
//Se crea un array que contendra los valores resultado, las medias
double senalResultante[num];
double aux = 0;
//Limite inferior del intervalo
int limI;
//Limite superior del intervalo
int limS ;
int i = 1;
//Esto tendría un bug, cuando fuera N=1 pero ese caso lo haremos aparte
while (i<=num) {
limI = (i-1) * tamano;
limS = (i * tamano)-1;
printf("\n\n Cacho %d va desde %d a %d \n\n",i,limI,limS);
i++;
//Obtenemos la media del intervalo.
aux = (double) obtenerMedia(limI,limS,tamano,arr);
senalResultante[i]= (double) aux;
printf ("floats: %4.2f %+.0e %E \n", aux,aux,aux);
printf ("floats: %4.2f %+.0e %E \n", senalResultante[i],senalResultante[i],senalResultante[i]);

}//Código de calculo de media

double obtenerMedia(int limiteInf, int limiteSup,int tamano,double arrNums[]) {

//Recorrer el array y sumar todos sus contenidos para luego dividir entre el tamano
long double suma = 0;
double media =0;


int i=limiteInf;
/*
printf("\n\n Loop de %d a %d con tamano %d",limiteInf,limiteSup,tamanoD);
printf("\n\n El tamano es : %d \n\n",tamanoD);
printf("Press ENTER to continue...\n");
getchar();
*/
while (i<limiteSup) {
//printf("\n\n Sumando numero %d con valor %d",i,arrNums[i]);
suma = suma + (double) arrNums[i];
i++;
}


//Pasa mal el tamano, eso es lo que tengo que mirar
printf("\n\n El tamano para dividir es : %d \n\n",tamano);
printf("Press ENTER to continue...\n");
getchar();

printf("\n\n La suma sera %e ",suma);
printf("\n\n Tamano %d ",tamano);
media = suma / (double) tamano;
printf("\n\n La media es %e ",media);
printf ("floats: %4.2f %+.0e %E \n", media,media,media);
getchar();
return media;

}
Pues bien, en la salida de floats: .... me salen distintos números dentro de la función que fuera....

Esta es la salida de los prints interesantes


La media es 7.237688e-001 floats: 0.72 +7e-001 7.237688E-001
Y fuera de la función me pone:
floats: 10.00 +1e+001 1.000000E+001
floats: 10.00 +1e+001 1.000000E+001


ODIO C

No puedo usar nada diferente a C

swapd0
06/07/2010, 08:43
Lo que veo es que un while es i<=num y el otro es i<limiteSup, a ver si en el primer caso estas leyendo de mas y lees basura.

Los bucles en C/C++ "siempre" desde i=0 hasta i<max, asi si accedes a arrays no tienes que poner dato[i-1] para acceder al primer elemento del array que es el 0.

Bizkaitarra
06/07/2010, 11:50
Lo que veo es que un while es i<=num y el otro es i<limiteSup, a ver si en el primer caso estas leyendo de mas y lees basura.

Los bucles en C/C++ "siempre" desde i=0 hasta i<max, asi si accedes a arrays no tienes que poner dato[i-1] para acceder al primer elemento del array que es el 0.

El primero de los bucles está bien porque la idea es dividir el array en N cachos y esos N cachos pasarlos a una función para que haga la media.

Si N=2 me divide correctamente en dos cachos, lo tengo bien pensado y la depuración me indica que lo hace bien ;)

Y el otro loop pues en principio lo hace bien pero aunque no lo hiciera en el primero de los cachos al hacer desde 0 hasta limiteSup y siendo limiteSup por narices más pequeño que el tamaño del array como mucho sumaría un valor de más, pero lo hace bien, lo he comprobado ;)

El expediente X es que dentro de la función obtiene un resultado y fuera obtiene otro resultado.....

Muchas gracias por los consejos, haber si alguien me puede desatascar...:brindis::brindis::brindis:

< - >
He decidido visto que no salgo de ello dar como válido el cálculo y que sea lo que tenga que ser....

Tengo la necesidad de crear una estructura que voy a ir compartiendo por varias funciones.

Quiero poder declarar la estructura como tipo de datos global o algo así, ya que ahora mismo me dice que solo puedo usarla en el fichero donde estoy

juanvvc
06/07/2010, 12:04
Para hacer algo global, en los demás ficheros la declaras igual pero pones un "extern" delante. Solo en uno de los ficheros la declaración no tiene que llevar el "extern". De hecho lo suyo es declarar en un .h la variable con su extern y que todos lo vayan incluyendo, y en el .c correspondiente al .h declaras la variable sin extern (no pasa nada si en el .c incluyes el .h)

< - >
En cuanto al código, si quieres ayuda danos algo que compile :)

Bizkaitarra
06/07/2010, 12:05
Para hacer algo global, en los demás ficheros la declaras igual pero pones un "extern" delante. Solo en uno de los ficheros la declaración no tiene que llevar el "extern". De hecho lo suyo es declarar en un .h la variable con su extern y que todos lo vayan incluyendo, y en el .c correspondiente al .h declaras la variable sin extern (no pasa nada si en el .c incluyes el .h)


Vale, pero por lo que veo una structura no la puedo pasar por reft si no que siempre va por val....

Con estoy tengo un problema ya que lo que me interesa es que la modifique como parámetro...

Bueno, lo podría solucionar de alguna otra forma....

Al final lo que tengo es un fichero que tiene una sería de nombres

Ej.



blabla.txt
blabla2.txt
blabla3.txt


Y quiero devolver a la función que llama los nombres de ficheros y el número de ficheros.

Para ello había pensado hacer un array de Strings pero no encuentro la manera de pasar un array de Strings ya que String ya es un array de chars.....

swapd0
06/07/2010, 18:23
Array de strings, igual que los parametros de la funcion main: char **

juanvvc
06/07/2010, 18:38
Vale, pero por lo que veo una structura no la puedo pasar por reft si no que siempre va por val....

Pasar por ref en C significa usar punteros. Puedes pasar un puntero a una estructura, y modificarla dentro de tu función.

Bizkaitarra
07/07/2010, 08:07
He conseguido algo :) Ahora voy a la cama pero mañana os pongo el código

Muchas gracias por las ayudas y consejos porque me estais salvando el culo... si hago este trabajo me quito una asignatura muy dificil y tengo que hacerlo para el 12.....

< - >
No me está quedando nada claro lo de las estructuras juanvvc (http://www.gp32spain.com/foros/member.php?u=23889)


Defino en el método que llama la estructura y en el llamado la defino otra vez pero con extern y no me cuela al compilar :(


Os voy a pasar los archivos de código que estoy usando ahora para ver si podeis saber que es lo que pasa.

El main:


/*
En este archivo se realizarán todas las pruebas del programa utilizando
las dos funciones existentes, transformada_PAA_PVM y comparacion_PAA_PVM

*/


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

transformada_PAA_PVM("ENTRADA.txt",2,"SALIDA.txt");



}



transformada_PAA__PVM.c


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>

struct estructura_ficheros {
char nombre[256];
double arr[16384];
};


int transformada_PAA_PVM(char *ficheroEntrada[],int N, char *ficheroSalida[])
{
//Programa maestro




//El número de tareas esclavas lo defino con una variable ya que no se define en el enunciado.
int numEsclavos = 5;
//Primero se define la variable N, el número de arreglos que se van a conseguir de la señal


//Primero se cuentan el número de señales a tratar y se almacenan en la estructura



//Se crean numEsclavos esclavos que ejecuten el programa esclavo



//Se lee cada fichero y se envia un array a cada hijo por cada señal
//Array de valores double que serán los que se analizaran

//Para cada hijo
//Para cada señal
// double arr[16384];
struct estructura_ficheros estr_ficheros[300];

char* arrFicheros[300];
int k = 0;
for (k = 0; k < 300; ++k) {
arrFicheros[k] = malloc(256);
}
int nFicheros = devolverFicheros(ficheroEntrada,estr_ficheros);
int tamArr = 0;
printf("El numero de ficheros es %d \n",nFicheros);
char primerFichero[256] ;

// primerFichero = arrFicheros[0];
//printf("El numero de ficheros es %s \n",arrFicheros[0]);
/*
tamArr = leerFicheroSenal(arr,nombreFichero);
//Pasar señal a hijo
//Para probar voy a llamar a un hijo que realizará la transformada de una señal
// le paso el array por parametro pero se deberá de pasar por envio PVM
// también le paso el N que debería de pasar a todos los esclavos vía PVM
PAA_hijo(arr,N,tamArr);
//Ahora obtengo las señales en una estructura
*/




//Fin para cada hijo para cada señal

//Para cada hijo
//Para cada señal
//Se reciben las señales tratadas

//Se guarda en el fichero resultante









printf("Press ENTER to SALIR...\n");
getchar();
return 0;
}



funciones_ficheros.c


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <conio.h>


extern struct estructura_ficheros {
char nombre[256];
double arr[16384];
};


/*
Name: devolverFicheros
Copyright:
Author: jgonzalez2115
Date: 06/07/10 10:30
Description: Devuelve el número de ficheros que tiene el ficheroEnt e
introduce en el array la lista de ficheros.
*/

int devolverFicheros(char ficheroEnt[256], struct *arrFicheros[300]) {

printf("Voy a abrir el fichero\n %s \n",ficheroEnt);
char strGuardado[300];
FILE *archivo;
archivo = fopen(ficheroEnt,"r");

if (archivo == NULL){
return 0;
}
else {
int numPalabras = 0;

while (feof(archivo) == 0 )
{
fscanf(archivo,"%s",strGuardado);

printf("Dale al enter haber si fallo...\n");
getchar();
arrFicheros[numPalabras].nombre = strGuardado;
numPalabras++;
printf("No he fallado, dale enter que seguimos...\n");
}
return numPalabras;
}
}

swapd0
07/07/2010, 22:11
Deberia ser asi:


#include "transformadas.h"
#include "ficheros.h"
/*
En este archivo se realizarán todas las pruebas del programa utilizando
las dos funciones existentes, transformada_PAA_PVM y comparacion_PAA_PVM

*/


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

transformada_PAA_PVM("ENTRADA.txt",2,"SALIDA.txt");

return 0; // te falta el return
}

fichero transformada.h


#ifndef _TRANSFORMADA_H
#define _TRANSFORMADA_H

// para que devuelve un int si siempre devuelve un 0, usa void
int transformada_PAA_PVM(char *ficheroEntrada[],int N, char *ficheroSalida[]);

#endif



ficheros.h


#ifndef _FICHEROS_H
#define _FICHEROS_H

struct estructura_ficheros {
char nombre[256];
double arr[16384];
};


/*
Name: devolverFicheros
Copyright:
Author: jgonzalez2115
Date: 06/07/10 10:30
Description: Devuelve el número de ficheros que tiene el ficheroEnt e
introduce en el array la lista de ficheros.
*/

// habria que poner un parametro mas para decir en numero de elementos en arrFicheros
int devolverFicheros(char *ficheroEnt, struct estructura_ficheros *arrFicheros);


En los ficheros .c que incluya su mismo fichero pero .h, y si tiene dependencias (por estructuras o funciones) con otros ficheros pues incluyes el correspondiente .h

En los .h solo debes poner:
- definicion de tipos y estructuras
- variables con extern delante, y en el .c sin el extern. Aunque si solo lo pones en el .h sin el extern tambien rula
- declaracion de funciones, esto es la funcion sin el codigo
- y lo mas importante, comentarios/documentacion de como funcionan las funciones.

< - >
Por cierto esto ocupa una burrada, deberias usar la memoria dinamica por lo menos en arr.



struct estructura_ficheros {
char nombre[256];
double arr[16384];
};

Gammenon
07/07/2010, 22:27
No te olvides del #endif al final de ficheros.h. De paso recomendar VC++ 2010 express, que es de gratis y tiene el mejor depurador del mercado con diferencia ;)

< - >

por dios no cometas el pecado de usar c++.

eso de "quitarte el problema", es lo que discutiamos hace un tiempo sobre malos habitos...

Por que es pecado usar C++? :confused:

GameMaster
07/07/2010, 22:36
Porque el sólo usa C y se considera santo :)

juanvvc
07/07/2010, 22:37
No me está quedando nada claro lo de las estructuras juanvvc (http://www.gp32spain.com/foros/member.php?u=23889)


Creo que he bebido demasiada cerveza como para entender la pregunta, así que te pongo un ejemplo de estructura pasada "como referencia" por medio de punteros:



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

typedef struct {
int valor;
} estructura;

void cambia_struct(estructura * ss){
ss->valor = 5;
}

int main(int argc, char *argv[]) {
estructura *s;
s=malloc(sizeof(estructura));
s->valor=1;
cambia_struct(s);
printf("Valor: %d\n", s->valor);
}


Obviamente, este ejemplo imprime "Valor: 5"

Gammenon
07/07/2010, 22:42
Creo que he bebido demasiada cerveza como para entender la pregunta, así que te pongo un ejemplo de estructura pasada "como referencia" por medio de punteros:



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

typedef struct {
int valor;
} estructura;

void cambia_struct(estructura * ss){
ss->valor = 5;
}

int main(int argc, char *argv[]) {
estructura *s;
s=malloc(sizeof(estructura));
s->valor=1;
cambia_struct(s);
printf("Valor: %d\n", s->valor);
}


Obviamente, este ejemplo imprime "Valor: 5"

Y el "free(s);" donde queda? :mad:

< - >

Porque el sólo usa C y se considera santo :)

Entiendo...

juanvvc
07/07/2010, 22:48
Y ahora un ejemplo para usar externs. ss es una variable global del programa, declarada como extern en definiciones.h, pero definida realmente en main.c



#include <stdio.h>
#include "definiciones.h"
#include "funciones.h"

int ss;

int main(int argc, char *argv[]) {
ss = 1;
cambia_ss();
printf("Valor: %d\n", ss);
}

/////////////funciones.h/////////////////
#ifndef __FUNCIONES__
int cambia_ss();
#define __FUNCIONES__
#endif

/////////////definiciones.h/////////////////
#ifndef __DEFINICIONES__
extern int ss;
#define __DEFINICIONES__
#endif

/////////////funciones.c/////////////////
#include "definiciones.h"
#include "funciones.h"

int cambia_ss(){
ss = 5;
}

< - >

Y el "free(s);" donde queda? :mad:

Muy cierto, se me ha olvidado. Shame on me.

Gammenon
07/07/2010, 22:52
Comentar que hay que evitar usar variables globales y la palabra clave goto, pero en ciertas ocasiones puede que sean la solucion mas sencilla y comoda :)

swapd0
07/07/2010, 23:14
Como ejemplo de como funcionan los extern vale, pero eso de que en un fichero modifiques la variable de otro y encima que esta variable este en el main....

¿que pasa si mas adelante quieres usar el funciones.h? pues que te dara un error de linkador porque no encuentra la variable ss. Asi que tendras que definirla. Pero imagina que la variable ss estaba definida en el fichero foo.c que mas adelante tambien lo usas....

Si el fichero funciones.c necesita la variable ss, deberia estar definida alli.

Por esto opino lo mismo que gammenon, hay que evitar en todo lo posible las variables globales.

juanvvc
07/07/2010, 23:21
Si el fichero funciones.c necesita la variable ss, deberia estar definida alli.


Y lo está, porque funciones.c incluye definiciones.h :D

Usar variables globales no se considera buena práctica por lo que decís, es muy fácil perder la pista a una variable global. "¿Dónde se ha declarado realmente?" Pero el compi pedía cómo usarlas, ya aprenderá a no usarlas más que cuando es que no hay otro remedio :D

swapd0
07/07/2010, 23:30
Y lo está, porque funciones.c incluye definiciones.h :D

Esta declarado pero no definido porque tiene el extern, el compilador no crea espacio para las variables extern.

Si quitas el int ss; del main veras como da un error de linkador porque hay referencias a ss pero no esta DEFINIDA en ninguna parte, esta DECLARADA.

Bizkaitarra
11/07/2010, 10:24
Corregido

Gammenon
11/07/2010, 11:20
Me llega un email enorme con codigo, vengo aqui y pone "corregido"? Hori ez da egiten, Bizkaitarra XD

Bizkaitarra
11/07/2010, 16:30
Me llega un email enorme con codigo, vengo aqui y pone "corregido"? Hori ez da egiten, Bizkaitarra XD

Jejeje, he dado por finalizada la práctica... no me ha dado tiempo y no puedo más porque me subo por las paredes con la desesperación....

Estudiaré para el éxamen de septiembre y me voy a olvidar de C y evitarlo siempre que pueda.....

Muchas gracias por las ayudas ::brindis::brindis:

Momentuan zuzendu dut eta horregatik editatu dut..eskerrik asko lagundu nahi izana :brindis:

Gammenon
11/07/2010, 18:51
No hombre, pon codigo aqui que ya ves que no te falta ayuda. Eso si, si no te importa recibirla de, entre otros, un giputxi ;)

Bizkaitarra
13/07/2010, 09:49
No hombre, pon codigo aqui que ya ves que no te falta ayuda. Eso si, si no te importa recibirla de, entre otros, un giputxi ;)

No te preocupes, si eres giputxi te pondré el código dos veces :P:P

Bueno, pues nada, aprobechar para agradecer a todos vuestra ayuda :brindis::brindis::brindis:

He entragado parte de lo que pedían que no es poco para el nivel que tengo de C y bueno, si sirve para subir ese 0,4 que me falta hasta el 5 seré muy feliz aunque la verdad es que lo dudo :(

< - >
Bueno, ya me han respondido con lo de la práctica

Efectivamente con lo que he conseguido no me pueden aprobar la práctica ni la asignatura

Afortunadamente me han dado la opción de continuar con la práctica y entregarla en Septiembre de manera que no tenga que hacer éxamen.

Por ello y si os parece bien este tema lo seguiré utilizando para preguntaros dudas varias.

Como ahora tengo tiempo y en el curro tengo tiempos muertos me voy a poner a mirar detalladamente el curso c que me recomendasteis para tener menos dudas pero seguro que os necesito :P

Gammenon
13/07/2010, 09:51
Venga pues

FlipFlopX
15/07/2010, 01:06
Se puede aprender a programar en 1 mes? Con "buenos hábitos", eso de empezar el psudocódigo antes de picar código, evitar los GOTOS, break, variables globales, cuidar la memoria..etc.. (No es por desanimar Bizkaitarra, que yo también lo he dejado para Septiembre)

Bizkaitarra
15/07/2010, 07:48
Se puede aprender a programar en 1 mes? Con "buenos hábitos", eso de empezar el psudocódigo antes de picar código, evitar los GOTOS, break, variables globales, cuidar la memoria..etc.. (No es por desanimar Bizkaitarra, que yo también lo he dejado para Septiembre)


No pretendo aprender a programar :P pretendo aprender a programar en C

Yo ya se programar en varios lenguajes e incluso en su día hice una magistral clase de SO que cuyo título era : "Aprenda C en una lluviosa tarde de Domingo", pero no me sirvio para mucho :P

Estoy depurando mi código y ya consigo por lo menos llegar hasta los mensajes de fallo de PVM que ya es mucho para mi :brindis:

Cuando tenga dudillas cuento con vosotros :lovegp2x:spain.com

Gammenon
15/07/2010, 08:39
Pues yo tiro de los breaks que no veas, para mi es mucho mas logico y sencillo [wei]

swapd0
15/07/2010, 20:42
Para aprobar la asignatura no hace falta saber programar.

Ademas yo creo que programar es algo donde siempre estas aprendiendo.

Bizkaitarra
16/07/2010, 07:40
Para aprobar la asignatura no hace falta saber programar.

Ademas yo creo que programar es algo donde siempre estas aprendiendo.

Cierto es, pero vamos, que a lo que me refiero es que se programar sin problemas pero que este no es mi lenguaje, vamos que no parto de 0 ;)

Bueno, he conseguido enviar varios mensajes PVM, recibirlos etc. así que voy avanzando....

Mañana a la tarde es probable que os suelte unas cuantas dudillas ;)

Bizkaitarra
09/08/2010, 18:16
__________________________
Buenas,

Refloto el hilo porque tengo que hacer esta práctica para septiembre me lleva por el camino de la amargura...

Os voy a poner los dos ficheros de código y la salidas que tengo.

Se trata de un padre, main.c que crea un hijo. El hijo escribe un fichero.

Lo he querido dejar hay para ver si consigo algo....

Padre:
main.c


#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <dirent.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

#include <pvm3.h>




//Constantes

//Tamano maximo de una senal

#define MAX_TAM_SENAL 16384

//Tamano maximo de fichero

#define MAX_TAM_FICH 50

//Número de esclavos

#define NUM_ESCLAVOS 1



//Declaracion de funciones

int leerFicheroSenal(double *arr, char fichero[MAX_TAM_FICH] ) ;

int PPA_padre(char ficheroEntrada[],int N, char ficheroSalida[]);







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

PPA_padre(argv[1],(int)argv[2],argv[3]);

}



int PPA_padre(char ficheroEntrada[],int N, char ficheroSalida[])

{

//Programa maestro



int i;
int j;







//Se define un array de punteros a un array de chars (strings) para almacenar la lista de ficheros

char *arrFicheros[300][MAX_TAM_FICH];



//Se recorre el fichero ficheroEntrada para rellenar el array arrFicheros con los ficheros de señal

char strGuardado[300];

FILE *archivo;

archivo = fopen( ficheroEntrada,"r");

int numPalabras = 0;

if (archivo == NULL){

return 0;

}

else {





while (feof(archivo) == 0 )

{

fscanf(archivo,"%s",strGuardado);

strcpy(arrFicheros[numPalabras], strGuardado);

numPalabras++;

}



}

fclose(archivo);



//En la variable numPalabras se encuentra el número de ficheros

///Se calcula el numero de ficheros a cada esclavo

int ficherosEsclavo = numPalabras/NUM_ESCLAVOS;





int ntids[NUM_ESCLAVOS] ;



//Se crean NUM_ESCLAVOS procesos hijos que llaman a PPA_Hijo

//la intención era pasar en los argumentos N y el número de señales a tratar por cada hijo pero

// debido a problemas de compilación se ha decidido realizar dichos pasos vÃ*a PVM



//Se crean NUM_ESCLAVOS procesos hijo que ejecutarán el comando PPA_Hijo





//Ignoramos los fallos ya que si que crea bien los hijos
int numt = pvm_spawn ("PAA_Hijo",(char **)0,0,"",NUM_ESCLAVOS,ntids);



if (numt!=NUM_ESCLAVOS) {

pvm_exit();

printf("Fallo a intentar crear los procesos hijos");

}






int resultado;



//Envio de senales a procesos hijos



for (i=0;i<NUM_ESCLAVOS;i++) {
//Enviamos los parametros número de señales y N con las etiquetas 0001 y 0002 respectivamente
pvm_initsend(PvmDataDefault);
pvm_pkint(&ficherosEsclavo,1,1);

printf("El valor de el tid es %i..\n y el de i es %i",ntids[i],i);

pvm_send(ntids[i],0001);




pvm_pkint(&N,1,1);

pvm_send(ntids[i],0002);







//Para cada esclavo se envia el array de senal

for (j=0;j<ficherosEsclavo;j++) {

//Se crea una varialbe para almacenar la senal a enviar

double senal[MAX_TAM_SENAL];

double *puntSenal = senal;



//Se obtiene en senal la señal a enviar para su tratamiento

//Se envia un puntero que apunta a senal, con esto, se modifica la senal que podra seguir siendo accedida por la variable senal



printf("\nA pillar la sena\n");

resultado = leerFicheroSenal(puntSenal, arrFicheros[j] );

printf("\nLeido, vamos a enviar la senal con resultado %i l\n",resultado);

printf("\nEsto no hay quien lo entienda%i l\n",resultado);

if (resultado==0) {

//No se han encontrado resultados en el fichero

printf("\nNo se han encontrado resultados en el fichero %i l\n",resultado);

}

else {

//Se envia el nombre de la señal

pvm_initsend(PvmDataDefault);

printf("Tenemos leida la senal, vamos a enviarla ");

pvm_pkstr(*arrFicheros[j]);

pvm_send(ntids[i],1000);



//Se envia la señal al esclavo para su tratamiento

//pvm_pkdouble(puntSenal,MAX_TAM_SENAL,1);

//pvm_send(ntids[i],1001);



}

printf("\nEstoy aki\n");

}



}



int numFicherosEsc = 0;

//Una vez enviados todas las senales simplemente hay que esperar a recibirlas una tras otra

// para escribirlas en el fichero resultado



FILE *archivo2;

archivo2 = fopen(ficheroSalida,"wb");

if (archivo2 == NULL){



}

else {

for (i=0;i<NUM_ESCLAVOS;i++) {



for (j=0;j<ficherosEsclavo;j++) {

//Se recibe el nombre de la señal

char *nombre[(int)MAX_TAM_FICH];

pvm_recv(ntids[j],2000);

pvm_upkstr(*nombre);



//Se recibe la señal para guardar en el fichero

double senalResultado[N];

pvm_recv(ntids[j],2000);

pvm_upkdouble(senalResultado,N,1);

fwrite (&nombre, 20, 1, archivo2);

int x;

for (x=0;x<=N;x++) {

fwrite (&senalResultado[x], sizeof(double), 1, archivo2);

}

numFicherosEsc++;

}

}

fclose(archivo2);

}











printf("Press ENTER to SALIR...\n");

//getchar();

return 0;

}



/*

Name: leerFichero

Copyright:

Author: jgonzalez2115

Date: 06/07/10 09:29

Description: Lee un fichero e introduce los primeros 16.384 valores en un array de doubles

devuelve el n�mero de valores del array. Si hay error devuelve 0

*/



int leerFicheroSenal(double *arr, char fichero[MAX_TAM_FICH] ) {



printf("Voy a abrir el fichero\n %s \n",fichero);

FILE *archivo;

char caracter;

double numGuardado;

char strGuardado[256];

archivo = fopen(fichero,"r");

if (archivo == NULL){



printf("\nError de apertura del archivo. %s \n\n",fichero);

return 0;

}else{

printf("\nSe va tratar el fichero \n\n");

int numPalabras = 0;

//Se leeran los 16.384 primeros valores de la se�al . Siempre hay minimos dichos valores

// Se guardaran en un array desde la posici�n 0 a la 16.384

while (feof(archivo) == 0 )

{

fscanf(archivo,"%s",strGuardado);

//Como la primera columna no sirve volvemos a leer

fscanf(archivo,"%s",strGuardado);



numPalabras++;

//printf("\n\n %s \n\n",strGuardado);

numGuardado = atof ( strGuardado);

// A lo que apunta el puntero + el número de palabras, es decir, a la posición numPalabras se le introduce numGuardado

*(arr+numPalabras) = numGuardado;

if (numPalabras >= MAX_TAM_SENAL) {

break;

}



}

printf("\n\n El total de numeros almacenado es : %d \n\n",numPalabras);

return numPalabras;

}

}













hijo.c


#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <dirent.h>

#include <pvm3.h>




//Constantes

//Tamano maximo de una senal

#define MAX_TAM_SENAL 16384

//Tamano maximo de fichero

#define MAX_TAM_FICH 50





//Definicion de estructuras



// Lo OPTIMO serÃ*a hacer que resultado tenga el tamaño N pero no se si voy a poder definir la estructura dentro del método

struct estructura_senal {

char nombre[MAX_TAM_FICH];

double senal[MAX_TAM_SENAL];

};
















//Definicion de funciones

void hijo_PAA(int nSenales, int N);



int main() {


int arg1=0;
int arg2=0;



pvm_initsend(PvmDataDefault);
//Debido a problemas a la hora de pasar argv se ha decido enviar los argumentos por PVM


pvm_recv (pvm_parent(),0001);

pvm_upkint(&arg1,1,1);

pvm_recv (pvm_parent(),0002);

pvm_upkint(&arg2,1,1);


//Se llama a la funcion hija que trata las senales recibidas

hijo_PAA(arg1,arg2);





pvm_exit();





}







void hijo_PAA(int nSenales, int N) {





//Se crea un fichero para depurar

int miTid = pvm_mytid();

FILE *archivo2;

archivo2 = fopen("ficheroprueba.txt","wb");

if (archivo2 != NULL){

fwrite ("Soy un hijo", 20, 1, archivo2);

fwrite (&miTid, sizeof(int), 1, archivo2);

//fclose(archivo2);

}







//Se crea lista de senales

struct estructura_senal lista_senales[nSenales];



int numSenal;



/* SE SUSTITUYE POR LA ESTRUCTURA

//Se crea un array que contendra los valores a tratar, las señales

double *arr[nSenales][MAX_TAM_SENAL];

*/





/* SE VA ENVIAR LA SEÑAL SEGUN SE TRATE CON LO QUE NO HAY QUE GUARDARLA EN NINGUNA ESTRUCTURA

//Se crea un array que contendra los valores resultado, las medias

double *arrResul[nSenales][N];

*/





fwrite ("Aqui", 20, 1, archivo2);

fclose(archivo2);

// Obtener las señales (Se recogen todas primero porque es más rápido que tratarlas al no bloquear al padre el envio)

for (numSenal=0;numSenal<nSenales;numSenal++) {

char nombre[MAX_TAM_FICH];

fwrite ("Aqui2", 20, 1, archivo2);

//Se recoge primero el nombre de la senal:

pvm_recv (pvm_parent(),1000);

pvm_upkstr(nombre);

char *puntNombre = nombre;

*lista_senales[numSenal].nombre = *puntNombre;

fwrite ("Aqui3", 20, 1, archivo2);

//A continuacion obtenemos los valores de la señal. No estoy seguro de si se puede hacer asÃ*

//int kk=12345678;

//fwrite (123477, sizeof(int), 1, archivo2);

double senal[MAX_TAM_SENAL];

double *puntSenal = senal;
//pvm_recv (pvm_parent(),1001);

//pvm_upkdouble(puntSenal,MAX_TAM_SENAL,1);

*lista_senales[numSenal].senal = *puntSenal;

fwrite ("Hola4", 21, 1, archivo2);

}



fwrite ("Aqui5", 20, 1, archivo2);





for (numSenal=0;numSenal<nSenales;numSenal++) {
// _____________________________TRANSFORMAR__________ ____________________
//A continuacion se calcula el tamaño de trozos de señal que hay que partir y hacer la media

int tamano = MAX_TAM_SENAL / N;

double *arrResultado[N];

double aux = 0;

//Limite inferior del intervalo

int limI;

//Limite superior del intervalo

int limS ;

int j = 1;

//Se calcula la media de cada intervalo



while (j<=N) {

limI = (j-1) * tamano;

limS = (j * tamano)-1;

j++;

//***************************Obtenemos la media del intervalo*****************************/
//Recorrer el array y sumar todos sus contenidos para luego dividir entre el tamano

long double suma = 0;

double media =0;

int k=0;

while (k<limS) {

suma = suma + (double) lista_senales[numSenal].senal[k];

k++;

}

media = suma / (double) tamano;
/*****************************Fin calculo de media********************************************/
aux = media;

*arrResultado[j]= (double) aux;

}







// _____________________________FIN TRANSFORMAR______________________________



//Envia la senal al padre



char *nombre2 =lista_senales[numSenal].nombre;

pvm_initsend(PvmDataDefault);

pvm_pkstr(nombre2);

pvm_send(pvm_parent(),2000);

pvm_pkdouble(*arrResultado,N,1);

pvm_send(pvm_parent(),2001);

}


}






Compilan perfectamente y en pantalla el padre me dice lo siguiente:



El valor de el tid es 262147..
y el de i es 0
A pillar la sena
Voy a abrir el fichero
BO213_10000.txt

Se va tratar el fichero



El total de numeros almacenado es : 16384


Leido, vamos a enviar la senal con resultado 16384 l

Esto no hay quien lo entienda16384 l
./ejecutar: line 1: 5720 Fallo de segmentación ./trasnformadaPPA ENTRADA.txt 2 SALIDA.txt
sebas@sebas-desktop:~/pvm3/bin/LINUX$ ./ejecutar
El valor de el tid es 262150..
y el de i es 0
A pillar la sena
Voy a abrir el fichero
BO213_10000.txt

Se va tratar el fichero



El total de numeros almacenado es : 16384


Leido, vamos a enviar la senal con resultado 16384 l

Esto no hay quien lo entienda16384 l
./ejecutar: line 1: 5814 Fallo de segmentación ./trasnformadaPPA ENTRADA.txt 2 SALIDA.txt
Nota: Para ejecutar utilzo un fichero ejecutar que hace la llamada a el ejecutable con los parámetros.




Y el hijo escribe este fichero de depuración:



Soy un hijo#Aqui#Aqu####Aqui#Aqui2#Aqui3#Hol


El caso es que estoy totalmente atascado y no se porque me da ese fallo de segmentación, si es un fallo de C, si es un fallo de PVM o que narices...

Pagaría por no tener que hacer esta pesadilla pero es lo que toca así que un poquito de ayuda.. por favor... tened piedad ;)

Gammenon
09/08/2010, 18:37
Estas escribiendo o leyendo fuera de los arrays que usas. Has repasado esta parte?

swapd0
09/08/2010, 19:00
IIRC, fscanf(archivo,"%s",strGuardado); lee una linea entera porque estas usando el parametro %s (cadena de caracteres), y leera hasta el fin de linea o fin de fichero.

Por esto no puedes hacer dos fscanf seguidos para leer la segunda columna.

Bizkaitarra
12/08/2010, 18:09
Estas escribiendo o leyendo fuera de los arrays que usas. Has repasado esta parte?

Tendre que repasarlo... como me quema no saber depurar correctamente este código :(


IIRC, fscanf(archivo,"%s",strGuardado); lee una linea entera porque estas usando el parametro %s (cadena de caracteres), y leera hasta el fin de linea o fin de fichero.

Por esto no puedes hacer dos fscanf seguidos para leer la segunda columna.

He probado en directamente leer un float con e dejando la línea así:
fscanf(archivo,"%e",strGuardado);

Me sigue dando el mismo error en el mismo lugar :(

He restaurado el código y descomentado la línea en la que printeo lo que voy pillando del fichero y en principio esta parte la tengo bien...

Muchas gracias, os comentaré novedades...


Estoy haciendo una depuración forzosa ;) Estoy esperando desde el padre al hijo para ver si el fallo es del padre o del hijo.

Para ello hago desde el padre (desde el hijo no tengo acceso a teclado ni nada) un getchar y he detectado que el que falla es el hijo....
Ahora solo me falta saber donde falla el hijo de ******

Bizkaitarra
14/08/2010, 11:46
__________________________________________________ _________
Tengo novedades :)

He conseguido con varios cambios hacer que esto funcione :) He encontrado una manera para poder depurar el hijo a base de escribir en un fichero y hacer getchar en el padre para esperar a que el hijo falle y así...

Bueno, el caso es que estoy atrancado a la hora de enviar el nombre del fichero al hijo.

Tengo una variable de la siguiente forma en el padre:



//Tamano maximo de fichero
#define MAX_TAM_FICH 50
....

char *arrFicheros[300][MAX_TAM_FICH];



Y en un momento dado tengo que enviar el nombre de el fichero al hijo, el cual printeandolo con arrFicheros[j] siendo j el número del fichero, se obtiene correctamente.

Se envia con esté código:




//La inicialización del buffer de pvm se ha echo en los anteriores dos envios, no hay que volverlo a poner ya que si lo pongo otra vez no envia correctamente.

pvm_pkstr(&arrFicheros[j]);
pvm_send(ntids[i],1000);


Y el hijo recibe de la siguiente manera:



char nombre[MAX_TAM_FICH];
pvm_recv (pvm_parent(),1000);
pvm_upkstr(nombre);
fprintf ( archivo2, "\n EL nombre del fichero es: %s \n", nombre);
fprintf ( archivo2, "\n EL nombre del fichero es: %s \n", *nombre);
fprintf ( archivo2, "\n EL nombre del fichero es: %s \n", &nombre);


Y la salida en el archivo2 es la siguiente:


EL nombre del fichero es:
EL nombre del fichero es: (null)
EL nombre del fichero es:




Por si necesitais las declaraciones de los métodos pvm utilizados son estas:

pvm_send (http://ups.savba.sk/docs_par/pvm/pvm_send.3PVM.html)
pvm_recv (http://ups.savba.sk/docs_par/pvm/pvm_recv.3PVM.html)
pvm_pkstr
(http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man3/pvm_pkstr.3.html)pvm_upkstr
(http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=linux&db=man&fname=/usr/share/catman/man3/pvm_upkstr.3.html)

Me hago un lio impresionante y he probado poniendo nada, * y & en ambos dos sitios pero nada, a veces falla y otras pone lo que os he puesto como salida :(

¿¿¿¿¿Alguna idea?????

Gammenon
14/08/2010, 12:19
Para hacer el fprintf de nombre la forma correcta es la primera que has puesto

Bizkaitarra
14/08/2010, 12:52
Para hacer el fprintf de nombre la forma correcta es la primera que has puesto


Ok, sabiendo eso ahora tengo que hacer que pase el string correctamente porque no lo hace.... me estoy volviendo locoooo

Odio C... ¿Lo he dicho ya alguna otra vez?

Gammenon
14/08/2010, 15:11
Esta linea:


pvm_pkstr(&arrFicheros[j]);

No deberia ser sin el &?

Bizkaitarra
14/08/2010, 18:02
Esta linea:


pvm_pkstr(&arrFicheros[j]); No deberia ser sin el &?

Lo he probado y nada :(

Bizkaitarra
16/08/2010, 13:39
He cambiado la manera de hacer el programa.

Como parace que me da problemas a la hora de pasar un string pero si que he conseguido pasar dos parámetros int voy a pasar el indice el dichero del array de ficheros y luego una vez tratada la información el hijo me devolverá la información y el indice.

Con ello podré obtener en el padre el nombre del fichero sin ningún problema :)

¿Como no había caido antes en eso?

Voy avanzando......

Bizkaitarra
24/09/2010, 13:21
Bueno,

Lo primero agradecer a todos aquellos que me habeis leido y ayudado durante este hilo.

Al final tuve que entregar el día 15 la práctica. Dos días antes me entere que se podía realizar la práctica de manera más sencilla aunque discrepo con ella.

Se podía enviar los nombres de archivos a los procesos hijos y que estos leyeran los mensajes. Pero entiendo que esto no tienen nigún valor real ya que:
-¿Y si el proceso hijo se ejecuta en otro ordenador de la red?

Bueno, pues puse todo eso en la memoría a la vez que explicar los fallos y problemas encontrados y.....

He aprobado!!!! Un 5.1 me queda la media así que :):):)

Si a alguien le interesa el código final que no funciona adecuadamente, que no está terminado del todo etc que me lo pida ;)

bernard
26/09/2010, 14:15
Enhorabuena, no sabía que este hilo se había convertido en uno de consultas sobre C, pensé que sólo era para consultas sobre el compilador.

Si te apetece, pon aquí el código y le hacemos una limpa entre todos :) . A mi, personalmente, C me encanta a si que todo lo que sea trastear.

Bizkaitarra
27/09/2010, 09:18
En principio yo no voy a mirar más el post porque me ha dado muchos dolores de cabeza esta asignatura... .pero sigo diciendo que si alguien quiere el código le paso el Zip por email