Russian Qt Forum
Ноябрь 23, 2024, 04:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анализ списка файловых путей.  (Прочитано 3010 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« : Ноябрь 01, 2014, 21:07 »

Добрый вечер.

Предупреждаю сразу: данная тема не содержит проблемы. И создана исключительно для интересного время провождения.

Итак, дабы немножко скоротать вечер за интересной (я надеюсь) задачкой, решил запостить ребус:

Рассмотрим следующую иерархию каталогов, которая содержит библиотеки:

Цитировать
external
 |
 |--common_lib
 |   |
 |   |--lib1
 |   |   |--include
 |   |   |   `--lib1.h
 |   |   |--lib32
 |   |   |   `--lib1.lib
 |   |   `--lib64
 |   |       `--lib1.lib
 |   `--lib2
 |       |--include
 |       |   `--lib2.h
 |       |--lib32
 |       |   `--lib2.lib
 |       `--lib64
 |           `--lib2.lib
 |
 `--add
     |--include
     |   `--add.h
     |--lib32
     |   `--add.lib
     `--lib64
         `--add.lib

Очевидно, что в данном случае получается 3 библиотеки: lib1, lib2, add.

Как именно человек, глядя на иерархию каталогов определяет имена и месторасположение библиотек?

Очень просто:
Он видит файлы из которых могут состоять библиотеки: *.lib и *.h
И находит каталог, общий для этих файлов.
Имя этого каталога и определяет и имя, и месторасположение библиотеки.

--------------------------------------


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

Например такой:

Цитировать
external/common_lib/lib1/include/lib1.h
external/common_lib/lib1/lib32/lib1.lib
external/common_lib/lib1/lib64/lib1.lib

external/common_lib/lib2/include/lib2.h
external/common_lib/lib2/lib32/lib2.lib
external/common_lib/lib2/lib64/lib2.lib

external/add/include/add.h
external/add/lib32/add.lib
external/add/lib64/add.lib

Список может быть не отсортированным.
В нем могут оказаться "левые" пути, например к файлам документации, или к ресурсам.

В нем могут оказаться "левые" пути, например к каталогу вообще без файлов.
(для простоты будем считать, что имя без расширения - это каталог)

Если в пути, в имени каталога или файла присутствует *ignore*, то такой путь должен быть сразу же проигнорирован.

Если в пути, в имени каталога, или файла сначала постречалось *32, а затем *64, то должно быть выдано предупреждение, а сам файл - проигнорирован.

Если в пути, в имени каталога, или файла сначала постречалось *64, а затем *32, то должно быть выдано предупреждение, а сам файл - проигнорирован.

В качестве расширений файлов из которых может состоять либка - h,hpp,lib,dll



1. Нужно просканировать список путей, и обнаружить месторасположение и имена всех библиотек.

2. Пользователь указывает имя библиотеки, и адресную модель (32/64), и на выходе получает пути к хэдэрам библиотеки, пути к либкам, и список имен либок.





« Последнее редактирование: Ноябрь 01, 2014, 21:17 от _Bers » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 03, 2014, 12:33 »

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

Код
C++ (Qt)
QStringList LookupLib( const QStringList & path,  // спысок путей
                                const QString & libName,   // имя либы
                                const QStringList & extensions, // список расширений
                                const QStringList & arch,  // список архитектур    
                                int archNo ); // индекс нужной архитектуры                                
 
Для каждой строки: проверил подходит ли extensions, имя либы, и что архитектура встречается 1 раз и что др нет. Конечно можно это все написать, но не думаю что эта рутина кому-то интересна. Если надо пошустрее искать - сократил бы исходный контейнер напр переставив бракованные строки в хвост (напр по архитектуре и расширению).

Возможно и есть какой-то др способ, но если и так за полчаса можно сделать - чего тратить время на поиски?  Улыбающийся
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #2 : Ноябрь 03, 2014, 14:28 »

Задачу хорошо описали, но сама задача мне нисколько не интересна.

Очень жаль, что задача не вызвала интереса.

На самом деле, если попробовать решить - вылезут различные нюансы (не каждый сможет придумать решение за полчаса).
И окажется, что решений множество разной степени костыльности.

Интересно было бы глянуть на интересные решения: сочетание простоты и скорости работы.


Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Ноябрь 05, 2014, 10:21 »

а почемубы не изменить условия задачи ? )
положить все h в один каталог, 32 и 64 бита разделить по lib32 и lib64
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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