Си - сложный язык по сравнению с автолиспом
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Си - сложный язык по сравнению с автолиспом

Си - сложный язык по сравнению с автолиспом

Ответ
Поиск в этой теме
Непрочитано 21.06.2012, 23:58 #1
Си - сложный язык по сравнению с автолиспом
C# ученик
 
Проектирование несущих строительных конструкций
 
Москва
Регистрация: 21.06.2012
Сообщений: 9

Можно объявить переменную с именем, связанным с результатом вычислений? Например получена точка P со значением (17.6,1.2,3.9) и создать переменную с именем x17_6y1_2z3_9?
Это нужно для выявления совпадающих элементов, чтобы не перебирать много раз список
Просмотров: 6943
 
Непрочитано 22.06.2012, 00:22
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от C# ученик Посмотреть сообщение
Можно объявить переменную с именем, связанным с результатом вычислений? Например получена точка P со значением (17.6,1.2,3.9) и создать переменную с именем x17_6y1_2z3_9?
Это нужно для выявления совпадающих элементов, чтобы не перебирать много раз список
C# != C.
Не занимайся извращениями - открой для себя IDictionary<Point3d, Int32> и будет тебе счастье. В качестве ключа - точка, в качестве значения - количество совпадений. Хотя... уточни насчёт "совпадающих элементов"... Тебе количество совпадений нужно, или сгруппированные идентификаторы объектов, у которых нужная тебе точка совпадает?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 22.06.2012 в 00:28.
hwd вне форума  
 
Непрочитано 22.06.2012, 01:23
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от C# ученик Посмотреть сообщение
Например получена точка P со значением (17.6,1.2,3.9) и создать переменную с именем x17_6y1_2z3_9?
Ага типо - если забудете мой номер телефона - он на странице 657472848272788992014782 в 478577838 строке. Прочитайте (нормально) хоть одну книжку по программированию - ОТКУДА Вы такое взяли.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 22.06.2012, 08:26
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от C# ученик Посмотреть сообщение
создать переменную с именем x17_6y1_2z3_9?
Цитата:
(IF (NOT 38d0bab0-107e-11dd-bd0b-0800200c9a66)
(PROGN
(PRINC "\nDocTabs.DRX")
(ARXLOAD "./support/DocTabs.DRX")
(SETQ 38d0bab0-107e-11dd-bd0b-0800200c9a66 T)
)
)
а вы говорите си, си...
gomer вне форума  
 
Автор темы   Непрочитано 23.06.2012, 00:40
#5
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


Вот, для чего это нужно

Есть намерение сделать МКЭ для строительной механики: пре- и постпроцессоры реализовать в автокаде с использованием
lsp файлов, а расчетное ядро сделать отдельным exe, общение .exe-шника с автокадом через .txt файлы, записываемые
и читаемые через жесткий диск.

Первые наработки

lsp для подготовки геометрии в автокаде, списков узлов, элементов, ребер, связей, сил (связи и силы еще не
сделаны). Вот здесь была трудность - как составить соответствие, например, узлов. После вычленения из набора примитивов
очередного узла, как выяснить, этот узел новый, или с такими координатами узел уже есть в списке. На каждом шаге перебирать
все имеющиеся в списке на данный момент узлы, это слишком долго для автокада (проверено на практике). Тогда я сделал
хитрушку с использованием (eval (read "....")), где в строку собирается выражение (setq ... ...). И в процессе выполнения программы,
таким образом, можно создавать переменные с именами, являющимися результатом вычислений. Не только значение переменной
является результатом вычислений, но и ее ИМЯ. При таком инструменте можно обработать набор узлов с отбраковкой
повторяющихся не за ~ n*n/4, а за ОДИН проход, т. е. за n операций. Берем очередной узел из набора, создаем строку, связанную
с координатами узла, например "nameXYZ" (X, Y, Z - конкретные числа), и проверяем значение переменной nameXYZ. Если
значение nil, то nameXYZ присваивается значение 1, и в список узлов записывается очередной узел. Работает быстрее, обработка
1000 элементов занимает 50 сек. В приложенном файле примера есть схема. В lsp есть функция po, она создает списки (глобальные
переменные) su, se, sr, sre, списки узлов, элементов, ребер, соответствие ребер и элементов соответственно.

Вопрос в том, может такие операции лучше делать методами языка СИ?
Или если в этом языке такой возможности нет, то простой перебор в exe файле все равно будет быстрее, чем данный lsp?Пример схемы.dwgПодготовка.LSP
C# ученик вне форума  
 
Непрочитано 23.06.2012, 00:55
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


зачем преобразовывать в строку, а потом читать из нее данные???
gomer вне форума  
 
