Forums -> Глюкодром -> страдания по c++
| Full Version

Lexus
У нас есть здесь спецы в 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
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.
Lexus
QUOTE (Lord KiRon @ 19-03-2013, 22:15)
1. (и главное) Нафига тебе MesssageBox причем в програме которая явно консольная - хрена он что выдаст. поменяй например на cout или printf или поменяй проект на Win32, но первый вариант проще.

2. В фолдере задать маску , типа "*.*" или "." а не только путь.
3. Не забудь проверку если не нашло ничего первый раз
4. Не забывай инициализировать переменные и обнулять структуры. К твоим проблемам это не имеет никакого отношения но это правильная практика.
завтра попробую. спасибо. я тут не раз ешё буду доставать ;))
Lexus
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 или другие подобные.

user posted image
Lord KiRon
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.
Set
Вспомнил, почему не перевариваю С++ :drag:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx
Lexus
QUOTE (Lord KiRon @ 20-03-2013, 17:57)
Хэндл инвалидный , значит или путь неверный или файлов не найдено. Хотя не понятно на каком этапе ты делал скриншот.

Да, и еще чтоб было проще дебагировать - выруби юникод в настройках прокта.
забил я на это и сделал через dirent :)

Но не расслабляйтесь, всё только наинается=
Lord KiRon
QUOTE (Set @ 21-03-2013, 09:34)
Вспомнил, почему не перевариваю С++ :drag:
Плохому танцору...
:diablo:
Lexus
Продолжимс :)

Прога, что я пишу занимается парсингом гиганских файлов. Обычно файлы с 1мио строк, а то и более. задача строку считать и разбить по запятой.

std::vector<std::string> results
while(getline(ss.str,separator)
{
results.push_back(str);
}

и этот грёбанный пушбек жрёт 90% моего времени. Я пробывал сначала толкать в лист, в нём судя по описанию пушбек добрее, а потом коппировать в вектор. Но что-то всё стало медленнее чем))))

Можно ли как-то это обойти?
Lord KiRon
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
Lexus
QUOTE (Lord KiRon @ 30-03-2013, 23:07)
Тебе повезло что ты это не на .Net делаешь.
А вообще при таком подходе жрется до хрена памяти, тут так прямо и не решить, надо в зависимости от ситуации и использования.
Например хранить в вкторе не стринги а позиции запятых.
Память меня меньше CPU напрягает)))))
Set
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
Lexus
QUOTE (Set @ 31-03-2013, 06:45)
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?
Lord KiRon
Если ты утверждаешь что память вообще не проблема , то открывай файл черз mapped view (чтоб он при доступе "выглядел" как бафер, а не файл) и сохраняй позиции запятых в файле в отдельный вектор.
Походу можно не пользоватся вектором а хранить в массиве используя doubling, то есть держишь массив созданный через new скажем на 1000 мест и переменную "индекс" последнего свободного места + переменную размера массива.
Если дошел до последнего (1000-го) то создаешь новый массив в два раза большр (то-есть 2000) и копируешь в него старый memcopy , а старый освобождаешь и так далее...
операции подстановки лонгов в массив почти мгновенные, копирование непрерывного блока памяти тоже операция достаточно быстрая и в принципе будет (при правильно выбранном начальном размере) достаточно редкой.
Если память вообще не ограничена :) можешь создать массив вообще один раз - размером с файл, тогда точно ничего и копировать не придется :)
FiL
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?

Ну и таки если уж так хочется засовывать весь файл в память (несколько странно в этом разрезе говорить о гигантских файлах), то ты-бы место в векторе выделял крупными кусками. А то для каждой строки вызывается реаллокация памяти, ибо вектор переполнился. Выделил место по 1000 строк - считал 1000. Потом снова выделил одним разом еще под 1000. И так далее. Ну, или если строк всегда более миллиона, то можно не по 1000, а по 100.000 за итерацию.
Set
QUOTE (Lexus @ 31-03-2013, 11:42)
QUOTE (Set @ 31-03-2013, 06:45)
Определи число строк в файле, сразу создай вектор нужного размера и пиши в него напрямую, как в массив: results[n] = ...
А возможно определить кол-во не читая всё файло?
Как написал FiL, увеличивай размер вектора на, скажем, миллион записей за раз. .resize() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций.
Lord KiRon
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() же под это дело есть... им и обрежешь излишки в конце. И не пользуйся собственными методами вектора, сделай две переменные, одну под текущую позицию, другую либо с его размером, либо с числом доступных для записи позиций.
С вектором стрингов не поможет, так как стринги неизвестной длины.
Тут вся проблема в том что зачем-то копируются данные из файла в памят, а зачем?
FiL
Ну и что, что неизвестной? Можно выделять не точно, но все равно, большими кусками. Ресурсы кушаются именно на перевыделение памяти.

