Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Что то не так в рекурсивной проце Помогите пж-ста  (Прочитано 1297 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
у меня в общем проца сканирующая файловую систему Задача в том что бы найти все имена файлов с одинаковым  inode и вывести их Иначе говоря найти имя файла и имена жестких ссылок
Я сканирую файловую систему рекурсивно Перед входом в рикурсию я проверяю это каталог или файл и если это  файл то вызывается проца работающая с глобальным массивом в котором я сохраняю имена Почему то в глобальном массиве сохраняются имена файлов но не имена жест-х ссылок Хотя перед рекрсией я вывожу данные о найденых файлах и там нормально отображаются все файлы Если кто знает о рекурсии, что там происходит со стеком при возврате из рекурсии? Не затираются ли имена при выходе из рекурсии Я точно не помню всю технику рекурсивных вызовов

В чем может быть проблема?



Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Код в студию.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Выкладываю исходный код

///////////////////////////////////////////////////// Это то что я заполняю
struct fnode { //структура для
  char *filelist[100];
  long countname;
  long inode;
};

struct fnode myfiles[500];
long countfile = 0;

///////////////////////////////////////////////////// Это где я вызывю ф-ю заполнения

void printdir(char *dir,int depth){
  DIR *dirpath;
  struct dirent *entry;
  struct stat statbuf;
  if((dirpath = opendir(dir)) == NULL){
    fprintf(stderr,"Не могу открыть каталог %s
",dir);
    return;
  }
  chdir(dir);
  while((entry = readdir(dirpath)) != NULL){
     memset(&statbuf,0,sizeof(statbuf));
     lstat(entry->d_name,&statbuf);
    if(!S_ISDIR(statbuf.st_mode)){
      initFileData(entry->d_name,statbuf.st_ino); // вот здес я заполняю глобальный массив Массив заполняется не так как надо
      getData(entry->d_name,statbuf.st_ino); // для теста
        printf("%*s %d %s - этот файл имеет %d жестких ссылок
",depth," ",statbuf.st_ino,entry->d_name,statbuf.st_nlink);  //а здесь нормально все отображается
    }
     if(S_ISDIR(statbuf.st_mode)){
        if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0) continue;
        printf("%*s%s - это каталог
",depth," ",entry->d_name);
        printdir(entry->d_name,depth+4);
     }
  }//endwhile
  chdir("..");
  closedir(dirpath);
}

///////////////////////////////////////////////////// Чем я заполняю
initFileData(entry->d_name,statbuf.st_ino);
getData(entry->d_name,statbuf.st_ino); // это так для теста Выходит так что имена файлов получаются какие то нетакие

///////////////////////////////////////////////////// Это ф-ии которые отображают заполненные данные (массивы)

     printdir(topdir,0);
     outData();

///////////////////////////////////////////////////////////////////////////////////

Здесь привожу полный текст исходного кода Пож-ста не поленитесь откомпильте В чем ошибка Программной ошибки так таковой я не вижу Ну никак не могу понять почему не так заполняется массив

(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 04 Декабря 2009, 16:53:16:
У меня еще один вопрос возник Си подерживает ссылку?
« Последнее редактирование: 04 Декабря 2009, 16:53:17 от solyr »

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
while((entry = readdir(dirpath)) != NULL){
На каждой итерации этого цикла entry меняется.

initFileData(entry->d_name,statbuf.st_ino);
Здесь ты передаёшь указатель на строку, содержащую имя файла (entry->d_name), в функцию initFileData

myfiles[i].filelist[myfiles.countname] = name;
Внутри функции происходит сохранение этого указателя в массиве myfiles.

Проблема в том, что ты сохраняешь в массиве только указатель на строку, а не саму строку.  Соответственно, на следующей итерации цикла ранее сохраненный указатель будет указывать уже на другую строку. А к концу выполнения программы все эти указатели могут указывать чёрти куда.

Для копирования строк необходимо использовать функцию strcpy, не забыв при этом выделить место под них.

PS. Используй кнопочку "код" для форматирования кода.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
а почему на конструкцию выделения памяти под строку

myfiles.filelist[myfiles.countname] = new char[strlen(name)+1];
strcpy(myfiles.filelist[myfiles.countname],name);

а также последующего освобождения выделенной памяти

delete [] myfiles.filelist[j];

компилятор gcc ругается и выдает

sajan@sajan-desktop:~/soft$ gcc printdir.c
printdir.c: In function ‘printfiles’:
printdir.c:40: error: ‘delete’ undeclared (first use in this function)
printdir.c:40: error: (Each undeclared identifier is reported only once
printdir.c:40: error: for each function it appears in.)
printdir.c:40: error: expected expression before ‘]’ token
printdir.c: In function ‘initFileData’:
printdir.c:51: error: ‘new’ undeclared (first use in this function)
printdir.c:51: error: expected ‘;’ before ‘char’
printdir.c:61: error: expected ‘;’ before ‘char’
printdir.c:74: error: expected ‘;’ before ‘char’

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Потому что уже разберись наконец что такое Си и что такое С++
Это два РАЗНЫХ языка. От сюда все твои проблемы. Википедию почитай хотябы.

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Все рвзобрался с памятью ) И вправду издержка от С++ чувствуется при программировании на Си
« Последнее редактирование: 05 Декабря 2009, 06:43:36 от solyr »

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.