Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento

Iniciado por Pitagoras, 3 Diciembre 2021, 16:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Pitagoras

Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento y ya no se que mas hacer. Si alguien me pudiese ayudar se lo agradeceria de todo corazón.


#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#define NORMAL  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"
#define RED  "\x1b[32m"

/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);

void mostrarContenido(char * path);

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

int opcion=0;
char *path; //Es para la ruta
char *type;
char *name;
int size;
int maxdepth;
int niveles;
unsigned num;

// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
type = malloc(1024);
path = malloc(1024);
name = malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a " "
//Devolverá 0 en caso de ser iguales caracter a caracter
if( i == argc){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){  ///DUDA si va i o argv[i]
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
path=argv[i];
break;

case 1: //Maxdepth
maxdepth <- atoi(argv[i]); //Convierte una cadena a un entero
niveles = maxdepth;

if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

break;

case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv[i], "d") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
//opcion = 3;
type=argv[i];
break;

case 3: //name


name=argv[i];
break;

case 4: //size


break;
}
}


}

/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;

if (argv[1] != NULL){

dir = opendir (argv[1]);

if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv[1] );
closedir (dir);
return 0;
}

else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {

dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;


/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent->d_name, ".")!=0 ) && (strcmp(ent->d_name, "..")!=0 ))
{
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);

return EXIT_SUCCESS;

//mostrarFiltrado(path, name, type, size, maxdepth);
mostrarFiltrado(path);
}


void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;

fich=fopen(archivo, "r");
if (fich)
{
fseek(fich, 0L, SEEK_END);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}

//void mostrarFiltrado(char *path, char *name, char *type, int size, int maxdepth){
//}

/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;
while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE, dir->d_name);
else
if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 )
{
printf("%s%s\n",GREEN, dir->d_name);
char d_path[255];
sprintf(d_path, "%s/%s", path, dir->d_name);
mostrarFiltrado(d_path);
}
//if(strcmp(argv[2], "-type") == 0){
// Funcion_type(dir, type);
//}
}
closedir(d);
}



MOD: Corregidas etiquetas de Código GeSHi

BloodSharp

Cita de: Allipson en  3 Diciembre 2021, 16:19 PM
Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento y ya no se que mas hacer. Si alguien me pudiese ayudar se lo agradeceria de todo corazón.

int main(char **argv, int argc)

Claro que te va a dar segfault porque el main siempre va declarado primero con el contador, luego con la matriz de strings de argumentos del programa:

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

También tenés que recastear el retorno de los mallocs a sus correspondientes tipos de punteros, por ejemplo:
path = (char*)malloc(1024);

Como último detalle no tenés definido mostrarFiltrado en su lugar tenés mostrarContenido (justo antes del main) sospecho que le cambiaste el nombre en algún momento y te olvidaste de renombrar eso.


B#



Pitagoras

He corregido los fallos, pero me sigue dando problemas con violacion de segmento. Paso el codigo modificado. El codigo consiste en simular la funcion del comando find.


#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#define NORMAL  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"
#define RED  "\x1b[32m"

/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);

void mostrarFiltrado(char * path);

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

int opcion=0;
char *path; //Es para la ruta
char *type;
char *name;
int size;
int maxdepth;
int niveles;
unsigned num;

// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a " "
//Devolverá 0 en caso de ser iguales caracter a caracter
//if( ){ //Si contador es igual al ultimo numero de parametros muestra error
// fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
// exit(EXIT_FAILURE);
//}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){  ///DUDA si va i o argv[i]
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
path=argv[i];
break;

case 1: //Maxdepth
maxdepth <- atoi(argv[i]); //Convierte una cadena a un entero
niveles = maxdepth;

if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

break;

case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv[i], "d") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
//opcion = 3;
type=argv[i];
break;

case 3: //name


name=argv[i];
break;

case 4: //size


break;
}
}


}

/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;

if (argv[1] != NULL){

dir = opendir (argv[1]);

if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv[1] );
closedir (dir);
return 0;
}

else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {

dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;


/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent->d_name, ".")!=0 ) && (strcmp(ent->d_name, "..")!=0 ))
{
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);

return EXIT_SUCCESS;

mostrarFiltrado(path);
}


void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;

fich=fopen(archivo, "r");
if (fich)
{
fseek(fich, 0L, SEEK_END);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;
while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE, dir->d_name);
else
if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 )
{
printf("%s%s\n",GREEN, dir->d_name);
char d_path[255];
sprintf(d_path, "%s/%s", path, dir->d_name);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}
closedir(d);
}


K-YreX

Además de lo comentado por @BloodSharp, veo más errores en el código:
  • Todos los (i == args) del for() no se van a cumplir nunca. El bucle no se va a repetir nunca con i = args, el último valor de i dentro del bucle será args-1 porque cuando i sea igual a args, la condición del for() no será true y no llegará a entrar en su interior.
  • El <case 2> del <switch> tiene otro error. Si pones "f" o "d" te dará un error porque una de las dos comprobaciones no se va a cumplir, mientras que si pones cualquier otro carácter te dará 2 errores seguidos. Tienes que cambiar eso.
  • Estás haciendo las asignaciones de cadenas con el operador =. En este caso no estás aprovechando la reserva de memoria que haces pues no estás copiando el contenido de una cadena en otra. Tan solo estás haciendo que el puntero que tú has creado apunte al comienzo de la cadena original. Para copiar el contenido debes usar la función strncpy() y es entonces cuando tienes que reservar memoria.

    Comprueba que la función readdir() devuelve un puntero.
    Si después de todo, no se resuelve tu problema, agrega un ejemplo de ejecución para tener más información y no ir a ciegas.

    PD: Sobre la duda de la línea 69, está bien. Si fuese argv estarías preguntando por el valor del primer argumento (que es una cadena), no por el índice del argumento.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

BloodSharp

Cita de: Allipson en  3 Diciembre 2021, 17:14 PM
He corregido los fallos, pero me sigue dando problemas con violacion de segmento. Paso el codigo modificado. El codigo consiste en simular la funcion del comando find.

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

Cita de: BloodSharp en  3 Diciembre 2021, 17:05 PM
Claro que te va a dar segfault porque el main siempre va declarado primero con el contador, luego con la matriz de strings de argumentos del programa:

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

Nop, el main tiene error volvé a prestar atención a mi primer respuesta.


B#



Pitagoras

Creo que he corregido los errores que me habeis dicho tanto @BloodSharp como @K-YreX , ya no me aparece el error de violacion de segmentos. Pero sigo con una duda y es que no se como hacer la recursividad dentro de mostrarFiltrado de cada uno de los parametros (type, maxdepth)
Paso es codigo modificado y adjunto una foto de la ejecucion del programa:


#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#define NORMAL  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"
#define RED  "\x1b[32m"

/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);

void mostrarFiltrado(char * path);

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

int opcion=0;
char *path; //Es para la ruta
char *type;
char *name;
int size;
int maxdepth;
int niveles;
unsigned num;

// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a "x"
//Devolverá 0 en caso de ser iguales caracter a caracter
if(i == argc-1){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if(i == argc-1){ //DUDA: utilizo == ?
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
strcpy(path, argv[i]);
break;

case 1: //Maxdepth
maxdepth <- atoi(argv[i]); //Convierte una cadena a un entero
niveles = maxdepth;

if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

break;

case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv[i], "d") != 0 && strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

//opcion = 3;
strcpy(type, argv[i]);
break;

case 3: //name



break;

case 4: //size


break;
}
}


}

/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;

if (argv[1] != NULL){

dir = opendir (argv[1]);

if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv[1] );
closedir (dir);
return 0;
}

else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {

dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;


/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent->d_name, ".")!=0 ) && (strcmp(ent->d_name, "..")!=0 ))
{
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);

return EXIT_SUCCESS;

mostrarFiltrado(path);
}


void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;

fich=fopen(archivo, "r");
if (fich)
{
fseek(fich, 0L, SEEK_END);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;
while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE, dir->d_name);
else
if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 )
{
printf("%s%s\n",GREEN, dir->d_name);
char d_path[255];
sprintf(d_path, "%s/%s", path, dir->d_name);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}
closedir(d);
}





No logro subir la foto, pero esto es lo que me devuelve la ejecucion:

allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ ./myfind2.o . -type d
                      myfind.o (16816 bytes)
                      myfind.c (0 bytes)
               .ejemplo_41.swp (1024 bytes)
                     myfind2.c (4827 bytes)
                      fich_new (9223372036854775807 bytes)
ProyectoP1Allipson(9223372036854775807 bytes)
                       Nuevo.c (628 bytes)
                         Nuevo (634 bytes)
ProyectoP1Allipson.zip (29409 bytes)
                     Nuevo_dir (9223372036854775807 bytes)
                      funciona (9223372036854775807 bytes)
                     myfind2.o (16856 bytes)
allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ ./myfind2.o . -maxdepth 2
                      myfind.o (16816 bytes)
                      myfind.c (0 bytes)
               .ejemplo_41.swp (1024 bytes)
                     myfind2.c (4827 bytes)
                      fich_new (9223372036854775807 bytes)
ProyectoP1Allipson.zip (9223372036854775807 bytes)
                       Nuevo.c (628 bytes)
                         Nuevo (634 bytes)
ProyectoP1Allipson.zip (29409 bytes)
                     Nuevo_dir (9223372036854775807 bytes)
                      funciona (9223372036854775807 bytes)
                     myfind2.o (16856 bytes)





MOD: Para publicar varios mensajes seguidos, modificar el primero y agregarlo a continuación, no hacer doble post.
MOD: Para código de un lenguaje específico, especificar el lenguaje en la etiqueta de code:
[code=c]
// El código C
[/code]


K-YreX

Fíjate en los comentarios de MOD que tienes en el mensaje anterior.  :rolleyes:



Piensa cada uno de los filtros por separado y luego tan solo tienes que juntarlos.
Obviamente tendrás que pasar los parámetros a la función para poder usarlos.

Para filtrar por tipo, lo único que tienes que hacer es comprobar que el tipo. Si el tipo es el que buscas, muestras la ruta y en caso contrario lo ignoras.
Para filtrar por profundidad con recursividad tienes que definir una condición de salida para dejar de aplicar la recursividad. En pseudocódigo sería algo así:

mostrarFiltrado := function(path, type, max_depth, current_depth)
INICIO
  dir := abrirDirectorio(path)
  current_path := obtenerSiguienteElemento(dir)
  MIENTRAS EXISTE current_path HACER
    SI current_path.type == type ENTONCES // Parte del codigo para el filtro por tipo
      MOSTRAR current_path
    FIN SI // Parte del codigo para el filtro por tipo
    SI current_path.type == directorio AND current_depth < max_depth ENTONCES // Parte del codigo para el filtro por profundidad
      mostrarFiltrado(current_path, type, max_depth, current_depth + 1)
    FIN SI // Parte del codigo para el filtro por profundidad
    current_path := obtenerSiguienteElemento(dir)
  FIN MIENTRAS
FIN


PD: Si sabes aprovechar el current_depth para establecer una tabulación al mostrar las rutas, la salida te quedará mucho más profesional.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Pitagoras

@K-YreX He intentado hacer lo que me has dicho pero no se muy bien como pasarlo al codigo C, paso nuevamente el codigo modificado y la informacion que me devuelve la ejecucion del programa(Me devuelve unos cuantos errores).



#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#define NORMAL  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"
#define RED  "\x1b[32m"

/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);

void mostrarFiltrado(char * path);

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

int opcion=0;
char *path; //Es para la ruta
char *type;
//char *name;
int size;
int maxdepth;
int niveles;
unsigned num;

// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
type = (char*)malloc(1024);
path = (char*)malloc(1024);
name = (char*)malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a "x"
//Devolverá 0 en caso de ser iguales caracter a caracter
if(i == argc-1){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if(i == argc-1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
strcpy(path, argv[i]);
break;

case 1: //Maxdepth
maxdepth <- atoi(argv[i]); //Convierte una cadena a un entero
niveles = maxdepth;

if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

break;

case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv[i], "d") != 0 && strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

//opcion = 3;
strcpy(type, argv[i]);
break;

case 3: //name



break;

case 4: //size


break;
}
}


}

/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;

if (argv[1] != NULL){

dir = opendir (argv[1]);

if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv[1] );
closedir (dir);
return 0;
}

else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {

dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;


/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent->d_name, ".")!=0 ) && (strcmp(ent->d_name, "..")!=0 ))
{
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);

return EXIT_SUCCESS;

mostrarFiltrado(path);
}


void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;

fich=fopen(archivo, "r");
if (fich)
{
fseek(fich, 0L, SEEK_END);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}


/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path, char *type, int maxdepth)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;

while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE, dir->d_name);
else
if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 )
{
printf("%s\n", dir->d_name);
char d_path[255];
printf(d_path, "%s/%s", path, dir->d_name);//imprime la ruta /mi_directorio
mostrarFiltrado(d_path);
}

}

current_path = type(dir);
while (current_path != NULL){
if(current_path.type == type){
if(strcmp(argv[i], "f") == 0 || ! type ){
printf(current_path);
} else if(strcmp(argv[i], "d") == 0 || ! type){
printf(current_path);
}
}
if(current_path.type == dir && current_depth < maxdepth){
mostrarFiltrado(current_path, type, maxdepth, current_depth + 1);
}

current_path = type(dir);
}

closedir(d);
}



A CONTINUACION LA EJECUCION DEL PROGRAMA

allipson@allipson-Ubuntu:~/Escritorio/practicas_SOP$ gcc myfind2.c -o myfind.o
myfind2.c: In function 'main':
myfind2.c:34:2: error: 'name' undeclared (first use in this function)
   34 |  name = (char*)malloc(1024);
      |  ^~
myfind2.c:34:2: note: each undeclared identifier is reported only once for each function it appears in
myfind2.c: At top level:
myfind2.c:185:6: error: conflicting types for 'mostrarFiltrado'
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:18:6: note: previous declaration of 'mostrarFiltrado' was here
   18 | void mostrarFiltrado(char * path);
      |      ^~~~~~~
myfind2.c: In function 'mostrarFiltrado':
myfind2.c:201:4: error: too few arguments to function 'mostrarFiltrado'
  201 |    mostrarFiltrado(d_path);
      |    ^~~~~~~
myfind2.c:185:6: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:206:2: error: 'current_path' undeclared (first use in this function)
  206 |  current_path = type(dir);
      |  ^~~~~~
myfind2.c:206:17: error: called object 'type' is not a function or function pointer
  206 |  current_path = type(dir);
      |                 ^~
myfind2.c:185:41: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |                                   ~~^~
myfind2.c:209:14: error: 'argv' undeclared (first use in this function)
  209 |    if(strcmp(argv, "f") == 0 || ! type ){
      |              ^~
myfind2.c:209:19: error: 'i' undeclared (first use in this function)
  209 |    if(strcmp(argv, "f") == 0 || ! type ){
      |                   ^
myfind2.c:215:34: error: 'current_depth' undeclared (first use in this function)
  215 |   if(current_path.type == dir && current_depth < maxdepth){
      |                                  ^~~~~
myfind2.c:216:4: error: too many arguments to function 'mostrarFiltrado'
  216 |    mostrarFiltrado(current_path, type, maxdepth, current_depth + 1);
      |    ^~~~~~~
myfind2.c:185:6: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)
      |      ^~~~~~~
myfind2.c:219:18: error: called object 'type' is not a function or function pointer
  219 |   current_path = type(dir);
      |                  ^~
myfind2.c:185:41: note: declared here
  185 | void mostrarFiltrado(char * path, char *type, int maxdepth)


K-YreX

Lee los errores que te aparecen pues te dicen bien claro cuáles son los problemas.
No hay mayor virtud para un programador que entender los errores que lanza el compilador.

Pasar a C no es lo mismo que copiar y pegar mi pseudocódigo. Tal y como dicen los errores, hay variables sin declarar, funciones que no existen (porque no existen) y conflictos en la definición de la función.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Pitagoras

me pueden ayudar a hacerlo porfavor, esque tengo que entregarlo en un par de horas y no se como hacerlo   :-(