А что читать всё в память не ясно зачем, так я с этого и начал. Но может оно реяльно нужно...
Set
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".

При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки.
Lexus
QUOTE (FiL @ 31-03-2013, 22:53)
я не понял. ты считываешь весь файл и засовываешь его в вектор. А нахрена? Считал строку, обработал и пошел дальше. Зачем ты хранишь все прочитанные строки?

там инфа хранится не в строках, а в столбцах. т.е. надо всё считать, отсортировать, сравнить и так далее. но всё столбцами ;(
FiL
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Lexus
QUOTE (FiL @ 02-04-2013, 16:42)
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Я наверное пример реальный приведу))) Шас приготовлю все данные ;) И запошу :)
Lord KiRon
QUOTE (Set @ 02-04-2013, 06:20)
Объект string имеет фиксированный размер, иначе с ним никих массивов не создать было бы. Текст внутри задаётся как char* и реально находится в "куче".

При записи строки в вектор происходит eё копирования и тут, конечно, тоже можно оптимизировать, скажем, сделав вектор ссылок на строки и явно записывая туда ссылки.
...А куча реально фрагментируется и при реальных реэлокациях из за этой фрагментации реально же тормозит.
FiL
QUOTE (Lexus @ 02-04-2013, 10:53)
QUOTE (FiL @ 02-04-2013, 16:42)
хранится столбцами, а в память суешь строками... Зачем? Потом отдельно будешь разбивать на столбцы и опять-же сувать в другую память?
Разбивай сразу при чтении, бери нужные тебе значения и суй в нужные массивы. Причем если там числа, то суй числами, а не строками. Все равно придется щто делать, так делай это во время чтения.
Я наверное пример реальный приведу))) Шас приготовлю все данные ;) И запошу :)
Давненько мы не брали в руки шашек :)
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк.
Гордый
QUOTE (FiL @ 03-04-2013, 06:15)
Я на самом деле вообще не уверен, что я после универа хоть одну программу написал больше 15 строк.
а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol:
Lexus
QUOTE (Гордый @ 03-04-2013, 08:43)

а тут что программу Hello World пишут? Я её могу на многих языках написать. :diablo: :lol:
тут карьера математика как програмиста на кону)))
Lord KiRon
Иди пиши на матлабе.
Это будет месть всем математикам, а то как подсунут "берешь вторую производную от функции контрастного фокуса", а потом неделю трахаешься как эту функцию построить и это самую производную на С++ взять.
Причем делов там на 2 минуты, но только когда обьяснят человеческим языком что имели в виду.
(И нечего мне тыкать что я математику заканчивал, кто ее там помнил после экзамена, кроме фамилий этих самых математеков, да и то с трудом)
Lexus
апдейт: беда поборота. Жопец был в том, что все тестировалась в дебаг-модусе. Стартуешь прогу в релизе - всё шуршит!
FiL
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт.
Lexus
QUOTE (FiL @ 10-04-2013, 15:10)
ох уж эти современные программисты с неограниченными ресурсами. А потом мы удивляемся, что комп тормозит и что винда разрослась до десятка гигабайт.
Да не, там всё очень компакто вышло))) Я же по пути не только дебаг на релиз поменял)))) Но я вас ешё не отпускаю))) Стрижка только началась)))
Lexus
вышел я на новый уровень камасутры и один уже не продвигаюсь.

ниже на пикчере обозначена задача:

Нужно сделать динамическую таблицу, т.е. будет во время работы проги пополняться.

первык столбец должен быть чекбоксовым, второй текстовым полем, чтом его можно было редактировать (1 и 2) можно объеденить. 3 столбец - кнопка, 4-й тоже кнопка, 5 редактируемое поле, 6 - тоже редактируемое поле, по даблклику диалог выбора файла) и справа от него чекбокс, последний просто лейбл для вывода текста.

П.с. весь секс делается в mfc c++.

user posted image



Ай нид хелп :)))
Lord KiRon
Делай на .Net, а то затрахаешся. Мы конечно и на C++ такое делали, но довольно много тупой работы. Если уж совсем нет выбора - используй MSFleхGrid OCX , а если надо чтоб на 64 бита бежало, то тут уже платное надо, например VSFlexGrid ( http://www.componentone.com/SuperProducts/StudioActiveX/ ) - можно купить один грид, за $500 примерно за лицензию разработчика, трайл бесплатный, и полнофункционал;ьный только диалогом о том что не зарегина достает при запуске.
Lexus
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
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 засунуть можно.
FiL
на html надо такое делать. :)
Lexus
QUOTE (FiL @ 08-05-2013, 04:29)
на html надо такое делать. :)
:punk:
VxWorks
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Lexus
QUOTE (VxWorks @ 08-05-2013, 12:13)
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Чур тебя)))) Даже не хочу думать о таком ;)))))) :fear2:
Гордый
QUOTE (VxWorks @ 08-05-2013, 12:13)
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol:
VxWorks
QUOTE (Гордый @ 08-05-2013, 11:35)
QUOTE (VxWorks @ 08-05-2013, 12:13)
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Травма на всю жизнь, теперь похоже на ассемблере всё пишет чел... Kроме Блога, там ещё есть слова человеческие! :lol:
Ты знал, ты знал! :D:

Lexus
Гордый сегодня в форме ;))))))
FiL
QUOTE (VxWorks @ 08-05-2013, 06:13)
Хех... помнится, в универе нас заставляли написать реляционную БД на ассемблере :laugh:
Ну, хорошо хоть не компилятор на SQL. :)
VxWorks
До этого не дошло :) Но на dBase IV нас тоже заставляли что-то делать.
Вот только у меня на все эти БД башка не варила и не варит. :(
Написать какую-нибудь хрень типа системы управления светом в машине, без операционки и тому подобных заморочек - раз плюнуть. А вот БД или там вебсайт - это сложно.
Lexus
Расслабились? ))) Я снова тут)

Есть MFC CFormView, из него по нажатию кнопки из списка с объектами Optimization запускается:
Optimization.validate()

Нужно, чтоб по нажатию на кнопку открывaлось окно Dialog (class RunLog) и в него писалось в list_runlog (textbox) сообшения с функции Optimization.validate(). Как я понял делается это через Callback function. Но пока я не понял как это сделать и где и как дефинировать функции и в каких классах и как....короче нужно как для дебила пояснить))) Спасибо)
Lexus
Кажется тут надо идти другим путём. Запускать validate во втором треде и через postmessage слать обновления в RunLog

как где почём? Хеелп)))
FiL
У тебя страдания не по С++, а по каким-то только тебе понятно каким библиотекам в какой-то конкретной среде. Так ты-бы описал что и где. Хотя мне оно уже не поможет.
Гордый
QUOTE (FiL @ 22-05-2013, 20:10)
Хотя мне оно уже не поможет.
интересно, а что может помочь FiLу!? :w00t:
Set
Спирт... и много. :laugh:
Lord KiRon
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально.
Lexus
QUOTE (Lord KiRon @ 23-05-2013, 15:41)
Ты в начале реши - тебе твой диалог нужен модальным или нет, если модальным, то не страдай херней оно и так работать будет. Есали немодальный то открываешь диалог , а работу делаешь в треде и туда пишешь, только обновлять надо через меседжи, а не напрямую, а то падать будет рандомально.
Я сейчас открываю так

RunLog RunLogDlg;
RunLogDlg.DoModal();

а можно для дебила на пальцах как с треда писать туда?
Lord KiRon
DoModal Создает модальный диалог, который пока не закроешь ничего не работает в "родительском окне", тебе надо сделать Create, тогда будет не модальный, это раз.
Насчет писать.
Лучше всего в него не писать, а сделать так чтоб он сам читал из какого-то списка например, при получении определенного месаджа WM_USER + xxxx , который посылается ему с твоего потока, а твой поток в этот лист добавляет.
Главное не забудь синхронизировать этот список, например critical section, то есть локай его когда твой поток добавляет и когда диалог считывает.
Это простейший к имплементации вариант.
Lexus
Так. С GUI уже всё отлажено и робит ;)

