![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Aline |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
Необходимо реализовать разреженный массив. На просторах инета нашла пример, как это можно сделать http://www.galaxy797.net/c/shildt/23/2302.htm . Структура данных у меня можно сказать такая же как и в пример: поле ID - массив из 9 байтов ( значения 3-х индексов будут передоваться: 1-й индекс это 1-4 байт, 2-й индекс 5-8 байт и 3-й индекс - это 9-й байт), поле данных в виде массива из 120 байт, ну и ссылка на следующий элемент списка.
Перенесла всё это себе в проект. И тут посыпались ошибки :( Вернее 2 процедуры пока нормально перенеслись, но я к ним еще не обращалась из программы:
В процедуре insert_data есть сомнения,что правильно написана строка if (p->ID == i->ID), наверное надо сравнивать по каждому элементу,раз это массив А вот в этой функции сразу выскочили ошибки, она вызывается из процедуры delete_data
А вот объявление класса:
В общем,я запуталась и очень прошу вашей помощи... В приложении исходник и header Это сообщение отредактировал(а) Aline - 5.6.2013, 15:05 Присоединённый файл ( Кол-во скачиваний: 2 )
Projects.rar 1,49 Kb |
||||||
|
|||||||
| Guinness |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Я так понимаю Вам по ближе к Си нужно. Я бы ID сделал структурой, по типу этого:
К ней допишите необходимые функции. Далее по afdx:
Data - лучше сделать std::vector<BYTE>. Если, конечно, нет острой необходимости в контейнере Си. Указатели лучше уберем. Вместо этого лучше использовать std::list<afdx> или другой, подходящий Вам контейнер. Так вот, если это все дело мы храним в контейнерах, то написание всяких "чудо-функций" нам не особо и нужно. Достаточно посмотреть algorithms. Надеюсь, там Вы найдете большинство аналогов того, что Вы хотите сделать. Это сообщение отредактировал(а) Guinness - 5.6.2013, 15:45 |
||||
|
|||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
Guinness, спасибо! Гляну. Где то видела примеры с вектором, встречались. Просто я с этим ни разу не сталкивалась, новое для меня. Необходимо реализовать разреженный массив данных, тэо было самое простое и первое,что я нашла
Добавлено через 3 минуты и 30 секунд Guinness, а как Вам это? http://cppbuilder.ru/articles/0038.php Мне кажется это понятнее, хотя бы потому,что описание на русском:) Добавлено через 6 минут и 3 секунды Guinness, что я посмотрела и вообще ничего не поняла :( с указателями мне как то понятней |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
А что не понятно? Лучше понять, а то есть немалый шанс понапридумывать велосипедов. ЗЫ пример взят из данной книжки? ссылка ЗЗЫ а зачем Вам вообще разреженный массив? Это сообщение отредактировал(а) Guinness - 5.6.2013, 16:01 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
std::map - практически готовый разряженный массив.
|
|||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
Guinness, да, ссылка из того учебника
Массив нужен для тго,чтобы память экономит и данные будут разбросаны (ну по крайней мере я так поняла volatile, спасибо, посмотрю |
|||
|
||||
| Aline |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
volatile, А Вы могли бы привести пример для моего случая?
Я с помощью typedef определила :
Как оказалось данных всё таки 1500 байт приходит. Далее объявила:
Затем заполнила массивы key и data данными. И пытаюсь их связать:
Здесь выдает ошибку. Что неправильно и как сделать правильно? Или надо vector использовать для key и data? |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, чем дальше в лес, тем больше дров...
и как этим пользоваться в дальнейшем? |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Так же, как и вашим оригинальным typedef'ом:
Если из массива, то так же, как и ваш typedef (плюс лишние скобочки) -
|
||||||
|
|||||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, сейчас попробую,но что то для меня это темный лес совершенно :(
А структуру только для key надо делать? Добавлено @ 10:50 При написании этого:
а затем этого: компилятор выдал 44 ошибки... Это сообщение отредактировал(а) Aline - 6.6.2013, 10:50 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Aline, простые массивы в С/С++ - это такие не очень полноценные типы. их невозможно копировать, сравнивать и т.д. (операторами =, <), а это необходимо для мапа Лучше использовать вектор, вместо них. typedef std::vector <byte> Key_type; Либо, если размер фиксирован, можно обернуть в структуру, в последнем случае нужно будет написать еще оператор< Вот простейший пример:
Добавлено через 1 минуту и 42 секунды упс.., несколько последних сообщений не видел. |
|||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr
вот к примеру: [bcc32 Error] xtree(36): E2450 Undefined structure 'pair<const Key_type,unsigned char[1500]>' Full parser context Это сообщение отредактировал(а) Aline - 6.6.2013, 12:22 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
volatile, спасибо,не заметила:)
Добавлено через 13 минут и 23 секунды volatile, кое что исправила, но ошибки, вернее одна ошибка остается. Сильно не смейтесь, эта тема для меня совершенно новая, посмотрите код, плиз:
В последней строчке возникает ошибка: [bcc32 Error] SparseArray.cpp(62): E2277 Lvalue required |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В С (да и в С++) присваивать массивы нельзя. Заверните ваш массив в структуру (так же, как для KeyType) - структуры присваивать можно.
Добавлено через 1 минуту и 8 секунд PS. Переменные key и data лучше сделать локальными в функции btnInsertClick - глобальные переменные зло (особенно когда они не нужны |
|||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, спасибо!
У меня была мысль это сделать, но выше сказали, что без надобности так делать.... Сейчас попробую Добавлено через 3 минуты и 45 секунд xvr, мне еще предложили оформить data как vector, но почему то при объявлении типа возникает ошибка, что то не нравится в синтаксисе, пишет, что не хватает запятой вот так делала:
|
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
Guinness, у меня vector не получилось использовать, посмотрите выше сообщение
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если размер данных может меняться в процессе работы, то vector действительно будет лучше. Если же меняться не может, то будет наоборот - хуже. За счет накладных расходов на сам vector В принципе все правильно. Возможно Builder старый с не совсем полной stl |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
||||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, Билдер вроде не старый, не помню как правильно пишется, ну что там после BDS вышло?
Guinness, всё равно ругается,говорит что нет вектора в этом классе |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, вот какая версия у меня "Embarcadero® C++Builder® XE3 Version 17.0.4625.53395 ", просто среда на работе,а вечером я из дома писала, дома нет этого
исходник.... да собственно я скопировала Ваш текст и пыталась вместо структуры поставить тип vector
Пишет, что: [bcc32 Error] SparseArray.cpp(23): E2257 , expected на строчке typedef vector <char> Data_type;, ну и соответственно дальше ему не нравится объявление переменной data и пошло-поехало... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Aline, вверху
|
|||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
volatile, спасибо! Программа запустилась
Надо теперь реализовать еще поиск и удаление элемента. Я так понимаю, если надо обновить данные, то необходимо удалить элемент с этим ключом,а потом добавить новый, с новыми данными? И еще вывести на экран,что там в этом массиве хранится Это сообщение отредактировал(а) Aline - 7.6.2013, 09:52 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для поиска у map есть методы find или count + обычная индексация. Для удаления - erase
Нет, достаточно просто присвоить новые данные по старому ключу (как в массив - через индексацию) Для этого есть итератор (map<...>::iterator) и методы map'а begin() и end() |
|||
|
||||
| Aline |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 470 Регистрация: 22.7.2005 Где: Таруса Репутация: нет Всего: нет |
xvr, спасибо огромное! Буду юзать!
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |