Printable Version of Topic
Click here to view this topic in its original format |
Forums > Глюкодром > страдания по c++ |
Posted by: Lexus on 19-03-2013, 15:16 | ||
У нас есть здесь спецы в c++? Я тут начал работать По профессии я математик, но програмировать надо больше чем считать. Пока проект не начался, я хотел немножко подготовиться. задача стоит простая: считать с определённой директории список файлом и записать его в array/list делал так, но ничего не выдаёт:
как же я скучаю по c# )) |
Posted by: Lord KiRon on 20-03-2013, 00:15 |
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще. 2. В фолдере задать маску , типа "*.*" или "." а не только путь. 3. Не забудь проверку если не нашло ничего первый раз 4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика. |
Posted by: Lexus on 20-03-2013, 00:45 | ||
|
Posted by: Lexus on 20-03-2013, 13:07 | ||
|
Posted by: Lord KiRon on 20-03-2013, 19:57 |
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот. Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта. |
Posted by: Set on 21-03-2013, 10:34 |
Вспомнил, почему не перевариваю С++ http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx |
Posted by: Lexus on 21-03-2013, 17:07 | ||
Но не расслабляйтесь, всё только наинается= |
Posted by: Lord KiRon on 23-03-2013, 00:50 | ||
|
Posted by: Lexus on 30-03-2013, 15:31 |
Продолжимс Прога, что я пишу занимается парсингом гиганских файлов. Обычно файлы с 1мио строк, а то и более. задача строку считать и разбить по запятой. std::vector<std::string> results while(getline(ss.str,separator) { results.push_back(str); } и этот грёбанный пушбек жрёт 90% моего времени. Я пробывал сначала толкать в лист, в нём судя по описанию пушбек добрее, а потом коппировать в вектор. Но что-то всё стало медленнее чем)))) Можно ли как-то это обойти? |
Posted by: Lord KiRon on 31-03-2013, 01:07 |
Тебе повезло что ты это не на .Net делаешь. А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования. Например хранить в вкторе не стринги а позиции запятых. |
Posted by: Lexus on 31-03-2013, 02:14 | ||
|
Posted by: Set on 31-03-2013, 07:45 |
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ... |
Posted by: Lexus on 31-03-2013, 11:42 | ||
|
Posted by: Lord KiRon on 31-03-2013, 17:49 |
Если ты утверждаешь что память вообще не проблема , то открывай файл черз mapped view (чтоб он при доступе "выглядел" как бафер, а не файл) и сохраняй позиции запятых в файле в отдельный вектор. Походу можно не пользоватся вектором а хранить в массиве используя doubling, то есть держишь массив созданный через new скажем на 1000 мест и переменную "индекс" последнего свободного места + переменную размера массива. Если дошел до последнего (1000-го) то создаешь новый массив в два раза большр (то-есть 2000) и копируешь в него старый memcopy , а старый освобождаешь и так далее... операции подстановки лонгов в массив почти мгновенные, копирование непрерывного блока памяти тоже операция достаточно быстрая и в принципе будет (при правильно выбранном начальном размере) достаточно редкой. Если память вообще не ограничена можешь создать массив вообще один раз - размером с файл, тогда точно ничего и копировать не придется |
Posted by: FiL on 31-03-2013, 23:53 |
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки? Ну и таки если уж так хочется засовывать весь файл в память (несколько странно в этом разрезе говорить о гигантских файлах), то ты-бы место в векторе выделял крупными кусками. А то для каждой строки вызывается реаллокация памяти, ибо вектор переполнился. Выделил место по 1000 строк - считал 1000. Потом снова выделил одним разом еще под 1000. И так далее. Ну, или если строк всегда более миллиона, то можно не по 1000, а по 100.000 за итерацию. |
Posted by: Set on 01-04-2013, 00:02 | ||||
|
Posted by: Lord KiRon on 01-04-2013, 00:20 | ||||||
Тут вся проблема в том что зачем-то копируются данные из файла в памят, а зачем? |
Posted by: FiL on 01-04-2013, 08:33 |
Ну и что, что неизвестной? Можно выделять не точно, но все равно, большими кусками. Ресурсы кушаются именно на перевыделение памяти. А что читать всё в память не ясно зачем, так я с этого и начал. Но может оно реяльно нужно... |
Posted by: Set on 02-04-2013, 07:20 |
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче". При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки. |
Posted by: Lexus on 02-04-2013, 15:41 | ||
|
Posted by: FiL on 02-04-2013, 17:42 |
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память? Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения. |
Posted by: Lexus on 02-04-2013, 17:53 | ||
|
Posted by: Lord KiRon on 02-04-2013, 18:17 | ||
|
Posted by: FiL on 03-04-2013, 07:15 | ||||
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк. |
Posted by: Гордый on 03-04-2013, 09:43 | ||
|
Posted by: Lexus on 03-04-2013, 11:51 | ||
|
Posted by: Lord KiRon on 03-04-2013, 18:25 |
Иди пиши на матлабе. Это будет месть всем математикам, а то как подсунут "берешь вторую производную от функции контрастного фокуса", а потом неделю трахаешься как эту функцию построить и это самую производную на С++ взять. Причем делов там на 2 минуты, но только когда обьяснят человеческим языком что имели в виду. (И нечего мне тыкать что я математику заканчивал, кто ее там помнил после экзамена, кроме фамилий этих самых математеков, да и то с трудом) |
Posted by: Lexus on 10-04-2013, 13:39 |
апдейт: беда поборота. Жопец был в том, что все тестировалась в дебаг-модусе. Стартуешь прогу в релизе - всё шуршит! |
Posted by: FiL on 10-04-2013, 16:10 |
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт. |
Posted by: Lexus on 11-04-2013, 09:07 | ||
|
Posted by: Lexus on 03-05-2013, 11:42 |
вышел я на новый уровень камасутры и один уже не продвигаюсь. ниже на пикчере обозначена задача: Нужно сделать динамическую таблицу, т.е. будет во время работы проги пополняться. первык столбец должен быть чекбоксовым, второй текстовым полем, чтом его можно было редактировать (1 и 2) можно объеденить. 3 столбец - кнопка, 4-й тоже кнопка, 5 редактируемое поле, 6 - тоже редактируемое поле, по даблклику диалог выбора файла) и справа от него чекбокс, последний просто лейбл для вывода текста. П.с. весь секс делается в mfc c++. Ай нид хелп )) |
Posted by: Lord KiRon on 03-05-2013, 13:19 |
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ (http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске. |
Posted by: Lexus on 03-05-2013, 16:15 | ||
|
Posted by: Lord KiRon on 03-05-2013, 21:01 | ||||
А вот наоорот - без проблем MFC контроли в .Net засунуть можно. |
Posted by: FiL on 08-05-2013, 05:29 |
на html надо такое делать. |
Posted by: Lexus on 08-05-2013, 11:31 | ||
|
Posted by: VxWorks on 08-05-2013, 13:13 |
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере |
Posted by: Lexus on 08-05-2013, 13:31 | ||
|
Posted by: Гордый on 08-05-2013, 13:35 | ||
|
Posted by: VxWorks on 08-05-2013, 13:39 | ||||
|
Posted by: Lexus on 08-05-2013, 13:43 |
Гордый сегодня в форме ))))) |
Posted by: FiL on 08-05-2013, 18:52 | ||
|
Posted by: VxWorks on 08-05-2013, 20:05 |
До этого не дошло Но на dBase IV нас тоже заставляли что-то делать. Вот только у меня на все эти БД башка не варила и не варит. Написать какую-нибудь хрень типа системы управления светом в машине, без операционки и тому подобных заморочек - раз плюнуть. А вот БД или там вебсайт - это сложно. |
Posted by: Lexus on 20-05-2013, 22:00 |
Расслабились? ))) Я снова тут) Есть MFC CFormView, из него по нажатию кнопки из списка с объектами Optimization запускается: Optimization.validate() Нужно, чтоб по нажатию на кнопку открывaлось окно Dialog (class RunLog) и в него писалось в list_runlog (textbox) сообшения с функции Optimization.validate(). Как я понял делается это через Callback function. Но пока я не понял как это сделать и где и как дефинировать функции и в каких классах и как....короче нужно как для дебила пояснить))) Спасибо) |
Posted by: Lexus on 22-05-2013, 10:08 |
Кажется тут надо идти другим путём. Запускать validate во втором треде и через postmessage слать обновления в RunLog как где почём? Хеелп))) |
Posted by: FiL on 22-05-2013, 21:10 |
У тебя страдания не по С++, а по каким-то только тебе понятно каким библиотекам в какой-то конкретной среде. Так ты-бы описал что и где. Хотя мне оно уже не поможет. |
Posted by: Гордый on 22-05-2013, 21:25 | ||
|
Posted by: Set on 23-05-2013, 13:17 |
Спирт... и много. |
Posted by: Lord KiRon on 23-05-2013, 16:41 |
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально. |
Posted by: Lexus on 23-05-2013, 16:47 | ||
RunLog RunLogDlg; RunLogDlg.DoModal(); а можно для дебила на пальцах как с треда писать туда? |
Posted by: Lord KiRon on 24-05-2013, 17:28 |
DoModal Создает модальный диалог, который пока не закроешь ничего не работает в "родительском окне", тебе надо сделать Create, тогда будет не модальный, это раз. Насчет писать. Лучше всего в него не писать, а сделать так чтоб он сам читал из какого-то списка например, при получении определенного месаджа WM_USER + xxxx , который посылается ему с твоего потока, а твой поток в этот лист добавляет. Главное не забудь синхронизировать этот список, например critical section, то есть локай его когда твой поток добавляет и когда диалог считывает. Это простейший к имплементации вариант. |
Posted by: Lexus on 29-07-2013, 16:00 |
Так. С GUI уже всё отлажено и робит Теперь встал вопрос эфективности. Выяснилось, что файло пишется очень медленно. Всё время использовал output<<matrix[i][j]<<"\n"; это тормозит всё дико. Есть-ли варианты писать в текстовый файл по быстрее? fputs, fprintf? |
Posted by: Set on 29-07-2013, 23:18 |
raid 0 на ssd |
Posted by: Lexus on 30-07-2013, 09:04 | ||
|
Posted by: FiL on 30-07-2013, 17:14 |
a как файлт открывается? |
Posted by: Lexus on 30-07-2013, 17:46 | ||
|
Posted by: Set on 31-07-2013, 02:04 | ||
|
Posted by: FiL on 01-08-2013, 03:23 | ||||
P.S. А как файл открывается таки не важно |
Posted by: Lexus on 01-08-2013, 07:11 | ||
А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать? |
Posted by: FiL on 01-08-2013, 17:21 |
ну я-же сказал... через write. Выделяешь 50 мегов в памяти, суешь туда чего надо и потом write ему. по поводу Put - да, оно в буфер, а потом flush. Теперь вопрос - а когда "потом" этот flush происходит? |
Posted by: Set on 02-08-2013, 06:23 | ||
Как заполнится так и flush
|
Posted by: Lexus on 02-09-2013, 11:55 |
Чтоб вам не скучалось, я дальше потуплю Есть проект MFC C++ в VS2012, там из диалогов место для названия фирмы клиента. Задача, можно как-то автоматизировать процесс компайлинга, а именно: нужно поменять имя клиента на нужное и скомпилить в диру с этим именем. Клеинтов порядка 20, поэтому делать это в ручную - мега жопа. |
Posted by: Lord KiRon on 04-09-2013, 16:23 |
Используй переменные среды SET CLIENT=ВАСЯ_ПУПКИН Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) . То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде. Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию. |
Posted by: Lexus on 11-09-2013, 09:30 | ||
Спасибо всем, кто помогал. испытательный срок пройден )))) |
Posted by: Michael2000 on 08-11-2013, 17:08 |
http://habrahabr.ru/post/187770/ (http://habrahabr.ru/post/187770/ коменты жесть |
Posted by: Lexus on 08-01-2014, 15:13 |
Моя здесь и снова вопросы))) Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить. |
Posted by: Lord KiRon on 10-01-2014, 20:44 | ||
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут... Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство. https://support.microsoft.com/kb/196776 (https://support.microsoft.com/kb/196776 |
Posted by: Lexus on 10-01-2014, 20:54 | ||||
А если , например, у меня стоит на компе 2010 офис, народ юзает 2007, то будет ли работать? |
Posted by: Lord KiRon on 10-01-2014, 22:28 | ||||||
|