punteros triples

Dudas e ideas sobre los distintos e infinitos (:-)) algoritmos existentes.
Responder
Mensaje
Autor
Jesus David
Mensajes: 1
Registrado: 17/09/2017 4:57 am

punteros triples

#1 Mensaje por Jesus David » 17/09/2017 5:16 am

Buenos días.

Mi duda es la siguiente:

Quiero pasar una matriz tipo float, a una función por referencia. Dicha función llenará la matriz desde un archivo de texto suministrado por el usuario. Tanto el código como el archivo de prueba, se muestra abajo.

El código compila correctamente (estoy usando gcc), no obstante, cuando hago las pruebas, no trabaja.

Agradezco mucho si alguien puede explicarme las razones de este mal funcionamiento.

Atentamente,
Jesús David

----------------------------------------------------------
-------------------Código fuente----------------------

Código: Seleccionar todo

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

void LeerDatos(char stNombre[30], long *iDeep, long *iConst, long *iGen, int *iNivel, float ***dAb);

int main (void)
{
	char stNombre[30], stLine[300];
	long iDeep,iConst,iGen,i,j;
	int iNivel;
	float **dAb;

	printf("Introduzca el nombre del archivo: \n");
	scanf("%s",stNombre); 

	LeerDatos(stNombre, &iDeep, &iConst, &iGen, &iNivel, &dAb);
	
	printf("iDeep: %ld, iConst: %ld, iGen: %ld, iNivel: %d",iDeep,iConst,iGen,iNivel);
	
	for (i=0;i<iConst;i++)
	{
		for (j=0;j<(iGen)+1;j++)
		{
			printf("%1f ",dAb[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

void LeerDatos(char stNombre[30], long *iDeep, long *iConst, long *iGen, int *iNivel, float ***dAb)
{
	FILE *fp;
	long i,j;
	float dTmp;
	char stTmp[40];

	fp = fopen (stNombre, "r");
	if (fp==NULL) 
	{
		fputs ("File error",stderr); 
		exit (1);
	}
	
	fscanf(fp,"%ld",iDeep); 
	fgets(stTmp,40,fp); // Lectura temporal
	
	fscanf(fp,"%ld",iConst); 
	fgets(stTmp,40,fp); // Lectura temporal
	
	fscanf(fp,"%ld",iGen); 
	fgets(stTmp,40,fp); // Lectura temporal
	
	fscanf(fp,"%d",iNivel); 
	fgets(stTmp,40,fp); // Lectura temporal

	*dAb=(float **) malloc(*iConst*sizeof(float *));
	for (i=1;i<*iConst;i++) *dAb[i]=malloc(((*iGen)+1)*sizeof(float));
	
	/* -> Llenado de la matriz */
	for (i=0;i<*iConst;i++)
	{
		for (j=0;j<(*iGen)+1;j++)
		{
			fscanf(fp,"%1f",&dTmp);
			*dAb[i][j]=dTmp;
		}
		printf("\n");
	}
	
	fclose (fp);
}
--------------------------------------------------

--------------------------------------------------
-------------prueba.txt------------------------

600000 Densidad Grid Integración
17 Número de restricciones
7 Número de generadores
2 Niveles
1 2 0 0 0 0 0 1000
-1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 150
0 -1 0 0 0 0 0 0
0 0 1 0 0 0 0 324
0 0 -1 0 0 0 0 0
0 0 0 1 0 0 0 1250
0 0 0 -1 0 0 0 0
0 0 0 0 1 0 0 396
0 0 0 0 -1 0 0 0
0 0 0 0 0 1 0 276
0 0 0 0 0 -1 0 0
0 0 0 0 0 0 1 224
0 0 0 0 0 0 -1 0
-0.012903 -0.078602 -0.031037 -0.022796 -0.005934 -0.03496 0.017291 -5.55323109732788
-0.024644 -0.039737 -0.030382 -0.026945 -0.014107 -0.030527 0.012554 -11.995211073984
-0.064922 -0.081875 -0.052525 -0.069701 -0.01974 -0.055846 0.085246 -98.410734867

LuisBeas
Mensajes: 13
Registrado: 03/01/2009 6:53 am
Ubicación: Lima

Re: punteros triples

#2 Mensaje por LuisBeas » 02/03/2018 9:48 pm

Hola te lo arregle a la volada, esta para corregirlo por todos lados, no entiendo nada pero se nota que es algo de física, un consejo, no tengas miedo de darle nombre grande y completo a las variables, y a lo mejor deberías de usar Matlab.

Código: Seleccionar todo

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

void LeerDatos(char stNombre[30], long *iDeep, long *iConst, long *iGen, int *iNivel, float ***dAb);

int main (void)
{
    char stNombre[30] ;
    long iDeep, iConst, iGen, i, j;
    int iNivel;
    float **dAb;

    printf("Introduzca el nombre del archivo: \n");
    scanf("%s",stNombre);

    LeerDatos(stNombre, &iDeep, &iConst, &iGen, &iNivel, &dAb);


    printf("iDeep: %ld, iConst: %ld, iGen: %ld, iNivel: %d",iDeep,iConst,iGen,iNivel);

    for (i=0;i<iConst;i++)
    {
        for (j=0;j<(iGen)+1;j++)
        {
            printf("%g ",dAb[i][j]);
        }
        printf("\n");
    }

    return 0;
}

void LeerDatos(char stNombre[30], long *iDeep, long *iConst, long *iGen, int *iNivel, float ***dAb)
{
    FILE *fp;
    long i,j;
    float dTmp;
    char stTmp[400];



    fp = fopen (stNombre, "r");
    if (fp==NULL)
    {
        fputs ("File error",stderr);
        exit (1);
    }


    fscanf(fp,"%ld",iDeep);
    fgets(stTmp,400,fp); // Lectura temporal

    fscanf(fp,"%ld",iConst);
    fgets(stTmp,400,fp); // Lectura temporal

    fscanf(fp,"%ld",iGen);
    fgets(stTmp,400,fp); // Lectura temporal

    fscanf(fp,"%d",iNivel);
    fgets(stTmp,400,fp); // Lectura temporal

    *dAb=(float **) malloc((*iConst)*sizeof(float *));
    for (i=0;i<*iConst;i++) (*dAb)[i] = malloc(((*iGen)+1)*sizeof(float));

    /* -> Llenado de la matriz */

    for (i=0;i<(*iConst);i++)
    {
        int longitud;
        char *almacen, *almacenero, *recorredor;

        almacen = (char *)malloc(400*sizeof(char));
        fgets(stTmp,400,fp);
        recorredor = stTmp;
        longitud = strlen(stTmp);
        stTmp[longitud-1]='\0';

        for (j=0;j<(*iGen)+1;j++)
        {
            almacenero = almacen;

            while( *recorredor != ' ' && *recorredor != '\0')
            {
                *almacenero = *recorredor;
                almacenero++;
                recorredor++;

            }
            recorredor++;
            *almacenero = '\0';

            sscanf(almacen,"%f",&dTmp);
            (*dAb)[i][j]=dTmp;
        }
    }
    fclose (fp);
}

pikachu88
Mensajes: 6
Registrado: 04/12/2018 6:59 pm

nobita

#3 Mensaje por pikachu88 » 26/03/2020 8:15 pm

Great information, I would recommend it to my friends for them to check out. Thanks for sharing! If you have more time, please visit: driving directions

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados