Funciones con punteros C, urgente

ceeps

Este problema no es sobre mi es sobre otro usuario que ahora mismo no puede postear (Idontknow)

El problema es sobre un trabajo que tengo que entregar mañana y se basa en que a mi me dan unos archivos llamados inicios.txt laberinto.txt salida.txt estos estan puestos en los argumentos del netbeans. Descargar archivos junto con la explicación concreta de la practica que estoy haciendo Con estos archivos tengo unos casos de inicio, unos laberintos que hay que resolver con un codigo que me dan en pseudocodigo. Este pseudocodigo hace bactraking para encontrar el camino hacia el final.
Como podeis ver en el codigo no se cuantos casos tengo dentro de el arxivo inicios ni las dimensiones del laberinto.

Ahora el problema que tengo:

Tengo echas las funciones de leer los inicios y el laberinto. Ahora viene el problema que no consigo guardar la array de 2 dimensiones que he creado dentro de estas funciones en una array local. Igual me pasa en la array del laberinto.

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

/*
 * 
 */

typedef struct{
    int x;
    int y;
} posicio;
typedef struct{
    posicio in;
    posicio fi;
} pos_in;

int buscaCamino(char **camp, int posX, int posY);
pos_in leeIni(pos_in *dade, char** argv);
char leeLab(char **camp, char** argv);
int main(int argc, char** argv) {
    int i;
    int n_cas=5;
    int posX, posY;
    pos_in dade;
    char **camp;
    leeIni(&dade,argv);
    for(i=0;i<n_cas;i++){//compruebo si he guardado en la estructura del main (dade)
           printf("%d,%d;%d,%dn",(dade[i]).in.x,(dade[i]).in.y,(dade[i]).fi.x,(dade[i]).fi.y);
   }
    camp=leeLab(camp,argv);
    buscaCamino(camp,posX,posY);
    return (EXIT_SUCCESS);
}

int buscaCamino(char **camp, int posX, int posY) // esta es la funcion del pseudocodigo no le hagais caso
{
    int dir;
    int encontrado;

switch(camp[posX][posY]) {
    case 'F' :
        encontrado = 1;
        break;
    case '#' :
        encontrado = 0;
        break;
    case 'x' :
        encontrado = 0;
        break;
case ' ' :
        camp[posX][posY]='X';
        encontrado = 0;
        dir = 1;
        while ((encontrado ==0) && (dir<4)) {
            switch (dir){
                case 1 :
                    encontrado = buscaCamino(camp, posX-1, posY);
                    dir = 2;
                    break;
                case 2 :
                    encontrado = buscaCamino(camp, posX, posY+1);
                    dir = 3;
                    break;
                case 3 :
                    encontrado = buscaCamino(camp, posX+1, posY);
                    dir = 4;
                    break;
                case 4 :
                    encontrado = buscaCamino(camp, posX, posY-1);
                    dir = 1;
                    break;
            }
            break;
    }
   if (encontrado == 0)camp[posX][posY]='X';    // Miradas todas las direcciones sin eÌ?xit
    }
return encontrado;
}

// esta funcion lee los casos y los guardo en una array dinamica
pos_in leeIni(pos_in *dade, char** argv){
    int i,n_cas=0;
    char pos;
    char **camp;
    FILE *d;//dades
    d = fopen(argv[1],"r");
    while ((pos=fgetc(d))!= EOF)//miramos cuantos casos tiene el archivo
	 if ( pos == 'n') {
            n_cas++;
         }
    fseek(d,0,SEEK_SET);
    dade=(pos_in*)malloc(n_cas*sizeof(pos_in));//creo una lista para guardar los casos
    for(i=0;i<n_cas;i++){
        fscanf(d,"%d,%d;%d,%d",&(dade[i]).in.x,&(dade[i]).in.y,&(dade[i]).fi.x,&(dade[i]).fi.y);//leo caso por caso
    }
    fclose(d);
    return *dade;
}

/* Esta lee el laberinto y lo guarda en una array dinamica 2D*/
char leeLab(char **camp, char** argv){
    int colu=0,fil=0,f=0, c=0,i=0,j=0;
    char pos;
    FILE* fla;
    fla = fopen(argv[2],"r"); //obro l'arxiu de laberints
    while ((pos=fgetc(fla))!= EOF)//miro cuantas filas y columnas tiene el laberinto
	 if (pos == 'n') {
            f++;
            colu = c;
            c=0;
         }
	 else c++;
    colu++;
    fil = f;
    rewind(fla);
    printf("fil %d, col %dn",fil,colu);
    camp=(char**)malloc(fil*sizeof(char*));//creo la array dinamica 2D per a guardar el laberint //mientras voy rellendando la array pasando punto por punto por el archivo
    for(i=0;i<fil;i++){
        camp[i]=(char*)malloc(colu*sizeof(char));
        for(j=0;j<colu;j++){
            camp[i][j]=fgetc(fla);
        }
    }
    fclose(fla);
    return **camp;
}
Reth

No entiendo tu problema (comenta un poco más el código si puedes o tienes tiempo, también ayuda que los comentarios sean todos en castellano jeje), pero ojo con los malloc, deberás liberar el espacio que has reservado en memoria. A mí me crujían si no liberaba la memoria al terminar el programa.

PD: ¿Es así la manera de añadir nuevos elementos a un array, de forma dinámica? Me suena raro, pero ya no me acuerdo muy bien de cómo era ese rollo.

2 respuestas
Larkos

Un codigo sin comentarios merecia el suspenso en mis tiempos....

1 respuesta
ceeps

#2 Ahora cambio los comentarios.

A ver, yo tengo que leer dos archivos: 1 inicios, 2 laberintos.

Del primer archivo solo se la estructura de cada caso %d,%d;%d,%d en la función leeINI hago un for contando cuantos \n hay para saber cuantos casos hay y de aqui hacer un arrray dinamica para guardar estos en ella. El problema viene a guardar esta array en una array del main ya que la que he creado es una array local.

El seguno son los laberintos, miro cuantas filas y columnas tiene el laberinto y lo guardo en una array dinamica 2D que he creado anteriormente.

#3 Tiene algunos comentarios :P

ceeps

#2 en C creo que sí. En C++ es new int y ya funciona, por ejemplo.

Usuarios habituales

  • ceeps
  • Larkos
  • Reth