Теперь встал вопрос эфективности. Выяснилось, что файло пишется очень медленно. Всё время использовал output<<matrix[i][j]<<"\n"; это тормозит всё дико. Есть-ли варианты писать в текстовый файл по быстрее?
fputs, fprintf?
Set
raid 0 на ssd :crazy:
Lexus
QUOTE (Set @ 29-07-2013, 22:18)
raid 0 на ssd :crazy:
Прикол в том, что диск меньше всего дрочится. в момент записи проц завален, а а хард еле подмигивает. хард ссд. Мне кажется запись через stream медленная. но чем и как заменить хз
FiL
a как файлт открывается?
Lexus
QUOTE (FiL @ 30-07-2013, 16:14)
a как файлт открывается?
ofstream
Set
QUOTE (Lexus @ 29-07-2013, 16:00)
Есть-ли варианты писать в текстовый файл по быстрее?
fputs, fprintf?
Определённо это будет быстрее.
FiL
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
QUOTE (FiL @ 01-08-2013, 02:23)
Запись через потоки не медленная. Медленная побайтовая запись в файл. Таки stream << num в конечном итоге приводит к put, который медленный. Так что лучше-бы формировать блок в памяти и потом записывать его через stream::write.

P.S. А как файл открывается таки не важно :)
Почитал доку к пут, пут пишет всё дело блоками автоматом, по дефолту идёт буффер BUFMAX и потом flush на хард. Заменил stream<<num на fprintf - время записи сократилось в двое, но формотирование другое, надо поиграться будет.

А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать?
FiL
ну я-же сказал... через write. Выделяешь 50 мегов в памяти, суешь туда чего надо и потом write ему.
по поводу Put - да, оно в буфер, а потом flush. Теперь вопрос - а когда "потом" этот flush происходит?
Set
Как заполнится так и flush :D:

QUOTE
А нельза кк-то в память загнать блок, скажем так 50мб, и потом его за раз записать?
Таки можно :kroulik: setbuf() для fprintf и компании, для стримов что-то подобное тоже есть.
Lexus
Чтоб вам не скучалось, я дальше потуплю ;)

Есть проект MFC C++ в VS2012, там из диалогов место для названия фирмы клиента. Задача, можно как-то автоматизировать процесс компайлинга, а именно:
нужно поменять имя клиента на нужное и скомпилить в диру с этим именем. Клеинтов порядка 20, поэтому делать это в ручную - мега жопа.
Lord KiRon
Используй переменные среды
SET CLIENT=ВАСЯ_ПУПКИН
Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) .
То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде.
Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию.
Lexus
QUOTE (Lord KiRon @ 04-09-2013, 15:23)
Используй переменные среды
SET CLIENT=ВАСЯ_ПУПКИН
Ну а потом в настройках компиляции проекта настраивай Output Directory на $(CLIENT) .
То же самое в тех же настройках precompiler definitions CLIENT_NAME=$(CLIENT) ну и использиуй CLIENT_NAME в коде.
Чтобы не повторятся делаешь несколько .bat файлов с SET CLIENT=... для каждого клиента , которые и запускают компиляцию.
Гениально, всё работает ;)

Спасибо всем, кто помогал. испытательный срок пройден ;)))))
Michael2000
http://habrahabr.ru/post/187770/

коменты жесть :drag:
Lexus
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Lord KiRon
QUOTE (Lexus @ 08-01-2014, 14:13)
Моя здесь и снова вопросы)))

Нужно с c++ создать экселевскую таблицу с графиками. Есть ли какие-то бесплатные калссы или аддоны? Находил многие, но в них не было возможности графики строить.
Есть, если офис стоит то через COM без проблем. Готовые компоиненты устанавливаются вместе с любым офисом.
Правда есть специфика - если заполнять большую таблицу по одной клетке то тормоза будут...
Короче по минимуму - легко, а если вникать в детали , то как и везде - целое искуство.
https://support.microsoft.com/kb/196776
Lexus
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
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 то офис с Экселом должен быть.