Como todos saben, rand() es seudoaleatorio. Más, la implementación de la función rand() en la librería estándar de C usa el Generador linear congruencial, un algoritmo muy simple para obtener números seudoaleatorios, y es fácilmente predecible.
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ú
if (variableacomprobar & indexdelbit) {
/* etc... */
}
|15...|7|6|5|4|3|2|1|0|
| |
1 0
Ó
0 1
printf("\nFile %s", s[2])
/* Problema solucionado con padding */
char* s[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void read_directory(void)
{
/* Read the directory */
hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
int aaa = 0;
for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
if (drce[i].file_name[0] == 0x00) {
printf("\n-- END --\n");
break;
}
/* File has a long file name */
if ((drce[i].attributes & 0x0F) == 0x0F) {
s[i] = 0;
continue;
}
/* "File" is a directory */
if ((drce[i].attributes & 0x10) == 0x10){
printf("Directory name: %s\n", drce[i].file_name);
s[i] = 0;
continue;
}
/* If the first byte of file_name is 0xE5, means that the file is deleted */
if (drce[i].file_name[0] == FAT32_DELETED_FILE)
continue;
/* This should print the names of the files that are in the root directory... */
printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
s[aaa] = drce[i].file_name;
++aaa;
++files_in_directory;
}
}
void read_bpb(uint32_t offset)
{
/* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
fat_start = (offset + bpb.reserved_sectors);
fat_size = bpb.sectors_per_fat;
start_of_data = fat_start + (fat_size * bpb.fats_number);
start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
cluster_count = data_sects / bpb.sectors_per_cluster;
read_directory();
printf("\nFile %s", s[2]); /* Se ejecuta 3 veces sin razon */
}
Cita de: YreX-DwX en 8 Junio 2019, 23:00 PMEl resultado es el mismo, sobre los continue después lo arreglo...
La nueva variable <aaa> (que espero que le pongas un nombre mejor ) controla sólo <files_names_in_dir>. Es decir que tendría que ser:
file_names_in_dir[aaa] = drce[i].file_name;
++aaa;
De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber.
Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado...
HELLO TXT (16 veces)
El feliz pájaro hindú comia feliz cardillo mientras la cigüeña tocaba el saxofón. (16 veces más)
int aaa = 0;
void read_directory(void)
{
/* Read the directory */
hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
if (drce[i].file_name[0] == 0x00) {
kputs("\n-- END --\n");
break;
}
/* File has a long file name */
if ((drce[i].attributes & 0x0F) == 0x0F)
continue;
/* "File" is a directory */
if ((drce[i].attributes & 0x10) == 0x10){
kputs("Directory name: %s\n", drce[i].file_name);
continue;
}
/* If the first byte of file_name is 0xE5, means that the file is deleted */
if (drce[i].file_name[0] == FAT32_DELETED_FILE)
continue;
/* This should print the names of the files that are in the root directory... */
printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
file_names_in_dir[aaa] = drce[aaa].file_name;
++files_in_directory;
++aaa;
}
}
Cita de: string Manolo en 8 Junio 2019, 21:16 PMEl files_in_directory no esta relacionado. Creo que la basura es un salto extraño de memoria, ya que de ahi me imprime una string que no tiene nada que ver. Ese string basura no se relaciona de ninguna manera con el array de string que trato de imprimir.
Puedes publicar todo el código?
Estás usando variables como ++files_in_directory;
Qué no sé exactamente lo que hace.
Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o?
#include <stdio.h>
#include "hd.h" /* No relacionado con la falla */
char* file_names_in_dir[16];
void read_directory(void)
{
/* lee el directorio */
hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
if (drce[i].file_name[0] == 0x00) {
printf("\n-- END --\n");
break;
}
/* el archivo tiene un nombre largo */
if ((drce[i].attributes & 0x0F) == 0x0F)
continue;
/* el seudoarchivo es en realidad un directorio */
if ((drce[i].attributes & 0x10) == 0x10){
printf("Directory name: %s\n", drce[i].file_name);
continue;
}
/* el archivo no existe */
if (drce[i].file_name[0] == FAT32_DELETED_FILE)
continue;
printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
file_names_in_dir[i] = drce[i].file_name;
++files_in_directory;
}
}
void read_bpb(uint32_t offset)
{
/* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
fat_start = (offset + bpb.reserved_sectors);
fat_size = bpb.sectors_per_fat;
start_of_data = fat_start + (fat_size * bpb.fats_number);
start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
cluster_count = data_sects / bpb.sectors_per_cluster;
read_directory();
printf("%s", file_names_in_dir[0]);
}
/* Reservamos 16 elementos de string */
char* file_names_in_dir[16];
for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
...
if (drce[i].file_name[0] == 0x00)
break;
file_names_in_dir[i] = drce[i].file_name;
++files_in_directory;
}
...
printf("%s", file_names_in_dir[0]);
...