Gracias, si no lo compile, solo lo edite y se me olvido editar el prototipo.
Saludos
Saludos
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: do-while en 1 Diciembre 2018, 16:56 PM
Solo un detalle, en de_queue estás usando memcpy para mover el contenido de un vector sobre sí mismo. Cuando usas memcpy sobre dos buferes que se superponen (como en este caso) el comportamiento queda indefinido (puede que a veces funcione y otras no o puede depender del compilador...). Lo correcto en estos casos es utilizar memmove, que utiliza un bufer auxiliar y así evitar que la información del vector se pueda "machacar".
¡Saludos!
char * de_queue(Queue *q) {
char *r = NULL;
int i = 0;
if(q->len >= 1) {
r = q->queue[0];
q->len--;
while(i < q->len) {
q->queue[i] = q->queue[i+1];
i++;
}
q->queue[i] = NULL;
}
return r;
}
Cita de: CalgaryCorpus en 1 Diciembre 2018, 17:04 PM
Por qué free_queue dice que devuelve int y no devuelve valor alguno?
Cita de: NNCKO en 1 Diciembre 2018, 01:33 AM
Solo busco una guia como para empezar no que lo hagan por mí! Muchas gracias de antemano!
www.tecnica1lomas.com.ar/tutoriales/lenguaje_C.pdf
/*
El tipo de dato se puede cambiar dependiendo de la implementación que se le quiera dar, también se tendrían que cambiar los tipos de datos devueltos por las funciones
En este caso yo quería un arreglo de apuntadores char* por lo cual el contenedor es char**
*/
typedef struct str_queue {
char **queue;
int len;
int max;
}Queue;
Queue *create_queue() {
Queue *r = malloc(sizeof(struct str_queue));
r->len = 0;
r->max = 2;
r->queue = malloc(sizeof(char*)*r->max);
return r;
}
void free_queue(Queue *q) {
if(q) {
if(q->queue)
free(q->queue);
free(q);
}
}
void en_queue(Queue *q, char *ptr) {
if((q->len+1) == q->max) {
q->max *= 2;
q->queue = realloc(q->queue,q->max*sizeof(char*));
}
if(q->queue != NULL) {
q->queue[q->len] = ptr;
q->len++;
}
}
char * de_queue(Queue *q) {
char *r = NULL;
int i = 0;
if(q->len >= 1) {
r = q->queue[0];
q->len--;
while(i < q->len) {
q->queue[i] = q->queue[i+1];
i++;
}
q->queue[i] = NULL;
}
return r;
}
int main() {
char *cadenas[10] = { "Cadena_0","Cadena_1","Cadena_2","Cadena_3","Cadena_4","Cadena_5","Cadena_6","Cadena_7","Cadena_8","Cadena_9"};
char *actual;
int index1,index2,i =0;
srand(time(NULL));
Queue *q = create_queue();
while(i < 10) {
index1 = rand() % 10;
index2 = rand() % 10;
printf("Agregando a la fila: %s\n",cadenas[index1]);
en_queue(q,cadenas[index1]);
printf("Agregando a la fila: %s\n",cadenas[index2]);
en_queue(q,cadenas[index2]);
printf("Saliendo de la fila %s\n",de_queue(q));
i++;
}
free_queue(q);
}
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_2
Agregando a la fila: Cadena_9
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_1
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_0
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_4
Agregando a la fila: Cadena_0
Saliendo de la fila Cadena_9
Agregando a la fila: Cadena_7
Agregando a la fila: Cadena_1
Saliendo de la fila Cadena_2
char * de_queue(Queue *q) {
char *r = NULL;
int i = 0;
if(q->len >= 1) {
r = q->queue[0];
q->len--;
while(i < q->len) {
q->queue[i] = q->queue[i+1];
i++;
}
q->queue[i] = NULL;
}
return r;
}
Cita de: CalgaryCorpus en 29 Noviembre 2018, 21:35 PM
Segun la documentacion, readdir usa memoria estatica, de modo que no corresponde usar free() sobre lo que se retorna.
Cita de: CalgaryCorpus en 29 Noviembre 2018, 22:10 PM
Sugiero reemplazar esto de pedir y liberar memoria en cada vuelta del while por solo pedir memoria cuando es necesario pedirla, y no liberarla en cada vuelta, solo liberarla al final del while.
directorio_archivo_temporal = readdir(directorio)
while(directorio_archivo_temporal = readdir(directorio) ) {
//etc..
free(directorio_archivo_temporal);
}
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int is_regular_file(const char *path);
int procesar_directorio(char *path);
int main(int argc,char **argv) {
switch(argc){
case 2: //Se espera directorio
procesar_directorio(argv[1]);
break;
default:
printf("Numero de argumentos no esperado\n");
break;
}
getchar();
}
int is_regular_file(const char *path) {
struct stat path_stat;
stat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
int procesar_directorio(char *path) {
DIR *directorio;
struct dirent *directorio_archivo_temporal;
char *path_copy;
int len_path;
char *path_temporal;
int len_path_temporal;
directorio = opendir(path);
if(directorio != NULL) {
len_path = strlen(path);
path_copy = malloc(len_path+2);
memcpy(path_copy,path,len_path);
if(path_copy[len_path - 1] == '\\' ){
path_copy[len_path] = '\0';
}
else {
path_copy[len_path] = '\\';
path_copy[len_path+1] = '\0';
len_path++;
}
while(directorio_archivo_temporal = readdir(directorio) ) {
len_path_temporal = strlen(directorio_archivo_temporal->d_name);
path_temporal = malloc(len_path+len_path_temporal+1);
path_temporal[len_path+len_path_temporal] = '\0';
sprintf(path_temporal,"%s%s",path_copy,directorio_archivo_temporal->d_name);
if(is_regular_file(path_temporal)) {
printf("%s\n",path_temporal);
}
else { //Directorio?
if( len_path_temporal > 2 ) { //not .. or .
procesar_directorio(path_temporal); //recursivamente
}
}
free(path_temporal);
}
free(path_copy);
closedir(directorio);
}
}
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int fsize(const char *filename);
int is_regular_file(const char *path);
int procesar_directorio(char *path,char *virtual_path);
int main(int argc,char **argv) {
switch(argc){
case 2: //Se espera directorio
procesar_directorio(argv[1],"/");
break;
case 3: //Se espera archivo + nombre de directorio de destino.
break;
default:
printf("Numero de argumentos no esperado\n");
break;
}
getchar();
}
int is_regular_file(const char *path) {
struct stat path_stat;
stat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
int fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
int procesar_directorio(char *path,char *virtual_path) {
DIR *directorio;
struct dirent *directorio_archivo_temporal,*result;
char *path_copy;
char *virtual_path_copy;
int len_path,len_virtual_path;
char *path_temporal;
char *virtual_path_temporal;
int len_path_temporal;
int len_virtual_path_temporal;
directorio = opendir(path);
if(directorio != NULL) {
len_path = strlen(path);
len_virtual_path = strlen(virtual_path);
virtual_path_copy = malloc(len_virtual_path+2);
path_copy = malloc(len_path+2);
memcpy(path_copy,path,len_path);
memcpy(virtual_path_copy,virtual_path,len_virtual_path);
if(path_copy[len_path - 1] == '\\' ){
path_copy[len_path] = '\0';
}
else {
path_copy[len_path] = '\\';
path_copy[len_path+1] = '\0';
len_path++;
}
if(virtual_path_copy[len_virtual_path - 1] == '/' ){
virtual_path_copy[len_virtual_path] = '\0';
}
else {
virtual_path_copy[len_virtual_path] = '/';
virtual_path_copy[len_virtual_path+1] = '\0';
len_virtual_path++;
}
/*
directorio_archivo_temporal = calloc(1,sizeof(struct dirent));
result == NULL;
*/
//while(readdir_r(directorio,directorio_archivo_temporal,&result) == 0 && result != NULL){
while(directorio_archivo_temporal = readdir(directorio) ) {
len_path_temporal = strlen(directorio_archivo_temporal->d_name);
//printf("readdir point to %p\n",directorio_archivo_temporal);
//printf("Len %i : %s\n",len_path_temporal,directorio_archivo_temporal->d_name);
path_temporal = malloc(len_path+len_path_temporal+1);
virtual_path_temporal = malloc(len_virtual_path + len_path_temporal+1);
path_temporal[len_path+len_path_temporal] = '\0';
virtual_path_temporal[len_virtual_path+len_path_temporal] = '\0';
sprintf(path_temporal,"%s%s",path_copy,directorio_archivo_temporal->d_name);
sprintf(virtual_path_temporal,"%s%s",virtual_path_copy,directorio_archivo_temporal->d_name);
if(is_regular_file(path_temporal)) {
//printf("Archivo :\"%s\"\n",path_temporal);
printf("%s\n",virtual_path_temporal);
}
else { //Directorio?
if( len_path_temporal > 2 ) { //not .. or .
procesar_directorio(path_temporal,virtual_path_temporal); //recursivamente
}
}
free(path_temporal);
free(virtual_path_temporal);
}
//free(directorio_archivo_temporal);
free(path_copy);
free(virtual_path_copy);
closedir(directorio);
}
else {
printf("El directorio \"%s\" no es un directorio valido\n",path);
}
}
C:\>generar_contenido.exe contenido
/index.html
while(directorio_archivo_temporal = readdir(directorio) ) {
//etc...
}
while(directorio_archivo_temporal = readdir(directorio) ) {
//etc..
free(directorio_archivo_temporal);
}
while(readdir_r(directorio,directorio_archivo_temporal,&result) == 0 && result != NULL){
You can use the iw command to get a full list of all capabilities of a physical wireless card:
iw list
void imprimir_ite(char *pcad)
if(*pcad!='\0')
printf("%c",*pcad);
printf("%c",pcad[0]);
if(pcad[0]!='\0');
pcad++;
imprimir_ite(pcad);