Непрочитано 23.06.2012, 01:20
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от C# ученик Посмотреть сообщение
На каждом шаге перебирать все имеющиеся в списке на данный момент узлы, это слишком долго для автокада (проверено на практике)... Работает быстрее, обработка 1000 элементов занимает 50 сек.
Боюсь спросить сколько тогда медленно? Я более чем уверен, что ты просто накосячил с алгоритмом - распиши что тебе нужно сделать быстро (входные и выходные данные там где загвоздка), ну можещь и свой список привести из 1000 элементов - посмотрим за сколько секунд его удастся обработать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.06.2012, 06:50
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
(eval (read "....")), где в строку собирается выражение (setq ... ...). И в процессе выполнения программы,
таким образом, можно создавать переменные с именами, являющимися результатом вычислений
...
Цитата:
Вопрос в том, может такие операции лучше делать методами языка СИ?
Таких методов нет. Т.е. нельзя по строковому имени переменной получать значение. Но есть другие методы, не хуже.

Дима_ прав - явные косяки с алгоритмом. Зачем вообще переборы? Про ассоциированные списки в Lisp знаешь? Ведь сам AutoCAD очень быстро выдает запрошенные данные, и не перебирает свою ГБД. Ассоциированный список - это же фактически индексированная таблица в памяти.

Если уж задача с обработкой больших объемов данных, которые надо по сути отбирать по какому-то фильтру, да ещё из идеологически противоположных программных систем, можно воспользоваться СУБД. Хотя бы просто (для начала) локальный mdb-файл формата Access. Lisp с ним может работать через ADO посредством SQL-запросов. Данные можно отбирать (из любой системы программирования) также с помощью SQL. Да еще и визуализировать. Объем данных ничем не ограничен, всё выполняется практически мгновенно (если речь не о миллионах записей). И хранятся данные не в памяти, т.е. можно продолжать их обработку в любое время.

Наглядный пример быстроты - хотя бы этот форум. Щелкнув по ссылке на этот пост мы передаем в командную строку браузера запрос наподобие
Код:
[Выделить все]
showthread.php?p=937126#post937126
. Веб сервер разбирает эту строку, вытаскивает из неё параметры и отправляет серверу БД SQL-запрос наподобие
Код:
[Выделить все]
select * ftom posts where post_id = 937126
(здесь имя таблицы и поля я от балды написал). Сервер БД отдает результаты Веб-серверу, а Веб-сервер - браузеру. И всё это происходит чрезвычайно быстро, хотя 99.9% времени тратится не на выборку данных из сотен тысяч записей, а на их преобразование в HTML и транспортировку через Интернет. Сам запрос (если включить отладочную информацию) выполняется за сотые доли секунды. И это при сотнях тысяч (а может уже и миллионах) записей в базе данных.

Последний раз редактировалось ShaggyDoc, 23.06.2012 в 07:02.
ShaggyDoc вне форума  
 
Непрочитано 23.06.2012, 23:45
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ассоциированный список - это же фактически индексированная таблица в памяти.
Стоп стоп - не путайте человека - индексации ассоацивных списков нет - ищет перебором - хотя конечно делает это достаточно быстро - т.к. в памяти.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 24.06.2012, 18:37
#10
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


Подкажите, есть ли в C# возможность allocatable (не оговаривать жестко размер) для массивов? Нашел только массив типа a[][], но для него строки хотя и разной длины, но их размеры тоже оговорить надо.
C# ученик вне форума  
 
Непрочитано 24.06.2012, 19:23
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от C# ученик Посмотреть сообщение
Подкажите, есть ли в C# возможность allocatable (не оговаривать жестко размер) для массивов?
Есть. Почитай спецификацию языка.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 25.06.2012, 00:30
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от C# ученик Посмотреть сообщение
.
Можно посмотреть примеры здесь
http://through-the-interface.typepad.com/
http://drive-cad-with-code.blogspot....h-net-api.html
http://adndevblog.typepad.com/autocad/
http://www.acadnetwork.com/
http://profile.typepad.com/spiderinnet1

~'o'~

Последний раз редактировалось Олег (jr.), 25.06.2012 в 00:47.
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 07.07.2012, 22:32
#13
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


Подскажите, почему не получается сделать запись в файл?
Файл создается, но остается пустым после выполнения программы.
Фрагмент в программе такой:

char a;
a = 'N';

FileStream file1;
file1 = new FileStream("D:\\text1.txt", FileMode.Create, FileAccess.Write);
StreamWriter fs = new StreamWriter(file1);

fs.Write(a);
fs.Write(1456.15);
fs.Write("sdf2");
C# ученик вне форума  
 
Непрочитано 07.07.2012, 22:36
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от C# ученик Посмотреть сообщение
Подскажите, почему не получается сделать запись в файл?
Файл создается, но остается пустым после выполнения программы.
Фрагмент в программе такой:

char a;
a = 'N';

FileStream file1;
file1 = new FileStream("D:\\text1.txt", FileMode.Create, FileAccess.Write);
StreamWriter fs = new StreamWriter(file1);

