Lexus
@ 19-03-2013, 15:16
У нас есть здесь спецы в c++?
Я тут начал работать ;) По профессии я математик, но програмировать надо больше чем считать. Пока проект не начался, я хотел немножко подготовиться. задача стоит простая:
считать с определённой директории список файлом и записать его в array/list
делал так, но ничего не выдаёт:
CODE |
#include "stdafx.h" #include <iostream> #include <windows.h> #include <wtypes.h> #include <string>
using namespace std;
bool FileExists(const TCHAR *fileName); bool dirExists(const string& dirName_in);
int _tmain(int argc, _TCHAR* argv[]) {
const string Folder = "C:\\tests\\MUC unverdichtet\\"; HANDLE fHandle; WIN32_FIND_DATA wfd; fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd); do {
if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgendes Verzeichnis wurde gefunden:",0); } else { MessageBox(0,wfd.cFileName,(LPCWSTR)"Folgende Datei gefunden:",0); } } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); return 0; }
|
как же я скучаю по c# ;)))
Lord KiRon
@ 20-03-2013, 00:15
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.
2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.
Lexus
@ 20-03-2013, 00:45
QUOTE (Lord KiRon @ 19-03-2013, 22:15) |
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.
2. В фолдере задать маску , типа "*.*" или "." а не только путь. 3. Не забудь проверку если не нашло ничего первый раз 4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика. |
завтра попробую. спасибо. я тут не раз ешё буду доставать ;))
Lexus
@ 20-03-2013, 13:07
CODE |
const string Folder = "C:\\tests\\MUC unverdichtet\\*.*"; HANDLE fHandle; WIN32_FIND_DATA wfd; string b = Folder+"*"; fHandle=FindFirstFile((LPCWSTR)Folder.c_str(),&wfd); do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { cout<<wfd.cFileName<<endl;
} else { cout<<wfd.cFileName<<endl;;
} } } while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); |
Output: 0013F8DC или другие подобные.
Lord KiRon
@ 20-03-2013, 19:57
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.
Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.
Lexus
@ 21-03-2013, 17:07
QUOTE (Lord KiRon @ 20-03-2013, 17:57) |
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.
Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта. |
забил я на это и сделал через dirent :)
Но не расслабляйтесь, всё только наинается=
Lord KiRon
@ 23-03-2013, 00:50
QUOTE (Set @ 21-03-2013, 09:34) |
Вспомнил, почему не перевариваю С++ :drag:
|
Плохому танцору...
:diablo:
Lexus
@ 30-03-2013, 15:31
Продолжимс :)
Прога, что я пишу занимается парсингом гиганских файлов. Обычно файлы с 1мио строк, а то и более. задача строку считать и разбить по запятой.
std::vector<std::string> results
while(getline(ss.str,separator)
{
results.push_back(str);
}
и этот грёбанный пушбек жрёт 90% моего времени. Я пробывал сначала толкать в лист, в нём судя по описанию пушбек добрее, а потом коппировать в вектор. Но что-то всё стало медленнее чем))))
Можно ли как-то это обойти?
Lord KiRon
@ 31-03-2013, 01:07
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
Lexus
@ 31-03-2013, 02:14
QUOTE (Lord KiRon @ 30-03-2013, 23:07) |
Тебе повезло что ты это не на .Net делаешь. А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования. Например хранить в вкторе не стринги а позиции запятых. |
Память меня меньше CPU напрягает)))))
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
Lexus
@ 31-03-2013, 11:42
QUOTE (Set @ 31-03-2013, 06:45) |
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ... |
А возможно определить кол-во не читая всё файло?
Lord KiRon
@ 31-03-2013, 17:49
Если ты утверждаешь что память вообще не проблема , то открывай файл черз mapped view (чтоб он при доступе "выглядел" как бафер, а не файл) и сохраняй позиции запятых в файле в отдельный вектор.
Походу можно не пользоватся вектором а хранить в массиве используя doubling, то есть держишь массив созданный через new скажем на 1000 мест и переменную "индекс" последнего свободного места + переменную размера массива.
Если дошел до последнего (1000-го) то создаешь новый массив в два раза большр (то-есть 2000) и копируешь в него старый memcopy , а старый освобождаешь и так далее...
операции подстановки лонгов в массив почти мгновенные, копирование непрерывного блока памяти тоже операция достаточно быстрая и в принципе будет (при правильно выбранном начальном размере) достаточно редкой.
Если память вообще не ограничена :) можешь создать массив вообще один раз - размером с файл, тогда точно ничего и копировать не придется :)
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?
Ну и таки если уж так хочется засовывать весь файл в память (несколько странно в этом разрезе говорить о гигантских файлах), то ты-бы место в векторе выделял крупными кусками. А то для каждой строки вызывается реаллокация памяти, ибо вектор переполнился. Выделил место по 1000 строк - считал 1000. Потом снова выделил одним разом еще под 1000. И так далее. Ну, или если строк всегда более миллиона, то можно не по 1000, а по 100.000 за итерацию.
QUOTE (Lexus @ 31-03-2013, 11:42) |
QUOTE (Set @ 31-03-2013, 06:45) | Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ... | А возможно определить кол-во не читая всё файло? |
Как написал
FiL, увеличивай размер вектора на, скажем, миллион записей за раз. .resize() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций.
Lord KiRon
@ 01-04-2013, 00:20
QUOTE (Set @ 31-03-2013, 23:02) |
QUOTE (Lexus @ 31-03-2013, 11:42) | QUOTE (Set @ 31-03-2013, 06:45) | Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ... | А возможно определить кол-во не читая всё файло? | Как написал FiL, увеличивай размер вектора на, скажем, миллион записей за раз. .resize() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций. |
С вектором стрингов не поможет, так как стринги неизвестной длины.
Тут вся проблема в том что зачем-то копируются данные из файла в памят, а зачем?
Ну и что, что неизвестной? Можно выделять не точно, но все равно, большими кусками. Ресурсы кушаются именно на перевыделение памяти.
А что читать всё в память не ясно зачем, так я с этого и начал. Но может оно реяльно нужно...
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".
При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки.
Lexus
@ 02-04-2013, 15:41
QUOTE (FiL @ 31-03-2013, 22:53) |
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?
|
там инфа хранится не в строках, а в столбцах. т.е. надо всё считать, отсортировать, сравнить и так далее. но всё столбцами ;(
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Lexus
@ 02-04-2013, 17:53
QUOTE (FiL @ 02-04-2013, 16:42) |
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память? Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения. |
Я наверное пример реальный приведу))) Шас приготовлю все данные ;) И запошу :)
Lord KiRon
@ 02-04-2013, 18:17
QUOTE (Set @ 02-04-2013, 06:20) |
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".
При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки. |
...А куча реально фрагментируется и при реальных реэлокациях из за этой фрагментации реально же тормозит.
QUOTE (Lexus @ 02-04-2013, 10:53) |
QUOTE (FiL @ 02-04-2013, 16:42) | хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память? Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения. | Я наверное пример реальный приведу))) Шас приготовлю все данные ;) И запошу :) |
Давненько мы не брали в руки шашек :)
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк.
Гордый
@ 03-04-2013, 09:43
QUOTE (FiL @ 03-04-2013, 06:15) |
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк. |
а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol:
Lexus
@ 03-04-2013, 11:51
QUOTE (Гордый @ 03-04-2013, 08:43) |
а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol: |
тут карьера математика как програмиста на кону)))
Lord KiRon
@ 03-04-2013, 18:25
Иди пиши на матлабе.
Это будет месть всем математикам, а то как подсунут "берешь вторую производную от функции контрастного фокуса", а потом неделю трахаешься как эту функцию построить и это самую производную на С++ взять.
Причем делов там на 2 минуты, но только когда обьяснят человеческим языком что имели в виду.
(И нечего мне тыкать что я математику заканчивал, кто ее там помнил после экзамена, кроме фамилий этих самых математеков, да и то с трудом)
Lexus
@ 10-04-2013, 13:39
апдейт: беда поборота. Жопец был в том, что все тестировалась в дебаг-модусе. Стартуешь прогу в релизе - всё шуршит!
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт.
Lexus
@ 11-04-2013, 09:07
QUOTE (FiL @ 10-04-2013, 15:10) |
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт. |
Да не, там всё очень компакто вышло))) Я же по пути не только дебаг на релиз поменял)))) Но я вас ешё не отпускаю))) Стрижка только началась)))
Lexus
@ 03-05-2013, 11:42
вышел я на новый уровень камасутры и один уже не продвигаюсь.
ниже на пикчере обозначена задача:
Нужно сделать динамическую таблицу, т.е. будет во время работы проги пополняться.
первык столбец должен быть чекбоксовым, второй текстовым полем, чтом его можно было редактировать (1 и 2) можно объеденить. 3 столбец - кнопка, 4-й тоже кнопка, 5 редактируемое поле, 6 - тоже редактируемое поле, по даблклику диалог выбора файла) и справа от него чекбокс, последний просто лейбл для вывода текста.
П.с. весь секс делается в mfc c++.
Ай нид хелп :)))
Lord KiRon
@ 03-05-2013, 13:19
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid (
http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске.
Lexus
@ 03-05-2013, 16:15
QUOTE (Lord KiRon @ 03-05-2013, 12:19) |
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске. |
Пока выбора нет ;( Ведушая проггерша тоже трахается над этим вопросом, но оснавная цель сделать в mfc, если уже никак, то делать в нете. А как там с привязкой нетовской оболчки к с++ коду?
Lord KiRon
@ 03-05-2013, 21:01
QUOTE (Lexus @ 03-05-2013, 15:15) |
QUOTE (Lord KiRon @ 03-05-2013, 12:19) | Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске. | Пока выбора нет ;( Ведушая проггерша тоже трахается над этим вопросом, но оснавная цель сделать в mfc, если уже никак, то делать в нете. А как там с привязкой нетовской оболчки к с++ коду? |
Можно, я делал, но трахаться придется намного больше.
А вот наоорот - без проблем MFC контроли в .Net засунуть можно.
на html надо такое делать. :)
Lexus
@ 08-05-2013, 11:31
QUOTE (FiL @ 08-05-2013, 04:29) |
на html надо такое делать. :) |
:punk:
VxWorks
@ 08-05-2013, 13:13
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Lexus
@ 08-05-2013, 13:31
QUOTE (VxWorks @ 08-05-2013, 12:13) |
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh: |
Чур тебя)))) Даже не хочу думать о таком ;)))))) :fear2:
Гордый
@ 08-05-2013, 13:35
QUOTE (VxWorks @ 08-05-2013, 12:13) |
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh: |
Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol:
VxWorks
@ 08-05-2013, 13:39
QUOTE (Гордый @ 08-05-2013, 11:35) |
QUOTE (VxWorks @ 08-05-2013, 12:13) | Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh: | Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol: |
Ты знал, ты знал! :D:
Lexus
@ 08-05-2013, 13:43
Гордый сегодня в форме ;))))))
QUOTE (VxWorks @ 08-05-2013, 06:13) |
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh: |
Ну, хорошо хоть не компилятор на SQL. :)
VxWorks
@ 08-05-2013, 20:05
До этого не дошло :) Но на dBase IV нас тоже заставляли что-то делать.
Вот только у меня на все эти БД башка не варила и не варит. :(
Написать какую-нибудь хрень типа системы управления светом в машине, без операционки и тому подобных заморочек - раз плюнуть. А вот БД или там вебсайт - это сложно.
Lexus
@ 20-05-2013, 22:00
Расслабились? ))) Я снова тут)
Есть MFC CFormView, из него по нажатию кнопки из списка с объектами Optimization запускается:
Optimization.validate()
Нужно, чтоб по нажатию на кнопку открывaлось окно Dialog (class RunLog) и в него писалось в list_runlog (textbox) сообшения с функции Optimization.validate(). Как я понял делается это через Callback function. Но пока я не понял как это сделать и где и как дефинировать функции и в каких классах и как....короче нужно как для дебила пояснить))) Спасибо)
Lexus
@ 22-05-2013, 10:08
Кажется тут надо идти другим путём. Запускать validate во втором треде и через postmessage слать обновления в RunLog
как где почём? Хеелп)))
У тебя страдания не по С++, а по каким-то только тебе понятно каким библиотекам в какой-то конкретной среде. Так ты-бы описал что и где. Хотя мне оно уже не поможет.
Гордый
@ 22-05-2013, 21:25
QUOTE (FiL @ 22-05-2013, 20:10) |
Хотя мне оно уже не поможет. |
интересно, а что может помочь
FiLу!? :w00t:
Спирт... и много. :laugh:
Lord KiRon
@ 23-05-2013, 16:41
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально.
Lexus
@ 23-05-2013, 16:47
QUOTE (Lord KiRon @ 23-05-2013, 15:41) |
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально. |
Я сейчас открываю так
RunLog RunLogDlg;
RunLogDlg.DoModal();
а можно для дебила на пальцах как с треда писать туда?
Lord KiRon
@ 24-05-2013, 17:28
DoModal Создает модальный диалог, который пока не закроешь ничего не работает в "родительском окне", тебе надо сделать Create, тогда будет не модальный, это раз.
Насчет писать.
Лучше всего в него не писать, а сделать так чтоб он сам читал из какого-то списка например, при получении определенного месаджа WM_USER + xxxx , который посылается ему с твоего потока, а твой поток в этот лист добавляет.
Главное не забудь синхронизировать этот список, например critical section, то есть локай его когда твой поток добавляет и когда диалог считывает.
Это простейший к имплементации вариант.
Lexus
@ 29-07-2013, 16:00
Так. С GUI уже всё отлажено и робит ;)
Теперь встал вопрос эфективности. Выяснилось, что файло пишется очень медленно. Всё время использовал output<<matrix[i][j]<<"\n"; это тормозит всё дико. Есть-ли варианты писать в текстовый файл по быстрее?
fputs, fprintf?
Lexus
@ 30-07-2013, 09:04
QUOTE (Set @ 29-07-2013, 22:18) |
raid 0 на ssd :crazy: |
Прикол в том, что диск меньше всего дрочится. в момент записи проц завален, а а хард еле подмигивает. хард ссд. Мне кажется запись через stream медленная. но чем и как заменить хз
Lexus
@ 30-07-2013, 17:46
QUOTE (FiL @ 30-07-2013, 16:14) |
a как файлт открывается? |
ofstream
QUOTE (Lexus @ 29-07-2013, 16:00) |
Есть-ли варианты писать в текстовый файл по быстрее? fputs, fprintf? |
Определённо это будет быстрее.
QUOTE (Lexus @ 30-07-2013, 02:04) |
QUOTE (Set @ 29-07-2013, 22:18) | raid 0 на ssd :crazy: | Прикол в том, что диск меньше всего дрочится. в момент записи проц завален, а а хард еле подмигивает. хард ссд. Мне кажется запись через stream медленная. но чем и как заменить хз |
Запись через потоки не медленная. Медленная побайтовая запись в файл. Таки stream << num в конечном итоге приводит к put, который медленный. Так что лучше-бы формировать блок в памяти и потом записывать его через stream::write.
P.S. А как файл открывается таки не важно :)
Lexus
@ 01-08-2013, 07:11
QUOTE (FiL @ 01-08-2013, 02:23) |
Запись через потоки не медленная. Медленная побайтовая запись в файл. Таки stream << num в конечном итоге приводит к put, который медленный. Так что лучше-бы формировать блок в памяти и потом записывать его через stream::write.
P.S. А как файл открывается таки не важно :) |
Почитал доку к пут, пут пишет всё дело блоками автоматом, по дефолту идёт буффер BUFMAX и потом flush на хард. Заменил stream<<num на fprintf - время записи сократилось в двое, но формотирование другое, надо поиграться будет.
А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать?
ну я-же сказал... через write. Выделяешь 50 мегов в памяти, суешь туда чего надо и потом write ему.
по поводу Put - да, оно в буфер, а потом flush. Теперь вопрос - а когда "потом" этот flush происходит?
Как заполнится так и flush :D:
QUOTE |
А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать? |
Таки можно :kroulik: setbuf() для fprintf и компании, для стримов что-то подобное тоже есть.
Lexus
@ 02-09-2013, 11:55
Чтоб вам не скучалось, я дальше потуплю ;)
Есть проект MFC C++ в VS2012, там из диалогов место для названия фирмы клиента. Задача, можно как-то автоматизировать процесс компайлинга, а именно:
нужно поменять имя клиента на нужное и скомпилить в диру с этим именем. Клеинтов порядка 20, поэтому делать это в ручную - мега жопа.
Lord KiRon
@ 04-09-2013, 16:23
Используй переменные среды
SET CLIENT=ВАСЯ_ПУПКИН
Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) .
То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде.
Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию.
Lexus
@ 11-09-2013, 09:30
QUOTE (Lord KiRon @ 04-09-2013, 15:23) |
Используй переменные среды SET CLIENT=ВАСЯ_ПУПКИН Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) . То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде. Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию. |
Гениально, всё работает ;)
Спасибо всем, кто помогал. испытательный срок пройден ;)))))
Michael2000
@ 08-11-2013, 17:08
Lexus
@ 08-01-2014, 15:13
Моя здесь и снова вопросы)))
Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Lord KiRon
@ 10-01-2014, 20:44
QUOTE (Lexus @ 08-01-2014, 14:13) |
Моя здесь и снова вопросы)))
Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить. |
Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом.
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут...
Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство.
https://support.microsoft.com/kb/196776
Lexus
@ 10-01-2014, 20:54
QUOTE (Lord KiRon @ 10-01-2014, 18:44) |
QUOTE (Lexus @ 08-01-2014, 14:13) | Моя здесь и снова вопросы)))
Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить. | Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом. Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут... Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство. https://support.microsoft.com/kb/196776 |
Таблицы не большие.
А если , например, у меня стоит на компе 2010 офис, народ юзает 2007, то будет ли работать?
Lord KiRon
@ 10-01-2014, 22:28
QUOTE (Lexus @ 10-01-2014, 19:54) |
QUOTE (Lord KiRon @ 10-01-2014, 18:44) | QUOTE (Lexus @ 08-01-2014, 14:13) | Моя здесь и снова вопросы)))
Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить. | Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом. Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут... Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство. https://support.microsoft.com/kb/196776 | Таблицы не большие. А если , например, у меня стоит на компе 2010 офис, народ юзает 2007, то будет ли работать? |
В принципе должно, хотя чтоб наверняка я бы 2007-м разрабатывал, тогда на всех последующих точно будет. Но если тебе Excel то офис с Экселом должен быть.