|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
Сортировка деревом. Процессы11.10.2012, 20:01. Показов 2218. Ответов 18
Метки нет (Все метки)
Здравствуйте, пытаюсь реализовать сортировку с помощью дерева произвольным числом процессов. Данные считываю из файла в пайп. Далее, процессы вызывают метод, в котором забирают по значению из пайпа и отправляют это значение в метод добавление узла дерева, до тех пор, пока не наткнутся на сигнальный символ. Указатель на корень дерева я размещаю в разделяемой памяти.
Ошибки состоят вот в чем: 1) В дерево добавляются элементы только самым первым процессом. остальные процессы только получают значение. 2) После работы всех процессов, дерево по-прежнему пусто. Хотя до этого происходило добавление в дерево, причем успешно.
0
|
||||||
| 11.10.2012, 20:01 | |
|
Ответы с готовыми решениями:
18
Сортировка деревом
Сортировка деревом и пузырьком |
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 12.10.2012, 09:29 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
| 12.10.2012, 12:19 [ТС] | ||||||
|
попытка увеличить размер
или можно как-то по-другому это сделать?
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 12.10.2012, 12:26 | |
|
А что на месте malloc() в AddNode()?
0
|
|
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
|
| 12.10.2012, 12:30 [ТС] | |
|
выделяем память для узла дерева
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 12.10.2012, 12:32 | ||
|
На всякий случай еще раз: память полученная через malloc() доступна только тому процессу который ее выделил.
0
|
||
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
| 12.10.2012, 12:50 [ТС] | ||||||
|
Вместо malloc сделала создание нового узла с помощью конструктора. Ничего не изменилось(
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 12.10.2012, 12:54 | |
|
Вы не понимаете, или плохо говорю... _ВСЕ_ узлы дерева _ДОЛЖНЫ_ лежать в SHM.
0
|
|
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
| 12.10.2012, 13:16 [ТС] | ||||||
|
Пытаюсь реализовать Ваш совет, но безуспешно. Правильно ли я отправляю узел в память или нет?
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 12.10.2012, 13:27 | |
|
Увы нет. Если у Вас сложности именно с SHM, то представьте что на его месте простой массив из N узлов дерева, именно узлов, а не указателей на узлы. shmat() в sort_tree() выделил память для этого массива, далее Вы должны брать память для узлов дерева только в этом массиве, никаких new и malloc().
Так же Вам потребуется синхронизация доступа к узлам дерева.
1
|
|
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
|
| 12.10.2012, 14:38 [ТС] | |
|
Спасибо за помощь, буду пытаться реализовать этот совет.
0
|
|
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
| 13.10.2012, 19:55 [ТС] | ||||||
|
Всё-таки, ничего не выходит.
1. Каждый процесс теперь строит своё дерево. 2. Также попробовала добавить семафор. Хоть он один, но несколько процессов каким-то образом могут одновременно его заблокировать. Вот, измененный код:
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|||
| 13.10.2012, 20:18 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
|
| 13.10.2012, 21:01 [ТС] | |
|
Мне не понятно. Опять ошибка с разделяемой памятью или что? алгоритм добавления в дерево верный. Когда на экран вывожу сообщения с помощью printf, то видно: процесс 0 добавляет в корень, потом в ветви. При этом одновременно процесс 1 опять добавляет корень и т.д.
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
||
| 13.10.2012, 21:22 | ||
|
адрес будет всегда один и тот же. Так же проблема с *a - строку так же надо скопировать в shm.
0
|
||
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
||||||
| 13.10.2012, 21:52 [ТС] | ||||||
|
Вообще, адрес отличается только одной цифровой, а иногда повторяется.
Вы не подскажите как мне это исправить/сделать? Просто уже никаких идей нет. И копирование *а в shm надо производить при добавление узла в дерево, так?
0
|
||||||
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 13.10.2012, 22:22 | |
|
просто представьте, что у Вас есть такое: char mem[1024*1024]; т.е. 1мб памяти и в этом куске памяти нужно создать дерево без пайпов, процессов и прочего. Сделайте указатель на этот кусок памяти char *memptr = mem[0]; И двигайте его при добавлении каждого узла дерева: node = (TREE *)memptr;memptr+=sizeof(TREE);
Копировать, да, при добавлении:strcpy(memptr, value);node->a=memptr;memptr+=strlen(value)+1+возмож ное выравнивание; Как сделаете - возвращайтесь к shm и процессам.
0
|
|
|
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 16
|
|
| 13.10.2012, 23:27 [ТС] | |
|
совсем не понятна вот эта операция: node = (TREE *)memptr; ведь memptr типа char*, можно ли так делать?
0
|
|
|
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
|
|
| 15.10.2012, 09:03 | |
|
А почему нет?
если не нравиться, кастуйте через (void *) или объявите mem[] как TREE (кстати проще будет считать выравнивание после записи TREE.a)
0
|
|
| 15.10.2012, 09:03 | |
|
Помогаю со студенческими работами здесь
19
Сортировка бинарным деревом Сортировка деревом с# Сортировка деревом
Сортировка бинарным деревом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|