fs.Write(a);
fs.Write(1456.15);
fs.Write("sdf2");
по теме Си тебе следует задавать вопросы на форуме программистов, а не на двг.ру. По поводу твоего "кода": не забывай вызывать Flush(), Close() и Dispose(). Букварь открой. Да и вообще у тебя какая-то ерунда написана. Разберись по книжке как с потоками работать, а не гадай...

Самый простой способ записи текста в файл:
Цитата:
File.WriteAllText(@"c:\test\MyTextFile.txt", "Раз, два, три - проверка связи...", Encoding.UTF8);
Строки для записи формируй не конкатенацией (это медленно и затратно по ресурсам), а с помощью StringBuilder. Подробности - в гугле.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 07.07.2012 в 22:44.
hwd вне форума  
 
Автор темы   Непрочитано 07.07.2012, 22:51
#15
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


а у меня следующей строкой как раз и стоит

file1.Close();

Разве этого не достаточно?

Flush() только освобождает буфер, и к файлу не имеет отношения.
На счет Displose() еще не знаю
C# ученик вне форума  
 
Непрочитано 07.07.2012, 22:57
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от C# ученик Посмотреть сообщение
а у меня следующей строкой как раз и стоит
file1.Close();
Я не телепат - вижу только то, что ты показываешь.
Цитата:
Сообщение от C# ученик Посмотреть сообщение
Разве этого не достаточно?
Не достаточно.
Цитата:
Сообщение от C# ученик Посмотреть сообщение
Flush() только освобождает буфер, и к файлу не имеет отношения.
Ну ну...

Цитата:
Сообщение от C# ученик Посмотреть сообщение
На счет Displose() еще не знаю
Ну так узнай.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 07.07.2012, 23:14
#17
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


Вот эта строка
File.WriteAllText(@"c:\test\MyTextFile.txt", "Раз, два, три - проверка связи...", Encoding.UTF8);
работает как часы, только не совсем как я хотел.
Она вместо всего, что уже есть в файле, записывает что в кавычках. Вот если бы добавлять запись
C# ученик вне форума  
 
Непрочитано 07.07.2012, 23:19
#18
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от C# ученик Посмотреть сообщение
Вот эта строка
File.WriteAllText(@"c:\test\MyTextFile.txt", "Раз, два, три - проверка связи...", Encoding.UTF8);
работает как часы, только не совсем как я хотел.
Она вместо всего, что уже есть в файле, записывает что в кавычках. Вот если бы добавлять запись
Если тебе нужно добавлять к уже существующей информации, то юзай
Код:
[Выделить все]
File.AppendAllText(@"c:\test\MyTextFile.txt", "Раз, два, три - проверка связи...", Encoding.UTF8);
Не ленись юзать поиск, эта информация находится на раз!
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 08.07.2012, 01:26
#19
C# ученик

Проектирование несущих строительных конструкций
 
Регистрация: 21.06.2012
Москва
Сообщений: 9


Цитата:
Сообщение от hwd Посмотреть сообщение
не забывай вызывать Flush(), Close() и Dispose()
можешь на примере моего кода показать как их использовать? Я написал file1.Flush(); file1.Close(); file1.Dilpose(); но это не помогло. В справке нет примера, сказано только для чего они, но это просто определения. А в спецификации языка в содержании я не нашел главы как общаться с файлами. У меня книга Э.А.Ишкова "C# Начала программирования", это от туда методика записи в файл FileStream, StreamWriter, Write. И Flush и Dispose там не использовались
C# ученик вне форума  
 
Непрочитано 08.07.2012, 11:51
1 | #20
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Попробуй из моих старых запасов
Код:
[Выделить все]
        public static void AppendLines()
        {
            // Путь файла для добавления
            FileStream fs = new FileStream(@"MyText.txt", FileMode.Open);

            StreamReader sr = new StreamReader(fs);
            // Путь временного файла куда добавляем текст
            FileStream fw = new FileStream(@"MyText_addded.txt", FileMode.Create);

            StreamWriter sw = new StreamWriter(fw);
            try
            {
                using (sr)
                {
                    using (sw)
                    {

                        StringBuilder sb = new StringBuilder();

                        string data = sr.ReadToEnd();
                        // Считываем файл в массив строк
                        string[] text = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
                        // Добавляем текст в StringBuilder
                        foreach (string str in text)
                            sb.Append(str + "\n");
                        // Строка которую добавляем
                        sb.AppendLine("New text line to append is follows here");

                        sw.Write(sb.ToString());

                    }
                }
                // Создаем бэкап для сохранения исходного файла, мало ли что
                File.Replace(@"MyText_addded.txt", @"MyText.txt", @"MyText_backup.txt");
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                fw.Close();
                fs.Close();
            }
        }
~'o'~
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Си - сложный язык по сравнению с автолиспом



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Основные плюсы AutoCad по сравнению с ArchiCad/ Saha AutoCAD 34 23.07.2009 17:05