A.I.M.(http://forum.ja2.su/cgi-bin/yabb/YaBB.pl)
Генерал >> Ъ и Ь >> С++ Вопросы и ответы.
(Message started by: Luficer на 25.01.2006 в 17:55:35)

Заголовок: С++ Вопросы и ответы.
Прислано пользователем Luficer на 25.01.2006 в 17:55:35
Господа, опять я и опять с просьбой. :-[
Дело в том, что здесь, в Питере, на 1-м курсе Политеха учится мой сводный братец.

Пока еще учится.

Сессию зимнюю почти завалил и, с близжайших выходных начиная, я переезжаю к нему "вытаскивать". Экзаменов всего 3,- физика с математикой и С++ (программист - специальность). И если с первым и вторым предметом я знаком неплохо, то из программирования помню местами ЛОГо, неплохо Бейсик и довольно прилично Паскаль. Похоже, теперь придется еще и СИ поучить.

Подскажите, плз, литературу (сайты, справочники на дисках) с обучалкой С++. Уровень примерно такой (привожу задачку к экзамену):
"Дан массив А, сторона <= 13 элементов. Вычислить количество нулевых, сформировать из оставшихся новый массив с количеством элементов А/2."
Ну или что-то в этом духе. Т.е. как я понимаю, нужны общие понятия о функциях, массивах, поиск.
Что-то вроде функций for, goto, array и т.п.

Заранее спасибо.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем gyv на 25.01.2006 в 20:30:11
2Luficer: справочник не посоветую (C изучал раньше паскаля, но использую реже)  - читал оффлайновые и очень давно.
Если с программированием знаком, то достаточно справочника по синтаксису (приведённый пример делается за пару минут хоть на пас, хоть на Ц, хоть на пхп, перл и пр.)
если не знает основ (что есть массив и нафига оно такое надо), то тут сложнее - требуется изучить основы (можно на любом языке, но если будет Ц - лучше, так сказать приятное с полезным).
Вот исходя из базовых знаний и стоит искать книжки (я всё больше последнее время читаю msdn и ebooks о-рейлевские по геймдеву - тут ещё могу что-то высказать)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 26.01.2006 в 09:01:52
2Luficer:
"Изучить" С++ за несколько дней у тебя не получится ну никак. С++  - один из самых навороченных языков современности. Недаром существует фейковое интервью Страуструпа, в котором он рассказывает, что придумалл С++ исключительно для того, чтобы у программеров "была работа".
Если же тебе нужно просто ознакомиться с синтаксисом - в книжном покупаешь абслютно любую книгу типа "Самоучитель С++" или "С++ для чайников" и пока едешь в меторо - быстро пролистать. В первую очередь читаешь разделы посвященные области видимости переменных и понятю класса. Все общие конструкции типа циклов, if-ов, массивов и т.п. в С++ мало отличаются от других языков.
Из онлайн ресурсов самый мощный на Русском - www.rsdn.ru Там бывают очень серьезно разбирающиеся в С++ люди (себя не считаю :) ), но с другой стороны и ответы в стиле "пошел ты на RTFM" получаешь чаще. Там же есть и довольно большая база статей, которые можно почитать.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Psyho на 26.01.2006 в 09:26:30
2Luficer: Для задач такого класса вполне подойдет любая книжка. Для быстрого изучения Си++ (без знания Си) из встречающихся наиболее хороша книга Александреску. Названия не помню. Книжка красного цвета. Позиционируется как книга для преподователей Си++. Книга именно по Си++ и stl библиотекам.
Струструп слишком навороченный. Его на начальном этапе не почитаеш.

PS: Че-то я ее в инете найти не могу. :-(  Зато нашел много других вещей, что читал.
http://books.dore.ru/bs/f6sid19.html

"Эффективное использование STL. Библиотека программиста" Очень интересная книга по стандартной библиотеке.

"Основы программирования на С++. Том 1" То-же кто-то увел для изучения.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 26.01.2006 в 09:48:36
2Luficer:
В дополнение, все-таки руководство Страуструпа и небольшой туториал по С++ Builder, для начала на нем, наверное, тебе будет проще.
Не умаляя важности STL, не думаю, что для задачи, что ты привел в начале нужно им загружаться.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 26.01.2006 в 09:49:02
Страуструп

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 26.01.2006 в 09:49:17
Страуструп

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Psyho на 26.01.2006 в 09:59:01
Нашел. Как всегда поперепутал авторов и издательства.

Эффективное программирование на C++. Серия C++ In-Depth, т. 2
Эндрю Кёниг, Барбара Э. Му

http://www.williamspublishing.com/Books/5-8459-0350-5.html

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Luficer на 26.01.2006 в 10:27:18
2gyv: 2Force_Majeure: 2Psyho:
Спасибо, буду читать, много думать.

2Force_Majeure:
Quote:
Изучить" С++ за несколько дней у тебя не получится ну никак.

Про изучение AutoCad за выходные мне тоже так говорили, однако смог. Правда, у меня до того Компас стоял, т.ч. не с пустого места получилось.
Здесь примерно то же, надеюсь. Зацепит - полезу дальше в
Quote:
Струструп
. Пока же, думаю, можно будет обойтись просто хорошим справочником.

О результатах сообщу.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем gyv на 26.01.2006 в 10:42:19
2Psyho: Спасибо за ссылки - кое-что интересненькое нашёл (печатные хорошо - можно не только за компом читать). Но как разнятся цены - это же ужас. На некоторые книжки в 2+ раза в зависимости от инет-магазина.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Psyho на 26.01.2006 в 15:43:19
2gyv: В электронке тоже кое-что есть. Если надо могу списочек прислать.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем gyv на 26.01.2006 в 16:54:08
2Psyho: В электронке и у самого есть. в основном - на враждебном языке (в оригинале).

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Zar XaplYch на 23.10.2006 в 15:31:37
Народ, нужна прога редактор-компилятор на С++, главное чтоб бесплатно и не геморно было, для новичков. У меня самого есть конечно и Visual C++ и C++ Builder, но нужно именно бесплатную. Или хотя бы научите, как в вышеназванных прогах скомпилировать GCC, а то такие сложные проекты я еще не пытал.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Psyho на 23.10.2006 в 17:02:30
Набираем в google Компилятор C++
и получаем кучу ссылок.  ;)

Например: http://www.gamedev.ru/faq/?id=17

Quote:
Какие бесплатные C++ компиляторы и IDE к ним существуют.

Компиляторы:

1) gcc. Под windows лучше всего использовать mingw (www.mingw.org), это порт gcc на Windows платформу.

2) Visual C++ 2005 Express Edition. http://msdn.microsoft.com/express/
   Тут http://www.rsdn.ru/Forum/Message.aspx?mid=1477837#1477837 прямые ссылки на скачивание.

3) Digital Mars C/C++ Compilers. Довольно неплохой компилятор, но хуже соответствует стандарту чем последние gcc
 или VC7.1. Лежит здесь http://www.digitalmars.com/

4) Borland free compiler. Содержит компилятор и утилиты командной строки, искать здесь:
 http://www.borland.com/devsupport/bcppbuilder/downloads/

5) Open Watcom C/C++. http://www.openwatcom.org/

6) LCC-Win32. http://www.cs.virginia.edu/~lcc-win32/ (Только Си компилятор, C++ не поддерживает)

7) Microsoft Visual C++ Toolkit 2003. полноценный оптимизирующий компилятор VC7.1 без IDE и nmake.
 В настоящее время заменен на Visual C++ 2005 Express Edition и с сайта Microsoft недоступен, пользуйтесь поиском.
 Может быть более предпочтителен из-за малого веса(~30 MiB).


IDE:

1) Dev-C++. достаточно неплохое IDE для gcc(mingw) http://www.bloodshed.net/devcpp.html.

2) MinGW Developer Studio. http://www.parinyasoft.com/ - IDE предназначено специально для его использования совместно с MinGW. Очень удобно тем, кто разрабатывает программу под indows и Linux одновременно, т.к. формат проектов один и остаётся только жмакнуть на кнопку компиляции и не мучиться с настройкой разных сред.

3) Code::Blocks IDE. http://www.codeblocks.org. Это наверно одно из лучших (хоть и самое молодое) IDE для
 бесплатных компиляторов, подерживает не только mingw но и Microsoft Visual C++ Toolkit 2003,
 Digital Mars C/C++ Compilers, Borland free compiler, Open Watcom C/C++ и Small Device C Compiler

4) Eclipse/CDT - написанные на Java, платформа для разработки IDE + плагин превращающий платформу в приспособленную для C++ среду.  http://www.eclipse.org/cdt

5) Visual C++ 2005 Express Edition. На данный момент похоже лучшее среди бесплатных IDE для Windows.

6) Emacs/Vim. Не для слабых духом, долгое время обучения. Преимущества - кроссплатформенность и не снившаяся другим инструментам мощь и гибкость.
   Vim: http://www.vim.org
   Emacs: http://ftp.gnu.org/pub/gnu/emacs/windows/ - официальный ftp
       http://ourcomments.org/Emacs/EmacsW32.html - хороший дистрибутив для Windows

7) eVC 3/4 Бесплатные IDE от Microsoft под платформу WinCE. www.microsoft.com

8) Visual-MinGW. Распространяется под GNU лицензией. IDE оболочка очень схожа с Microsoft Visual C++ 6 http://visual-mingw.sourceforge.net/

Использующим несколько компиляторов сразу рекомендуется также посмотреть на Scons(http://www.scons.org/) и Boost.Build(http://boost.sourceforge.net/boost-build2/) - удобные системы для сборки проектов.

Внимание: Права на эту статью принадлежат авторам, указанным в Истории. При цитировании ссылка на эту страницу обязательна.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 16.02.2007 в 21:30:34
Простой, я думаю, вопрос, но мучаюсь с ним уже год. С интервалом в месяц-два:)
В общем у меня есть класс Player и три переменных iStrength, iWidsom и iCharisma.
С помощью функции GetPlayerStat(player pPlayer, string sStat) нужно получить значение одной из переменных с именем sStat.
Т.е...
class Player //Собственно сам класс
{
public:
//Конструкторы
Player();
~Player();

//Основные статы
protected:
int iStrength;
int iWisdom;
int iCharisma;
};
/*Функция, которая должна брать значение переменной с именем из sStat у игрока pPlayer.*/
int Player::GetPlayerStat(player pPlayer, string sStat)
{
Как взять значение из стринга и поставить его вместо имени переменной?
}

Десяток форумов уже прекопал - без толку.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Psyho на 18.02.2007 в 02:36:31
GetPlayerStat(player pPlayer, string sStat) - это полная чуш.
Должно быть или GetPlayerStat(player pPlayer, string *sStat) или
GetPlayerStat(player pPlayer, string &sStat)
То что ты привел не может возвращать значение string. Или у тебя в классе не правильное определение метода или ты ошибся в цитировании. Приведи объявление класса полностью, так как там у тебя иогут быть еще проблемы с защищенными типами.
PS: Сходи сюды www.rsdn.ru Там довольно хороший форум по Си. И еще почитай про ссылочный тип Си++ и указатели в Си/Си++.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 18.02.2007 в 07:28:28
2Clayman:
Функция у тебя как-то странно написана, а мож я чего не понимаю :) Если она принадлежит классу Player, что за первый параметр pPlayer? Просто не очень понятно, что ты хочешь получать от нее?

Если же вопрос заключается в том, как обратиться к переменной по ее имени, который регулярно всплывает у всех :)
То ответ - никак, С++ язык компилируемый. Единственный вариант - через
case string == "aaa"
  return a;
case string == "bbb"
  return b;
.......

<upd>
Кстати, Psiho правильно пишет, строки как параметры передавать не стоит, зачем память в пустую гонять, в функциях обычно передают указатель не первый символ и кол-во символов в строке.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 18.02.2007 в 12:52:20

Quote:
/*Функция, которая должна брать значение переменной с именем из sStat у игрока pPlayer.*/
int Player::GetPlayerStat(player pPlayer, string sStat)
{
Как взять значение из стринга и поставить его вместо имени переменной?
}

Если я правильно тебя понял то ты хочеш делать такую вещь
GetPlayerStat( /*Как сказал Force_Majeure эта переменная тебе абсолютно не нужна*/, "Wisdom");
А возвращатся как int должно значение iWisdom.
Методов решения даной проблемы на скорую руку могу предложыть два:
 1) для каждой переменной создавать свой метод:
     int GetWisdom const { return iWsidom; }
     int GetStrength const { return iStrength; }
 2) или написать перечисление и в метод взятия значения передавать элемент перечисления. Тогда клас будет выглядеть так:
class Player //Собственно сам класс
{
public:
  enum Stats
 {
    enStrength = 0,
    enWisdom,
    enCharisma,
    enMaxStats
 };
//Конструкторы
Player();
~Player();
 int GetPlayerStat( Stat sStat ) const;
//Основные статы
protected:
int iStrength;
int iWisdom;
int iCharisma;
};
/*Функция, которая должна брать значение переменной с именем из sStat у игрока pPlayer.*/
int Player::GetPlayerStat(Stats sStat) const
{
  switch( sStat )
 {
    case enStrength:
       return iStrength;
    case enWisdom:
       return iWisdom;
    case enCharisma:
       return iCharisma;
 }
 return -1;
}

Но если у тебя все статы одного типа то сделай из них масив int m_anStats[enMaxStats];
и потом метод будет выглядеть многим проще:
int Player::GetPlayerStat(Stats sStat) const
{
 S_ASSERT( sStat < enMaxStats) //или банальное if ( sStat < 0 || sStat > enMaxStats) return -1;
 return m_anStats[ sStat ];
}

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 19.02.2007 в 13:17:35
Всем спасибо. Обошелся массивом, лишние параметры из функций убрал. и поять испытываю очень гадкое чувство, когда код работает без проблем, но почему- не ясно:)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 19.02.2007 в 13:43:14
2Clayman: А ты спрашывай - мож кто знает  ;)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 19.02.2007 в 20:37:29
Еще пара вопросов.

Quote:
Кстати, Psiho правильно пишет, строки как параметры передавать не стоит, зачем память в пустую гонять, в функциях обычно передают указатель не первый символ и кол-во символов в строке.

Т.е. если без поинтеров, то берется часть памяти с переменной, передается в функцию и затем возвращается обратно? А с поинтерами все происходит на том же участке?

Quote:
 
int GetWisdom const { return iWsidom; }
int GetStrength const { return iStrength; }

А зачем const?

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 20.02.2007 в 07:57:54
2Clayman:
При передаче переменных в функцию в ее области видимости создаются копии этих переменных с которыми и идет работа внутри функции. Соответственно если ты передаешь целую строку текста, в памяти будет выделен нужный объем и в него  скопирована строка. Если же ты передаешь только указатель, будут выделены всего 4 байта и в них скопирован указатель на то же место в памяти, где уже хранится твоя текстовая строка. В результате, из области видимости функции ты доступ к строке имеешь, а лишнюю память не занимаешь.

Почему jarni предлагает делать константные методы для возврата всего одного значения - мне не понятно. Константные функции обычно используются там, где нужно запретить меня данные внутри функции, да и то редко, обычно для этого используют передачу константных параметров в функции. Хотя мож я чего не знаю здесь :).

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 20.02.2007 в 09:54:23
2Clayman: 2Force_Majeure: Это как бы правило хорошего тона в программировании. Все что не меняет объект или его части должно быть константным. В таком простом примере здесь пользы от это и вправду невидно, но приучившысь следить за тем какие методи пишеш и что там делаешь, получаешь большую выгоду в меньшем количестве ошыбок.

2Force_Majeure: Для функцый константных параметров хватает, но для методов класа совсем нет, поскольку сама по себе передача параметров уже означает что в методе будет что-то менятся. Если нет, то метод делать константным  ;).

Использование конст "обязательно" в случае указателей и референцый вплоть до таких "зверских" константных методов как const char * GetName() const { return acName; }. Такое написание избавляет програмиста от головной боли при поиске  простых ошибок вробе if ( a.GetName() = "Player" ) ... где вместо "=" должно было быть "==". Ну и т.д и т.п.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 20.02.2007 в 09:59:22
2Clayman:  
Quote:
то берется часть памяти с переменной, передается в функцию и затем возвращается обратно?
Дело в том что обратно не возвращается. Как сказал Force_Majeure ты будеш работать с локальной копией, а значит все изменения которые были в нее внесены так и умрут вместе с этой копией после окончания работы метода. А то что ты передавал туда так и останется в неизмененном виде. Вообще сила С++ как раз в указателях и прямой работе с участками памяти. Для всего что имеет размер больше 4 байтов желательно использовать указатели или референсы.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 20.02.2007 в 14:06:04
2jarni:
Это уже вопрос стилей программирования :) Я лично придерживаюсь мнения, что любые спецификаторы нужно ставить только тогда, кога четко знаешь, для чего они нужны именно здесь. Писать что-то только потому, что "так принято" мне не кажется правильным. Хотя это личное дело каждого программиста :)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 20.02.2007 в 14:09:33
2Force_Majeure: С твоим мнением польностью согласен и свою точку зрения (свой стиль) никому не навязываю. Хорошо что спецыфикаторы есть но ими не пользуються, чем если бы их не было а нужда в них была  :).

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 16.03.2007 в 21:24:24
Еще одни вопрос:
есть следующая иерархия  классов

class PositionedObject
{
//конструкторы эт цетера
}

class PositionedSprite:public PositionedObject
{
//еще пяток функций
}

class PositionedButton:public PositionedSprite
{
//конструкторы и самое главное...
void SetState(int iState);
}

void PositionedButton::SetState(iState){}

void main()//не совсем main, на самом деле, там специальный цикл.Но это не важно
{
PositionedObject psObject=new PositionedButton(/*аргументы*/[i]);
psObject->SetState(1);[i]}//не пашет ибо


[offtop][C++ Error] Unit1.cpp(66): E2316 'SetState' is not a member of 'PositionedObject'[/offtop]

Если в материнском (первом) классе объявить virtual void SetState, то код функции ищется в PositionedSprite(второй класс), а не в PositionedButton. Если заявить SetState как виртуальную еще и в PositioneSprite, то получается вообще черти что. Есть какие-нибудь мысли?

ЗЫ Если кратко: как получить доступ к функции из дочернего класса?

Всем спасибо:)

}

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 17.03.2007 в 06:25:10
Если ты в мейне хочешь вызывать функцию именно дочернего класса без оглядки на предков, зачем ты объект объявляешь как PositionedObject ? Объявляй его как PositionedButton:

main (
PositionedButton psObject=new PositionedButton(void);
psObject->SetState(1);
}

Если же тебе нужен вызов SetState именно как виртуальной функции, объявляй ее в родительском класе PositionedObject как виртуальную (реализацию делать не нужно). Виртуальной она останется для всех потомков любого уровня.
Тогда у тебя получится примерно так:
class PositionedObject
{
virtual viod SetState(int iState);
}
class PositionedButton:public .......
{
}
void PositionedButton::SetState(int iState){}

тогда в мейне ты можешь вызывать ее как раз из объекта, определенного как PositionedObject  и будет вызываться именно функция с реализацией в классе PositionedButton

main (
PositionedObject psObject=new PositionedButton(void);
psObject->SetState(1);
}

Если же при таком наследовании функция SetState переопредлелялась несколько раз, например у нее есть своя реализация в классах PositionedObject, PositionedSprite, PositionedButton и тебе точно нужно указать, функцию какого класса ты хочешь вызывать - указывай этот класс специально при вызове:

main (
PositionedObject psObject=new PositionedButton(void);
psObject->PositionedSprite::SetState(1);
}

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 17.03.2007 в 17:31:24
2Force_Majeure:
Спасибо:) Правда, я вчера решил переписать этот кусок. Но все равно +1:)

Бай зе вэй, есть ли способ сконвертировать стандартный C++`шный string в char array? Я для проекта использую сторонний движок, в который очень глубоко вделана работа с массивами, а стринги не поддерживаются вовсе. А мне как раз гораздо удобнее было бы передавать аргументы в виде стрингов. Трогать чужой код страшно:)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 17.03.2007 в 21:42:32
2Clayman: Э, нету у С++ стандартного типа string. Если ты имеешь ввиду CString класс, то чтобы из него что-то достать нужно будет или воспользоваться встроенными методами для возвращения указателя на сохраненные даные или целой копии данных (целую строку), или же воспользовавшысь функцыей вроде _tcscpy_s. И не забывай что строки нужно передавать через указатель (или через указатель на CString) иначе будеш гонять кучу памяти туда-обратно.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 17.03.2007 в 21:56:21
2jarni:

Quote:
Э, нету у С++ стандартного типа string

Вот (http://cppreference.com/cppstring/index.html) здесь утверждают, что есть. Ну или не у совсем стандартного, а у std::string, в общем у того класса, что Borland Builder подключается через #include<string>:)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 17.03.2007 в 22:17:04
Ну, это класс, а не стандартный тип. Но, это уже придирки с моей стороны.  ;) В любом случае у него есть методы возврата обычных массивов символов, метод data(). Вот только он возвращает константный указатель так что менять данные скорей всего что не получится (если это надо).

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Satan`s Claws на 17.03.2007 в 23:11:34
*уже три года пишуший исключительно в ссылках, и с ужасом вспоминающий, что можно еще и по значению параметры передавать  :o

::)

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 18.03.2007 в 06:57:29
2Clayman:
Если ты пользуешься билдером, там есть встроенный класс строк AnsiString. По функциям тоже самое, что СТЛ-вский std::string который ты используешь, но для билдера - удобнее.
Сконвертировать один тип в другой нельзя, можно только скопировать строку из типа "с 0 на конце" в массив символов. Однако обычно ничего конвертировать и не нужно т.к. у обоих этих классов есть оператор возврата указателя на первый символ строки, что обычно и используется при вызовах процедур: .c_str()

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Clayman на 18.03.2007 в 11:59:41

Quote:
т.к. у обоих этих классов есть оператор возврата указателя на первый символ строки, что обычно и используется при вызовах процедур: .c_str()

А что потом с этим первым символом делать?

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Force_Majeure на 18.03.2007 в 15:11:20
Передавать в процедуру :)
Например если есть вызов такой процедуры
viod Proc(char* aaa);
а у тебя есть тип std::string
std::string bbb = "xxx";
то в процедуру его передаешь как:
Proc(bbb.c_str());

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Ushwood на 28.09.2008 в 13:21:08
Чайницкий вопрос по С++ (конкретно по Visual Studio 6.0, но, полагаю, это не имеет значения).

Оно вычисляет логическое выражение до конца или пока не станет ясно его значение? К примеру, в выражении типа
if((i==i+1)&&(i++)) блаблабла;
будет ли i приращиваться на единицу?

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 28.09.2008 в 13:25:37
2Ushwood: Нет, если первое выражение FALSE. Второе уже не вычисляется в таком случае.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Ushwood на 28.09.2008 в 13:39:15
2jarni: мерси :)

ЗЫ. Предложение к модераторам: не переименовать ли тему? Сдается мне, если то, что в скобочках, из названия убрать, то оно будет гораздо лучше отражать суть ;).

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Strax5 на 10.11.2008 в 18:48:33
2Ushwood: Много таких тем на форуме, которые бестолково начатые вместо того, чтобы уйти во флуд, мутировали в нечто полезное.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Ushwood на 07.01.2009 в 13:24:26
Если приходится в одном и том же участке программы постоянно работать с переменной типа struct, конкретно с ее полями - есть ли способ избавиться от необходимости писать полное имя переменной, а ограничиваться только именем поля? Аналогично оператору with в Паскале?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 07.01.2009 в 13:30:55
2Ushwood: Такого способа нету. Можеш создать референс на поле и уже работать с ним.


Code:
struct SMyStruct
{
  int                 m_nA;
  CSomeClass m_SomeClass;
}

...
SMyStruct sStruct;

int                & rA                 = sStruct.m_nA;
CSomeClass & rSomeClass = sStruct.m_SomeClass;

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Legend на 07.01.2009 в 13:39:31
Ничего, если я не совсем в тему вопрос задам?

Подскажите книжку для самостоятельного обучения Явы (и линукса тоже) под vi и Eclipse. Желательно на русском. И ссылочку тоже было бы неплохо.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Ushwood на 07.01.2009 в 23:36:46
2jarni: Угу, я так и подозревал. Жалко :(.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 08.01.2009 в 09:09:27
2Ushwood: Чесно говоря никогда за свою практику не имел откровенной необходимости в такой фиче. Если какое-то поле используется слишком часто, то всегда хватает приведенного мной метода, причём имя референса можно сделать покороче чем например было имя поля, так даже удобней.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем Ushwood на 08.01.2009 в 16:02:42
2jarni: Я в ситуации, когда не одно, а сразу несколько полей одной переменной в одном месте используются часто... и приведенный тобой метод будет еще более громоздким, чем прямое использование переменной :(.

Заголовок: Re: С++    /надо срочно изучить/
Прислано пользователем jarni на 08.01.2009 в 16:10:53
2Ushwood: Ну всё наверное зависит от имени переменной и её полей.

SSomeStruct m_aVeryLongNameAsForStructure;

...
aVeryLongNameAsForStructure.m_aMuchLongerVariableNameThanNeeded + (aVeryLongNameAsForStructure.m_aMuchLongerVariableNameThanNeeded2_1 / 2) -
...

Запись же:
int & r1 = aVeryLongNameAsForStructure.m_aMuchLongerVariableNameThanNeeded;
int & r2 = aVeryLongNameAsForStructure.m_aMuchLongerVariableNameThanNeeded2_1;

и дальнейшее использование во всех местах только r1 и r2 заметно сократит и упростит выражение. Причём имя можно же сделать любое (главное чтобы понятно было).

Заголовок: Re: С++
Прислано пользователем Ushwood на 08.01.2009 в 19:56:03
2jarni: угу, спасибо :).
Только у меня имена все же покороче, чем в твоем примере, а вот полей много... причем есть поля типа массив... короче, твой метод вряд ли сократит размер кода :)
Ну да все равно - буду иметь в виду на будущее, глядишь, и пригодится...

Заголовок: Re: С++
Прислано пользователем jarni на 24.07.2009 в 02:56:04
Спрошу здесь.
Кто нибудь писал на ассемблере под линукс, в GCC inline assembler? У него синтаксис другой чем у Интела, мне нужно маленький кусочек перевести.

Заголовок: Re: С++
Прислано пользователем Force_Majeure на 29.07.2009 в 23:56:03
Кто пользуется VC2005 или 2008, подскажите какой-нибудь приличный инструмент для отлова утечек памяти. Попробовал Deleaker, но или я не разобрался как его использовать, или он не ловит даже очевидные утечки (пробовал new без delete - не находит такое).

Заголовок: Re: С++
Прислано пользователем jarni на 30.07.2009 в 00:56:52
2Force_Majeure: VLD, который Visual Leak Detector. Использую уже давно и это пока что лучшее что нашёл, очень эффективная штука. Последняя версия поставляется в виде ДЛЛки, у меня не работает, узаю более старую в виде либы. Абсолютно бесплатно.

Заголовок: Re: С++
Прислано пользователем Force_Majeure на 30.07.2009 в 02:31:39
2jarni:
Спасибо! Вроде то что надо (очевидное, во всяком случае, ловит :) ). 1.0 версия юзабельна или есть позднее?

Заголовок: Re: С++
Прислано пользователем jarni на 30.07.2009 в 02:44:53
2Force_Majeure: Последняя вроде 1.9d. Я юзаю 1,0, хотя в хэдэре указано это: Id: vld.h,v 1.15.2.1 2005/08/03 23:13:47 dmouldin. Знаю точно что 1,9д у меня не работала, студия ругалась на то что не может загрузить дллку.

Заголовок: Re: С++
Прислано пользователем Force_Majeure на 30.07.2009 в 19:25:19
2jarni:
Сенкс, значит будем юзать 1.0 :)

Заголовок: Re: С++
Прислано пользователем Artem13 на 31.07.2009 в 05:37:40
Господа, кто с гцц работал? А еще лучше с MinGW. Как там статически библиотеки в екзешник влинковать? А то я тут попробовал освоить Qt и нарвался на необходимость поставлять вместе с приложением и библиотеки, чего не хотелось бы.

Заголовок: Re: С++
Прислано пользователем jarni на 31.07.2009 в 08:30:34
2Artem13: С гцц сейчас работаю. Статические это которые .а? Если да то там есть переключатель -Lпапка, или -lконкретная библиотека. Для уточнения прочитай о них.

Заголовок: Re: С++
Прислано пользователем Artem13 на 01.08.2009 в 03:00:42
хиъ2хсщдщк=Кувъофктшх.сщдщкъЖх.иъ Ябы еще был оченно благодарен за линк на русскоязычный ресурс по гцц...

Заголовок: Re: С++
Прислано пользователем jarni на 01.08.2009 в 03:06:32
2Artem13:

Quote:
хиъ2хсщдщк=Кувъофктшх.сщдщкъЖх.иъ

Интересно у тебя получилось :).
Неподскажу потому что не знаю, пользую в первую очередь английские мануалы :). Ещё такой вопрос, тебе гцц под винду нужен? Я им по линухом пользуюсь. Хотя синтаксис командной строки не должен отличатся никак, просто вместо *.а файлов нужно ставить *.либ.

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем Korchy на 10.02.2011 в 00:11:13
unsigned short year,month,day;
TDateTime dt = 0;
dt.DecodeDate(&year,&month,&day);
MessageBox(NULL,(IntToStr(day)+"."+IntToStr(month)+"."+IntToStr(year)).c_str(),"",NULL);

30.12.1899

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем jarni на 10.02.2011 в 00:39:23
2Korchy: Что такое TDateTime? Я не знаю что для него означает 0, у каждого своя имплементация. Может я неточно выразился - не виделя я других точек отсчёта времени для системы кроме 1601 и 1970 годов. Конечно что такие точки я видел в других программах (из того что сходу вспомню, так это класс для презентации времени в БД Firebird, а если точнее в его С++ обёртке IBPP::Date. Там 0 соответствует 31.12.1899, кстати на один день отличается от того что ты привёл.)

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем Korchy на 10.02.2011 в 02:32:15
The TDateTime class inherits a val data member declared as a double that holds the date-time value. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is the time of day.

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем jarni на 10.02.2011 в 03:17:09
2Korchy: Ага, эти из Делфи. Спс. [offtop]Кстати разница в начальном времени между приведёнными в пример TDateTime и IBPP::Date показывает что числовое значение нетранспортабельно в рамках даже одной платформы, в отличии от системных FILETIME (винда) и time_t (линукс).[/offtop]

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем Korchy на 10.02.2011 в 03:29:21

on 1297300629, jarni wrote:
FILETIME (винда)

Это, я так понял, структура для 64 битных систем.
Вообще, сколько я помню, дата хранилась во флоате или дабле. И считалась с 1900 года. Вот с той же msdn http://msdn.microsoft.com/ru-ru/library/82ab7w69.aspx

upd: ради любопытства посмотрел стандарт iso, который за даты-время отвечает, не нашел там никаких указаний на то, что считать нулевой датой. Так что можно писать свои функции и они будут на равных с микросовтовскими :)

Заголовок: Re: Околокомпухтерный хумор
Прислано пользователем jarni на 10.02.2011 в 03:59:03
2Korchy: Ответил в другой ветке, потому что здесь этому обсуждению не место.

http://forum.ja2.su/cgi-bin/yabb/YaBB.pl?board=hardnsoft;action=display;num=1138204535;start=57;new=1

Заголовок: Re: С++
Прислано пользователем jarni на 10.02.2011 в 03:58:08
Этот пост относится к посту из другой темы http://forum.ja2.su/cgi-bin/yabb/YaBB.pl?board=hardnsoft;action=display;num=1125497165;start=522;new=1

2Korchy:  
on 1297301361, Korchy wrote:
Это, я так понял, структура для 64 битных систем.
Нет, это структура (http://msdn.microsoft.com/ru-ru/library/ms686582%28v=VS.85%29.aspx) ещё со времён Win95, создана для перевода досового времени на более "широкий" тип, хранит информацию о количестве 0,1 мс интервалов прошедших от 1601 года. Именно эту структуру возвращает WIN32 API при запросе на время создания, последнего изменения и чтения файла. Кстати имя её может сбить с толку, она используется ещё во многих местах никак не связаных с файлами, например в WIN32 API функции для получения времени создания процесса, смерти процесса, и времени проведённого процессом в ядре и в юзер-режиме.


on 1297301361, Korchy wrote:
Вообще, сколько я помню, дата хранилась во флоате или дабле. И считалась с 1900 года. Вот с той же msdn http://msdn.microsoft.com/ru-ru/library/82ab7w69.aspx
Ну, поскольку я никогда не писал на Делфи, и не использовал даты в МФЦ, то могу сказать что "сколько я помню, подробная дата хранилась в структуре SYSTEMTIME" :). На низком уровне нету классов-обёрток для времени, именно поэтому и используются стартовые даты указанные системой, разработчиками ядра ОС, а не программистами этих самых обёрток. Почему они решили изменить в рамках одной платформы это время для меня остаётся загадкой.

З.Ы. SYSTEMTIME я написал не по ошибке, это просто читабельный формат в который переводится FILETIME вызовом WIN32 API FileTimeToSystemTime.


Заголовок: Re: С++
Прислано пользователем jarni на 10.02.2011 в 04:07:15
2Korchy:
on 1297301361, Korchy wrote:
upd: ради любопытства посмотрел стандарт iso, который за даты-время отвечает, не нашел там никаких указаний на то, что считать нулевой датой. Так что можно писать свои функции и они будут на равных с микросовтовскими
И да и нет. Как я уже говорил, при таком раскладе нельзя передавать время в низкоуровневом виде, тоесть например в виде числа 666. Потому что никому кроме тебя не будет известно что это число означает: 666 секунд от дати 0.0.0000, 666 миллисекунд от 1.1.1601, 666 дней от 23.5.2051. Конечно если это число не выйдет за рамки твоей программы то всё в порядке, но если его нужко передавать третьей стороне которую пишешь не ты, то уже надо договариватся о формате, тоесть хотя бы сказать что это число типа FILETIME или типа int для класса TDateTime. В последнем случае надо быть уверенным что получатель тоже использует TDateTime, потому что если нет то ему придётся писать собственную обёртку для перевода этого числа в читабельный формат или хотя бы в системный формат FILETIME, который в рамках всей линейки Вин означает одно и тоже и доступен всем кто использует WIN32 API.

Заголовок: Re: С++
Прислано пользователем Korchy на 10.02.2011 в 04:35:09

on 1297303088, jarni wrote:
Нет, это структура ещё со времён Win95

Угу, понял. Когда вбил в поиске, первым мне выскочил именно 64 битный вариант.


on 1297303088, jarni wrote:
Ну, поскольку я никогда не писал на Делфи, и не использовал даты в МФЦ,

но если его нужко передавать третьей стороне которую пишешь не ты, то уже надо договариватся о формате

А мне с Win API и соответственно с systemtyme не доводилось сталкиваться. Получается так как я и говорил - без четкого указания в стандарте каждый воротит как хочет :)

Заголовок: Re: С++
Прислано пользователем jarni на 10.02.2011 в 04:40:16
2Korchy:  
on 1297305309, Korchy wrote:
без четкого указания в стандарте каждый воротит как хочет
И к сожалению это создаёт кучу геморроя писателям кросплатформенного кода. :(

Заголовок: Re: С++
Прислано пользователем Artem13 на 28.02.2011 в 23:32:30
Народ, кто с Билдером/Дельфями знаком, подскажите:
Есть там компонент ListVeiw - как (и можно ли) поменять цвет шрифта одной строки? Стиль vsReport.

Заголовок: Re: С++
Прислано пользователем Korchy на 01.03.2011 в 05:08:27

on 1298928750, Artem13 wrote:
как (и можно ли) поменять цвет шрифта одной строки

Сам с таким не сталкивался, но вроде бы подобное нужно делать самому через перерисовку в OnPaint

upd:
Да, точно в OnDrawItem
Sender.Canvas.Font.Color = xxx;

Заголовок: Re: С++
Прислано пользователем Artem13 на 01.03.2011 в 19:33:24
2Korchy: сенькс, попробую.

Заголовок: Re: С++
Прислано пользователем Artem13 на 22.03.2011 в 22:48:53
Еще вопрос - мну заклинило, никак не могу вспомнить, какая функция обрабатывает запросы окна. Конкретно задача - во время длительного цикла обрабатывать сообщения окна (без использования второго потока).

Заголовок: Re: С++
Прислано пользователем jarni на 22.03.2011 в 22:55:42
2Artem13:

Code:
     // Main message loop:
     while (GetMessage(&msg, NULL, 0, 0))
     {
           if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
           {
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
           }
     }
.
.
.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     int wmId, wmEvent;
     PAINTSTRUCT ps;
     HDC hdc;

     switch (message)
     {
     case WM_COMMAND:
           wmId    = LOWORD(wParam);
           wmEvent = HIWORD(wParam);
           // Parse the menu selections:
           switch (wmId)
           {
           case IDM_ABOUT:
                 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                 break;
           case IDM_EXIT:
                 DestroyWindow(hWnd);
                 break;
           default:
                 return DefWindowProc(hWnd, message, wParam, lParam);
           }
           break;
     case WM_PAINT:
           hdc = BeginPaint(hWnd, &ps);
           // TODO: Add any drawing code here...
           EndPaint(hWnd, &ps);
           break;
     case WM_DESTROY:
           PostQuitMessage(0);
           break;
     default:
           return DefWindowProc(hWnd, message, wParam, lParam);
     }
     return 0;
}
.
.
.

Заголовок: Re: С++
Прислано пользователем Artem13 на 22.03.2011 в 23:00:06
2jarni: Да нет вроде. До этих я додумался, но им надо какие то параметры передавать и прочая фигня. Там что то типа дефолтной обработки ... Мне нужно просто окно перерисовывать регулярно, т.к. там вывод лога идёт...
ЗЫ Да, я всё Билдер мучаю :)

Заголовок: Re: С++
Прислано пользователем jarni на 22.03.2011 в 23:09:44
2Artem13: Обновил свой пост. В приведённой оконной функции есть case WM_PAINT где тебе и надо будет рисовать. Если в билдере оно работает иначе, то не знаю.

Может опишешь проблему поподробнее. Ты говоришь о длительном цикле. Где обрабатывается этот цикл? Если у тебя оконная программа то в приципе запуск этого цикла происходит как раз в обработке оконного сообщения, например в обработке кнопки. Если это так, то цикл заблокирован и тебе надо запускать по сути новый (временный) который заменит тот который ты заблокировал (поэтому лучше делать свои цикли в отдельных потоках). Ну или може просто вызываей функцию DoPaint() своего окна или что-то подобное раз за итерацию своего цикла.

Заголовок: Re: С++
Прислано пользователем Artem13 на 22.03.2011 в 23:22:13
2jarni: Ты приводишь варианты для чистого АПИ. Это я могу реализовать, но не хочется городить. Да, там долгий цикл в обработчике кнопика. Вернее большие траты на ожидание. Их можно оформить циклами и в начале каждого цикла обрабатывать сообщения в очереди. Но вот вроде была простая конструкция в Билдере для этого, но мну заклинило намертво :(

Заголовок: Re: С++
Прислано пользователем jarni на 22.03.2011 в 23:28:38
2Artem13: Может что-то вроде Application.ProcessMessages() ?

Заголовок: Re: С++
Прислано пользователем Artem13 на 22.03.2011 в 23:30:22
2jarni: О! Вот это кажется оно, сенькс, пошёл пробовать.

Заголовок: Re: С++
Прислано пользователем Artem13 на 03.09.2011 в 01:11:20
Ребята, снова пара вопросов:
1. винда. Как получить инфу о системе. Конкретно интересует наличие и названия СОМ-портов.
2. Есть переменная типа байт (BYTE, он же unsigned char). Нужно запихнутое туда число превратить в знаковое. Простое прямое приведение типов, ессно, не работает.

Заголовок: Re: С++
Прислано пользователем Korchy на 03.09.2011 в 01:24:14
2Artem13:
1. QueryDosDevice

2. Что значит превратить в знаковое? Если ты уже запихнул знаковое число в беззнаковый тип, информация о знаке утрачена т.к. байт отводимый под знак занят частью самого числа.

Заголовок: Re: С++
Прислано пользователем jarni на 03.09.2011 в 01:30:50
2Artem13:
1. SetupDiEnumDeviceInfo с нужными параметрами. GUID вроде GUID_CLASS_COMPORT. Вобщем гугли в этим направлении, потому что способ CreateFile( "\\\\.\\COM01"...) не совсем хороший.
2. Как так не работает? Если у тебя в байте 0xFF, то приведя его в знаковый вид ты получишь -1.

Заголовок: Re: С++
Прислано пользователем Artem13 на 03.09.2011 в 03:45:52
2Korchy: Да нет, не утрачена. Просто интерпретируется по-другому.
2jarni: а, это я ступил, наверное. Байт привёл к шорту. А там жеж длина другая со всеми вытекающими. Попробую сначала в чар перевести, сенькс.

2jarni:  
on 1315002650, jarni wrote:
CreateFile( "\\\\.\\COM01"...) не совсем хороший.

Я использую CreateFile( "COM1", ...) :) Проблем не замечено вплоть до Висты.

Заголовок: Re: С++
Прислано пользователем Korchy на 03.09.2011 в 05:42:14

on 1315010752, Artem13 wrote:
Да нет, не утрачена. Просто интерпретируется по-другому.  

Да, я немного неправильно написал, если записать и сразу считать оттуда же, будет сохранена. Стоит сделать любую операцию - будет утрачена.

Заголовок: Re: С++
Прислано пользователем Artem13 на 06.10.2011 в 22:19:09
Такой ситуёвина - есть прога на С++ и есть Флеш-прога (Айр, вероятнее всего). Необходимо регулярный (2 раза в секнду) обмен небольшим массивом данных. Программист флеш предлагает через текстовый (тхт, xml) файл. Однако я боюсь стандартными Сишными способами работы с файлами могут возникнуть конфликты доступа. Посоветуйте, как лучше всего это дело организовать.
ЗЫ Если есть способ встроить флеш в С-программу, вообще шикарно было бы :)

Заголовок: Re: С++
Прислано пользователем Korchy на 07.10.2011 в 04:26:53
2Artem13:
А банальные сокеты программист флеша не предлагает? И флеш и с++ поддерживают подключение через сокеты - самый прежде всего напрашивающийся вариант.

Заголовок: Re: С++
Прислано пользователем Artem13 на 07.10.2011 в 05:05:34
2Korchy: нет :(

Заголовок: Re: С++
Прислано пользователем Korchy на 07.10.2011 в 06:01:08

on 1317953134, Artem13 wrote:
нет

"Нет" что? Программист флеша не может это реализовать? Флешка не меняется?

Заголовок: Re: С++
Прислано пользователем Artem13 на 07.10.2011 в 06:07:58
2Korchy: не предлагал. Да и я сокетами не владею - не было надобности.

Заголовок: Re: С++
Прислано пользователем Korchy на 07.10.2011 в 06:19:31
2Artem13:

Да с сокетами просто все, особых заморочек нет. Для того, что ты написал это самый простой и логичный путь. Встроить флеш в приложение в принципе наверное можно, но я не уверен, что это даст решение проблемы т.к. встраивать ты будешь не саму флешку а флеш-плеер в котором флешка будет проигрываться, т.е. промежуточную виртуальную машину и проблема передачи данных сквозь нее останется, плюс у флеша куча заморочек с безопасностью доступа, которые тоже надо будет порешать. Может есть что-то, чего я не знаю, но ситуация видится мне так. А вообще, кому нужны данные? Флешке или проге?

Заголовок: Re: С++
Прислано пользователем jarni на 07.10.2011 в 06:46:36
2Artem13: С такой частотой обмена данными через файл лучше не делать. Доступ к файловой системе довольно медленный, будут постоянные простои. Если данными обмениваться только в одном направлении Флеш->С, то всё-таки можно пробовать, поскольку запрет на совместное использование файла на Вин/Лин работает вполне нормально, а на С можно спокойно делать поток для "опроса" файла. В обратном направлении будут проблемы если флеш не поддерживает потоки. В общем, геморрой тот ещё будет.

Так что учи сокеты, благо со стороны С на это пойдёт отсилы день, и заставляй Флешера делать тоже самое.

Заголовок: Re: С++
Прислано пользователем Korchy на 07.10.2011 в 07:05:49
Флеш естественно потоки не поддерживает. Но и для файл-обмена интервал в 2 минуты вполне достаточный. Вообще варианты есть, можно через базу данных например менять. Все зависит от задачи. Но сокеты наиболее универсальный и простой вариант.

upd. перечитал вопрос - 2 раза в секунду а не в минуту! Тогда только сокеты других вариантов не будет.

Заголовок: Re: С++
Прислано пользователем Artem13 на 07.10.2011 в 16:21:08
Нет, там основной поток как раз наоборот, С->Флеш.
Ладно, провентилирую насчет сокетов, но что то мне подсказывает, что врядли :(

Заголовок: Re: С++
Прислано пользователем jarni на 07.10.2011 в 19:39:55
2Artem13: Если сокеты не удастся продвинуть, тогда можно и через файл.
Способ 1: Создаёшь простой протокол: в файле первым байтом идентификатор направления потока данных. Дальше 4 байта временная метка. Дальше данные. Тот кому нужен доступ для файла открывает его на запись и чтение но без шеринга, абсолютно. Это для того чтобы при конкурентном доступе процесс ждал пока тот другой процесс закончит свою операцию.

Дальше работа для обоих одинкова.
Раз в пол секунды процессу нужно что-то прочитать, он открывает файл и смотрит на первый байт. Если там его идентификатор значит там данные для него. Дальше он смотрит на метку. Если она отличается от предыдущей, то значит в файле новые данные, можно читать. Если же метка не поменялась, то данные от последнего чтения не менялись. Закрывает файл.
Если надо записать в файл, то открываем, пишем в первый байт идентификатор для того другого, пишем новую метку, пишем данные.
Вполне возможно что когда откроешь файл для записи, то там будут новые данные для чтения. От логики твоей программы зависит если ты эти новые данные проигнорируешь или сначала их прочитаешь а потом уже будеш писать свои.

Способ 2: В файле выделяешь фиксированную часть для одного процесса, и такую же для второго. Первый скажем читает данные с оффсета 0, пишет с оффсета 512, второй наоборот, пишет с оффсета 0, читает с оффсета 512. В таком виде отпадает надобность иметь идентификатор направления. Остаётся только метка. Обработка проще. Открыл, посмотрел нет ли чего новенького на оффсете для чтения, записал свои данные на оффсет для записи.

В случае если файл открыт другим процессом, повторять попытку его открыть раз в 50-100 мс. Не знаю правда одного нюанса. Если будет использоватся винчестер то там есть кеш. Если все операции будут проводится в кеше то быстродействие может быть вполне нормальное. ОСь после закрытия файла далеко не всегда сразу переливает его из кеша на сам диск. Если всё-таки после закрытия файл будет всегда сливаться на диск, то лампочка работы с диском у тебя не потухнет, вероятность убить диск будет возрастать в каждым часом проработанном в таком режиме. Также надеюсь это всё не будет проходить на флешке, имею ввиду флеш-диск. За каких-то 10 минут ты убёшь сектор который станет нечитабельным. Из последнего думаю понятно что может таки лучше попробовать сокеты.

Заголовок: Re: С++
Прислано пользователем Artem13 на 07.10.2011 в 23:41:31
2jarni: Сенькс, если что попробую. Пока вроде наметился прогресс в сокетах. во всяком случае программист сообщила, что знакома с данной технологией.

Заголовок: Re: С++
Прислано пользователем Artem13 на 10.10.2011 в 20:29:16
2Korchy: 2jarni: Други, в двух словах о сокетах - возможно ли применения на локальном компе и как?

Заголовок: Re: С++
Прислано пользователем jarni на 10.10.2011 в 20:35:21
2Artem13: Конечно. Для этого существует так званый loopback ip-адрес: 127.0.0.1.

Сервер создаёт сокет, байндит его на адрес и порт, 127.0.0.1:55555. Сервер будет принимать исключительно локальное соединение на одном компе.

Клиент коннектиться прямо на адрес и порт: 127.0.0.1:55555.

Заголовок: Re: С++
Прислано пользователем Korchy на 10.10.2011 в 23:42:48
Ярни все верно написал.
Не указал разве что 127.0.0.1 называется localhost и порты лучше выбирать начиная с 255, до 255 почти все отведены под какой-нибудь системный процесс.

Заголовок: Re: С++
Прислано пользователем jarni на 10.10.2011 в 23:46:54
2Korchy: Ну да, про алиас забыл. А порты вроде лучше выбирать из 49152–65535, поскольку они не могут быть зарегистрированы IANA. Взяв что-то ниже можно нарваться на уже используемый какой-то програмулиной или сервисом порт.

Заголовок: Re: С++
Прислано пользователем Korchy на 11.10.2011 в 00:24:25

on 1318279614, jarni wrote:
Ну да, про алиас забыл. А порты вроде лучше выбирать из 49152–65535, поскольку они не могут быть зарегистрированы IANA. Взяв что-то ниже можно нарваться на уже используемый какой-то програмулиной или сервисом порт.  

Да это уже без разницы. Идентификацию своих данный все равно по-хорошему нужно делать, никогда нет стопроцентной уверенности что еще кто-нибудь по чистой случайности не возьмет выбранный порт. А так можно хоть 80й интернетовский брать. Просто больше ожидание и отсеивать кучу чужих пакетов придется.

Заголовок: Re: С++
Прислано пользователем Artem13 на 11.10.2011 в 00:39:15
2Korchy: В Билдере есть два компонента - их достаточно будет, или необходимо еще какие-то шаманства проделать?

Заголовок: Re: С++
Прислано пользователем Korchy на 11.10.2011 в 00:43:01

on 1318282755, Artem13 wrote:
В Билдере есть два компонента

В Борландовском? Я же не знаю задачи. Для простой передачи пакетов данных, типа чата - вполне.
Только учти что флеш использует только неблокируемые сокеты. Тебе скорее всего нужно будет использовать их же.

Заголовок: Re: С++
Прислано пользователем jarni на 11.10.2011 в 01:06:14

on 1318282981, Korchy wrote:
скорее всего нужно будет использовать их же
Если это не нужно самой программе, то в этом нету необходимости. В смысле, одну сторону соединения можно обрабатывать синхронным способом, другую асинхронным совершенно спокойно.

Заголовок: Re: С++
Прислано пользователем Korchy на 11.10.2011 в 02:14:26

on 1318284374, jarni wrote:
Если это не нужно самой программе, то в этом нету необходимости. В смысле, одну сторону соединения можно обрабатывать синхронным способом, другую асинхронным совершенно спокойно.

Вообще, да, ты прав.

Заголовок: Re: С++
Прислано пользователем Artem13 на 11.10.2011 в 02:53:09
2jarni: 2Korchy:  Спасибо, буду изучать :)

Заголовок: Re: С++
Прислано пользователем Artem13 на 01.11.2011 в 23:04:14
Продолжаем тему :)
Собсно, как то я с флэшкой взаимодействую. Теперь другой задача - как мне этот сторонний экзешник запустить/закрыть? Запустить я могу через ShellExecute, но тогда как останавливать. С другой стороны, вроде CreateProcess позволяет запустить внешний ехе и получить его хэндл дабы потом с ним манипулировать; однако вопрос - что будет с этим хэндлом, если внешний ехе закроется собственными средствами без моего вмешательства? Я об этом узнаю?
А може кто еще какие методы поскажет?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 01.11.2011 в 23:33:14
2Artem13: CreateProcess это твое всё. :)

       STARTUPINFO      si = {0};
     PROCESS_INFORMATION pi = {0};
     si.cb = sizeof(si);
     if( CreateProcess(
           "Имя экзешника",
           "Аргументы",
           NULL,
           NULL,
               FALSE,
               0,
           "Переменные среды если надо",
           "Рабочая директория если надо поменять",
           &si,
           &pi <-- вот это тебе как раз и нужно) )
     {
           //m_hProcess = pi.hProcess;
           //m_pid                   = pi.dwProcessId;

//Вот так надо следить за процессом. Именно так ты узнаешь если процесс умер. Wait вывалится как раз в момент смерти. Хендл потом обязательно закрыть иначе будет хендл-лик у процесса (у винды ограничение на 16 млн хендлов но и это число мне однажды удалось достичь из-за утечки).
if( WAIT_OBJECT_0 == ::WaitForSingleObject(pi.hProcess, INFINITE) )
     {
               //Процесс больше не жилец
               //Eсли надо узнать с каким кодом процесс умер то делается это так
           DWORD dwExitCode;
           if( GetExitCodeProcess(m_hProcess, &dwExitCode) )
           {
                   //dwExitCode это та цифра с которой процесс вышел из main().
           }
     }
     }

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 02.11.2011 в 00:40:33
2jarni: сенькс. Мне за ним следить особо не надо, но я должен его убить при собственном закрытии, а закрытие уже убитого процесса в винде, емнип, приведёт к крашу.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 02.11.2011 в 00:46:35
2Artem13: TerminateProcess не крешится, просто возвратит FALSE.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 02.11.2011 в 00:53:25
А GetLastError в даннов случае возвращает ERROR_INVALID_HANDLE. Только что проверено.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 02.11.2011 в 03:19:36
2jarni: Сенькс. Завтра попробую у себя.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 03.11.2011 в 00:22:20
2jarni: Что я делаю не так? Срабатывает только со второго раза и процесс  не терминатится :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 03.11.2011 в 00:24:19
А на что ругается первый раз?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 03.11.2011 в 00:52:37
Вот такой вот код

Code:
int main( int argc, char * argv[] )
{
 STARTUPINFO      si = {0};
 PROCESS_INFORMATION pi = {0};
 si.cb = sizeof(si);

 if( !CreateProcess( "app.exe", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, 0, &si,&pi) )
 {
   printf("Failed to create.\n" );
   return -1;
 }

 printf("Created.\n");
 if ( WaitForSingleObject( pi.hProcess, 10000 ) != WAIT_TIMEOUT )
 {
   printf("Dead :-(.\n");
   return -2;
 }

 printf("Alive.\n");
 UINT exit_code = 0xBAADF00D;
 if ( !TerminateProcess( pi.hProcess, exit_code ) )
 {
   printf("Failed to Terminate.\n" );
   return -3;
 }

 printf("Terminated.\n");
 if ( WaitForSingleObject( pi.hProcess, 10000 ) != WAIT_OBJECT_0 )
 {
   printf("Handle is not set.\n" );
   return -4;
 }
 
 printf("Dead :-).\n");
 DWORD dwExitCode = 0;
 if ( GetExitCodeProcess( pi.hProcess, &dwExitCode) )
 {
   printf("Terminated with ec: %x.\n", dwExitCode );
 }
 else
 {
   printf("Failed to get ec.\n" );
 }

 return 0;
}


у меня работает с вот таким результатом

Quote:
Created.
Alive.
Terminated.
Dead :-).
Terminated with ec: baadf00d.


app.exe это однострочная програмка

Code:
int main( int argc, char * argv[] )
{
 Sleep(3600000);
 return 0;
}


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 03.11.2011 в 03:40:58

on 1320269059, jarni wrote:
А на что ругается первый раз?

ХЗ, я не смотрел еще, на скорую руку нарисовал, код ошибки не смотрел.

А в терминатор я код передавал 0. Я уже не помню какой там код нормального завершения должен быть.

Кстате, CloseHandle после терминатора не нужен?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 03.11.2011 в 03:44:59
2Artem13:  
on 1320280858, Artem13 wrote:
Я уже не помню какой там код нормального завершения должен быть
А он у всех свой, но общепринятое - 0. Хотя встречал проги которые успешное завершение обозначают как 1, как аналог TRUE.


on 1320280858, Artem13 wrote:
Кстате, CloseHandle после терминатора не нужен?  
Надо. Забыл, опять забыл. (с) :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 22.02.2012 в 01:13:40
Я чего то опять туплю - давно не работал с контейнерами и не могу сообразить. Есть ли в С++/STL/ещё где-нибудь контейнер или алгоритм, позволяющий прямую и обратную выборку? Т.е. значение по ключу и ключ по значению. В принципе, размер небольшой и можно тупо два массива сварганизовать, но хочется изящно поизвращаться  :D

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 22.02.2012 в 01:25:36
2Artem13: НЯЗ в STL таких контейнеров нету. Но нужную тебе функциональность предоставляет любой STL контейнер с поиском по ключу + функция std::find. Только учти что у последней сложность O(n).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 22.02.2012 в 01:56:01
2Artem13:

on 1329862420, Artem13 wrote:
Есть ли в С++/STL/ещё где-нибудь контейнер или алгоритм, позволяющий прямую и обратную выборку?

std::map смотри. Поиск значения по ключу есть, поиск ключа по значению - циклом. На основе map'a сделан boost::multi_index, там вроде реализован и прямой и обратный поиск. Но если без буста, то через мап.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 22.02.2012 в 03:46:20
Спасибо, так и думал. Поизвращаюсь и так и эдак, наверное.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 29.09.2012 в 01:00:50
Имею такой кусок кода:


Code:
const int lattice_size=50;
const int max_ncltd=30000;
int *lattice1;

...

lattice1=(int*)malloc(lattice_size*lattice_size*lattice_size*(max_ncltd+1)*sizeof(int));


При компиляции на последней приведенной строке выдается предупреждение: "warning C4307: '*' : integral constant overflow". Почему оно так и что сделать, чтоб его не было?
(интуитивно подозреваю, что проблема в размере этой переменной, которая состоит из 4е9 интов, но хотелось бы конкретнее...)

А, да: система Win7 32.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 29.09.2012 в 03:50:26
2Ushwood:
Потому что latticel объявлено как указатель на int. int имеет хранимый объем 4 байта. Выделяя память под массив в последней строчке ты выделяешь столько, что превосходишь максимальное число влезающее в 4 байта (-2^16 - 2^16).
Легко проверить, тоже самое предупреждение ты получишь при такой строке:
int a = INT_MAX+1;

Самое простое решение - переопредели *latticel на тип double (8 байт -2^32 - 2^32). Т.е. так:

double *latticel;
...
latticel = (double*)malloc( ... *sizeof(double));

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 29.09.2012 в 06:50:27
2Korchy: Спасибо, попробую сделать так...

ммм, однако мне там удобнее работать с интами, чем с даблами... ладно, ченить придумаю.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 29.09.2012 в 07:00:11
2Ushwood: Использование другого типа тебе не поможет в данном конкретном случае. А то что посоветовал Никита так вообще. У тебя ведь не проблема в переменной для данных а в размере поля для этих данных. Если бы позволяла система то вполне хватило бы вместо const int использовать const unsigned long long, он 64битный беззнаковый, туда влезет очень много. Но система в твоём случае не позволяет. Ты хочешь создать ~15Гб, но на 32битной системе у тебя теоретических 4Гб, а фактических около 2Гб ну или 3Гб если использовать дополнительную опцию в настройках Винды.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 29.09.2012 в 09:15:51
2jarni:
Проблема, насколько я понимаю, в том, что размер массива вылезает за адресацию int. Соот-но использование long или double без разницы, должно помочь. Я не задумывался, но разве в 32битной системе нельзя выделить память больше 2 гб? По идее система должна занять сколько сможет оперативки, а остальное начнет хешировать на диск.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 29.09.2012 в 10:10:29
2Ushwood:
Так работай с интами. Указатель должен быть большим, а не размер ячейки массива.
И да, Юра прав, используй long. Я забыл, что double это плавающая точка, он не хранит точных значений.
Так тогда получится:

long *lattice1;
lattice1=(long*)malloc(lattice_size*lattice_size*lattice_size*(max_ncltd+1)*sizeof(int));

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 29.09.2012 в 10:19:47

on 1348899351, Korchy wrote:
не задумывался, но разве в 32битной системе нельзя выделить память больше 2 гб?

Можно, но не винде.

on 1348899351, Korchy wrote:
По идее система должна занять сколько сможет оперативки, а остальное начнет хешировать на диск.  

А обращаться к памяти ты будешь через духов машины ? адресация то 32 битная.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 29.09.2012 в 10:22:29
2Korchy: Ты предложил заменить элементы int на double. Это точно не решает проблему потому что double элементов всё равно будешь создавать int штук. Поэтому я предложил оставить элементы int но количество штук заменить на 64битную величину.

Но это всё так сказать - фигня. Самая главная проблема состоит в адресном пространстве. Если ты создашь массив из 4е9 int'ов, то адрес первого будет, чисто теоретически, 0х00000000, адрес второго 0х00000004. С адресом 0хFFFFFFFC будет всего лишь 1073741823 элемент массива. И всё. То есть, из 4е9 элементов адресовать ты можешь только 1е9. Ну, можно конечно задать индекс 2000000000, но я не знаю что случиться первым, Segmentation Fault или перетечение адреса и соответственно адресация неправильного участка памяти. Уж лучше то первое.

АПДЕЙТ:
Никита, ты путаешь яблоки с грушами. long *lattice1;  это указатель на массив элементов типа long. Юре не нужен этот тип, ему нужны int'ы, к тому же на 32битной платформе у них одинаковый размер. Ему нужно увеличивать константы так как я писал. Тут вот в чём дело, компилятор имеет ряд вполне чётких правил преобразования типов.
lattice_size*lattice_size*lattice_size*(max_ncltd +1)*sizeof(int) это int*int*int*int*size_t.
50*50*50 - всё в порядке. Результат int
125000 * 30001 = 3750125000. Перетечение знакового типа, результат -544842296.
-544842296 * 4: -544842296 переводится в size_t потому что этот тип больше, 3750125000 * 4 = 2115598112. Перетечение, неверный результат. Поэтому нужен тип больше.

АПДЕЙТ2:
На первый взгляд может показаться что я написал тавтологию, 3750125000 --> -544842296 --> 3750125000. Но это тавтология только на 32битной платформе. Если оставить те же типы но скомпилировать код на 64 битной платформе то результат будет немного другим.
int на 64битах остаётся 32битным.
sizeof(int) возвращает значение типа size_t, которое на 64битной платформе имеет 64бита. Значит так. Первые 4 умножения происходят в рамках int с результатом -544842296. В хексе это 0хDF865DC8. Проблемка только в том что по правилам компилятора расширение типов происходит так: int --> int64 --> uint64, а это значит 0хDF865DC8 (int) --> 0xFFFFFFFFDF865DC8 (int64) --> 0xFFFFFFFFDF865DC8 (uint64). Последнее число в десятичной форме уже 18446744073164710000. Много, да. Потом ещё умножить на 4. Значение опять перетечёт, получится 0хFFFFFFFF7E197720, в дека 18446744071530183000. Не забываем что теперь это уже беззнаковое. Вот именно это число полезет в malloc (интерфейс void * malloc(size_t) ). Хех, столько памяти позволит аллоцировать разве что супер-пупер-мега кластер с дистрибуированной ОС, например IBM BlueGene.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 29.09.2012 в 10:44:29
2Ushwood: Юр, если нету возможности портировать программу на 64битную платформу предлагаю разбить проблему на меньшие части и делать её по частям, "подсасывая" в нужный момент нужную часть. Например, если ты читаешь данные из файла, то создай массив размером в 1 млн. int'ов и залей в него первый миллион из файла. После обработки этого, залей второй на то же место и так победного конца. ;)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 29.09.2012 в 11:06:11
2Korchy: 2jarni:
Благодарю за советы. Осмыслив информацию, я понял, что мне нужно сделать ход конем. Осталось разобраться, что это за конь и как он должен ходить...

В общем, задача (точнее, подзадача), которую мне нужно решить, следующая.

У меня есть n точек в трехмерном пространстве, координаты которых мне задаются. Число n большое - порядка 1е6, но проблема не в них.
Пространство поделено кубической решеткой на m x m x m ячеек. Заранее известно, что в каждой ячейке может быть не больше n0 точек (n0=30000). Сколько именно точек окажется в какой ячейке - заранее неизвестно (я это узнаю, когда получаю координаты точек).
Задача: по номеру (i,j,k) кубической ячейки получить доступ ко всем точкам, которые в этой ячейке есть. Задачу надо решать много раз, поэтому вариант перебирать каждый раз все n точек сразу отметается.

Сперва у меня было m=25, и я решил задачу просто: сперва создал линейный массив (размером n) структур, где прописаны координаты каждой точки, потом создал массив int lattice[m][m][m][n0+1] и заполнил его: для каждого (i,j,k) я в ячейку [i][j][k][0] вписал количество точек в этой ячейке, а дальше - номера этих точек. Все было нормально, на машине с 4 гигами оперативки все работало.

Дальше понадобилось увеличить m как минимум до 50 (на самом деле - хорошо бы до 100), и начались проблемы. Компилить массив lattice[m][m][m][n0+1] Си просто отказался, когда я попытался обойти это дело с помощью указателей - выдал то, что я написал выше.

Теперь, собсно, свежие мысли. Реально ведь в этом массиве подавляющее большинство ячеек будут просто забиты нулями - ужасающе неэффективный расход памяти. Нельзя ли в каждой из этих 50х50х50 ячеек выделять объем не под максимальные 30000 точек, а индивидуально, под то количество точек, которые реально в эту ячейку попали? Чувствую, тут нужна какая-то химия врое массива указателей, но я в этой области плаваю...:idontknow:

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 29.09.2012 в 17:55:25
2jarni:
Я предлагал менять не размер элементов а размер указателя на массив. Плохо наверное написал. И видимо да, с наскоку так просто проблему с адресацией не решить.

upd:
В любом случае не понимаю, почему нельзя сделать свой указатель, если системных не хватает. Что-то вроде

Определить массив

int BigArray[INT_MAX][INT_MAX];

И переопределить указатель:

int & operator [] (long id) const {
int FirstWord = id/INT_MAX;
int LastWord = id%INT_MAX;
return BigArray[FirstWord][LastWord];
}

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 29.09.2012 в 18:07:11

on 1348905971, Ushwood wrote:
В общем, задача (точнее, подзадача), которую мне нужно решить, следующая.  

Опять же решение с наскока: по точкам строить дерево. Для твоей задачи скорее всего Octree.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 29.09.2012 в 18:30:20
2Ushwood: Можно мнение новичка?

Точки в процессе двигаются? Доступ нужен ко всем сразу или только к определённой части?

Если точки неподвижны и доступ нужен только к части из них, можно разделить все точки по полоскам m*m*5, например, и записывать на диск. Как в звёздном каталоге никто не держит информацию о миллиарде звёзд в одном файле.


on 1348905971, Ushwood wrote:
Нельзя ли в каждой из этих 50х50х50 ячеек выделять объем не под максимальные 30000 точек, а индивидуально, под то количество точек, которые реально в эту ячейку попали?
Думаю можно. При считывании точек на каждую ячейку пространства заводим счётчик cnt<n0 и указатель на первый элемент, лежащий в ячейке, который представляет структуру: элемент, указатель на следующий.

Считав точки, чтобы не возиться со списками в таком виде, переделываем структуру данных, делаем массив
m*m*m, каждый элемент которого является структурой данных вида: количество точек в этой ячейке (мы их уже сосчитали на предыдущем шаге), динамический массив из количества точек. (Или указатель на массив из количества точек плюс один, где в нулевой позиции хранится кол-во точек).

Если работать с этим потом долго, то подготовка может дать свои плюсы, тем более что второй этап должен неплохо параллелится.

При этом, чтоб меньше возиться с указателями, можно попробовать массив [m][m][m] заменить на линейный массив [m*m*m] - миллион указателей, должно влезть. Индексы обрабатывать вручную, работать может быстрее цепочек указателей.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 29.09.2012 в 23:17:12
2Korchy:  
on 1348930525, Korchy wrote:
Я предлагал менять не размер элементов а размер указателя на массив.
Диаметрально противоположно. Размер указателя на 32битной платформе всегда! равен 4байтам, хоть это char * хоть void * хоть uint64 *. Разница только в адресуемых элементах. Это же прописные истины указателей. Как твоя структура сможет получить доступ к последнему элементу BigArray? Суть не в том как ты посчитаешь координаты а в том как в конечном итоге это должен будет сделать компилятор. Читай ниже ответ Льву.

2Lion:  
on 1348932620, Lion wrote:
попробовать массив [m][m][m] заменить на линейный массив [m*m*m]
Лёва, учи матчасть. :) Компьютер абсолютно ничего не знает о двух-, трёх-, двадцати-мерных массивах. Все они у него линейные. Просто в случае одномерного массиву ты делаешь арифметику для доступа к ячейке (что-то вроде i*line_size + j), а в случае многомерного эту арифметику за тебя делает компилятор, то есть, a[i][j] он как раз пересчитывает на i*line_size + j.

2Ushwood: Моё предложение это хэш-таблица. Из координат i,j,k считаешь хэш. Под этим хэшем у тебя будет сохранён динамический массив. Время доступа в хэш-таблице в среднем равно 1 (всё зависит от количества коллизий). Динамический массив придётся написать самому или взять из интернета. Вся суть в том чтобы аллоцировать массив по кускам, скажем по 100 элементов, в идеальном случае PAGE_SIZE/sizeof(int) что обычно равно 1024 минус всякие вспомогательные вещи. Выравнивание на ширину страницы ускоряет управление памятью. При такой организации данных среднее время на сохранение одной точки будет равно 1, потому что вставка в хэш-таблицу как и поиск равно 1, и вставка в линейный массив нового элемента тоже равно 1.

Что-то я не нашёл сложность вставки и поиска в Octree, но у обычных бинарных деревьев это n*log(n) что тоже быстро но всё равно хуже 1.

Приметка: если каким то чудесным образом та наперёд знаешь сколько точек будет находится по каждой координате то автоматически отпадает потребность в динамическом массиве.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 30.09.2012 в 00:56:12
2jarni:
Ок, наверное я не прав.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 30.09.2012 в 01:15:13
2jarni: Если я правильно помню, в Си вообще нет массивов, есть синтаксическая конструкция их заменяющая. По сути является указателем на первый элемент.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 30.09.2012 в 03:09:24
2Korchy:

Code:
int main( int argc, const char * argv[] )
{
 unsigned char dummy[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB };
 int * ptri = (int*)dummy;
 long * ptrl = (long*)dummy;
 long long * ptrll = (long long *)dummy;
 printf("int  : var size %u, ptr size %u ptr %p valueh 0x%X\n", sizeof(*ptri), sizeof(ptri), ptri, *ptri );
 printf("long : var size %u, ptr size %u ptr %p valueh 0x%X\n", sizeof(*ptrl), sizeof(ptrl), ptrl, *ptrl );
 printf("int64: var size %u, ptr size %u ptr %p valueh 0x%I64X\n", sizeof(*ptrll), sizeof(ptrll), ptrll, *ptrll );

 int (*ptrai)[2] = (int(*)[2])dummy;
 printf("0x%X 0x%X\n", ptrai[0][0], ptrai[0][1] );
 printf("0x%X 0x%X\n", ptrai[1][0], ptrai[1][1] );
 printf("ai   : var size %u, ptr size %u\n", sizeof(*ptrai), sizeof(ptrai) );

 ptri = (int*)0xBAADF00D;
 int i = INT_MAX;
 int j = INT_MAX;
 int value11 = ptrai[i][j];
 printf("value: pointers: 0x%p == 0x%p, values: 0x%X == 0x%X\n", &ptrai[i][j], &ptri, ptrai[i][j], ptri );
 return 0;
}

Результат:

Code:
int  : var size 4, ptr size 4 ptr 0012FF50 valueh 0x67452301
long : var size 4, ptr size 4 ptr 0012FF50 valueh 0x67452301
int64: var size 8, ptr size 4 ptr 0012FF50 valueh 0xEFCDAB8967452301
0x67452301 0xEFCDAB89
0xAAAAAAAA 0xBBBBBBBB
ai   : var size 8, ptr size 4
value: pointers: 0x0012FF44 == 0x0012FF44, values: 0xBAADF00D == 0xBAADF00D


int i = INT_MAX;
00411501  mov         dword ptr [ebp-54h],7FFFFFFFh
 int j = INT_MAX;
00411508  mov         dword ptr [ebp-60h],7FFFFFFFh
 int value11 = ptrai[i][j];
0041150F  mov         eax,dword ptr [ebp-54h] копирование в еах переменной i, INT_MAX
00411512  mov         ecx,dword ptr [ebp-48h] копирование в еcх значения ptrai, у меня 0x0012ff50
00411515  lea         edx,[ecx+eax*8] загрузка еффективного адреса, то есть указателя на начало 1ой строки матрицы. Здесь хорошо видна первая часть матричной арифметики: 0x0012ff50 + 0х7FFFFFFF * 8 = 0x0012ff50 + 0х7FFFFFF8 = 0x0012ff48. *8 потому что длинна строки матрицы это 8 байт или 2 int'а. По большому счёту указатель теперь указывает на 8 байт "левее" в стек
00411518  mov         eax,dword ptr [ebp-60h] копирование в еах переменной j, INT_MAX
0041151B  mov         ecx,dword ptr [edx+eax*4]
копирование в еcх значения которое находится по адресу edx+eax*4 = 0x0012ff48 + 0х7FFFFFFF * 4 = 0x0012ff44. Ещё на 4 байта "левее" в стек. К сожалению мне "повезло" и адрес оказался валидным. У меня здесь по чистой случайности оказалась перемення ptri, поэтому в ecx залилось её значение - адрес dummy 0x0012ff50.
0041151E  mov         dword ptr [ebp-6Ch],ecx копирование из ecx в переменную value11

Теперь думаю всё более-менее понятно. При попытке посчитать координату указатель перетёк несколько раз, первый раз при попытке посчитать адрес нужной строки, второй раз при высчитывании адреса элемента в строке.
2Lion: Называй как хочешь, суть от этого не меняется.


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 30.09.2012 в 06:24:55
Всем спасибо за помощь :).
Я нашел решение, самое тупое и, по-видимому, самое простое: исходный линейный массив точек сортируется (один раз) по возрастанию номера ячейки, в которые они входят, а в трехмерный массив 50х50х50 заносятся только границы соответствующих областей массива точек. Все.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 30.09.2012 в 06:29:33
2Ushwood: Это не решение, а обход решения :). Ведь у тебя всё равно останутся неиспользованные ячейки, в которые ни одна точка не попадает.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 30.09.2012 в 07:52:22
2jarni: нет, не останется. Ты обратил внимание, что я написал - теперь у меня массив lattice не четырехмерный, а трехмерный? int lattice[m][m][m]. При этом lattice[0][0][0] - число точек в ячейке (0,0,0), lattice[0][0][1] - суммарное число точек в ячейках (0,0,0) и (0,0,1) и т.д. Поскольку массив точек отсортирован, этой информации мне достаточно, чтобы получить доступ ко всем точкам, находящимся в интересующей меня ячейке. Я задаю номер ячейки (i,j,k), и нужные мне точки в отсортированном линейном массиве - от lattice[i][j][k-1] до latticce[i][j][k].
Вместо 15 гигабайт размер массива 600 килобайт. Профит :).

ЗЫ. то есть пустые ячейки пространства останутся, конечно, это свойство системы. Но если раньше пустая ячейка пространства - это было 30000 нулевых интов, то теперь - один инт. С точки зрения расхода памяти - две большие разницы :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 30.09.2012 в 17:47:24
2jarni:
Я не совсем понял, что ты доказал примером, но я согласен, задача адресовать массив больше MAX_INT так просто не решается. И раз Юра такую задачу не ставит и нашел решение с маленьким массивом, ломать голову над этим не нужно. Хотя где-то на задворках сознания сидит мысля, что это все-таки возможно реализовать (но я на ней не настаиваю потому, что раньше такого не решал).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 30.09.2012 в 21:22:34
2Korchy: Первая часть примера показывает что изменение типа указателя не меняет размер указателя и соответственно не позволяет адресовать больше а совсем даже наоборот, вторая часть показывает как возникает перетечение указательной арифметики и что это не обязтельно свалится с исключением которое бы указало что что-то не так.


on 1349016444, Korchy wrote:
задача адресовать массив больше MAX_INT так просто не решается
Ну почему же, решается очень просто аж до MAX_UINT. Вообще мне кажется немного некорректным использовать для индекса знаковые целые ведь индекс всегда >=0.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 30.09.2012 в 22:05:33
2jarni:

on 1349029354, jarni wrote:
Первая часть примера показывает что изменение типа указателя не меняет размер указателя и соответственно не позволяет адресовать больше а совсем даже наоборот

Да, с этим согласен, я поторопился.


on 1349029354, jarni wrote:
Ну почему же, решается очень просто аж до MAX_UINT

Это тоже самое. Я имел ввиду выход за эти пределы.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 18.04.2013 в 01:49:39
Вопрос не совсем по С++, но не знаю, куда его загнать, а отдельной темы создавать явно смысла не имеет.
Задача такая: есть слово. Например MNEMONIKA. И есть условие поиска, например *MN*NIK* по которому слово находится. Нужно определить наибольшее кол-во совпавших символов и позиции совпавших фрагментов. Для данного примера ответ будет 1 (позиция) - 2 (кол-во совпадений), 6 - 3. В принципе алгоритм прост: последовательно фрагменты между звездочек двигаем по полному слову, считаем кол-во совпадений символов, максимальные значения запоминаем.
Проблем: сколько звездочек поставил пользователь в поиске заранее не известно. Считается при вызове процедуры поиска diff("*MN*NIK*","MNEMONIKA");
Вопрос: возможно ли организовать алгоритм циклами для динамического кол-во звездочек. Проблема №2: использовать массивы и динамические переменные нельзя - нужна процедура на языке MySQL, он динамику не поддерживает.
Я пока решил, что больше пяти фрагментов (4 звездочек) - это бред и тупо вложенными циклами сделал сканирование для пяти кусков.
Но хотелось бы понять, можно ли придумать алгоритм без массивов для любого кол-ва звездочек.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 04.06.2013 в 20:43:29
Нужно простое динамическое хранилище для составных данных (struct известного размера). Попытался использовать vector, но билдер ругается на отсутствующий тип (хотя тип структуры объявлен ранее).

typdef struct { ...} Abonent;

vector<Abonent> AbonentList;

ЧЯДНТ? Вся литература дома осталась, подглядеть негде :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 04.06.2013 в 20:48:22
2Artem13: А ты уверен что ругается на незнание Abonent'а? Может ты просто забыл std:: перед vector написать? У меня никаких проблем в ВС2008.


on 1370367809, Artem13 wrote:
Вся литература дома осталась
Гугл тебя забанил? :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 04.06.2013 в 21:20:15

on 1370368102, jarni wrote:
Может ты просто забыл std:: перед vector написать?

Это мысля! Ща попробую.


on 1370368102, jarni wrote:
Гугл тебя забанил?

Время мало - на моём рабочем компе нет инета, приходится на общий бегать.

Я просто СТЛ юзаю от случая к случаю, которые очень редки :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 04.06.2013 в 21:23:06
2Artem13:  
on 1370370015, Artem13 wrote:
на моём рабочем компе нет инета
Ух как всё грустно :(.

Если добавка стд:: не помогла то было бы хорошо если бы ты скопировал сюда текст ошибки.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 04.06.2013 в 21:49:25
2jarni: Не, помогло. Большое спасибо!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 23.07.2013 в 21:47:38
Други, нужен совет.
ИД: Есть расширяющаяся номенклатура приборов. Приборы поддерживают обмен по протоколу Modbus. Для каждого нового прибора мне приходится писать новую программу для работы с ним по цифровому интерфейсу.
Задача: написать б-м универсальную программу хотя бы для визуализации принятых с прибора данных. На данный момент я вижу один способ - во внеш. конфигурационных файлах описывать данные, получаемые с каждого типа приборов (доступное адресное пространство, название тип данных по определённым адресам).
Собсно, может кто предложить другой вариант. Если нет, то по озвученному - для конфиг-файлов использовать хml, ini или еще что?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 23.07.2013 в 21:56:33
2Artem13: Тоже не вижу другого варианта кроме конфига. Универсальный способ без надобности перекомпиляции. А тип конфига выбирай из собственных преференций, что тебе легче парсить, важен ли размер файла, надо ли будет делать над конфигом какие-то другие операции вроде выборки подможеств параметров, надо ли удобство создания когфига и т.д.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jz на 23.07.2013 в 22:17:25

on 1374605258, Artem13 wrote:
Собсно, может кто предложить другой вариант. Если нет, то по озвученному - для конфиг-файлов использовать хml, ini или еще что?
Как я понял, большое преимущество XML перед INI - производителность при чтении Больших файлов. Т.е. 1Мб и т.д.
Если файл маленький, то INI лучше тем, что он проще по структуре, и понятнее обычным пользователям.
В XML можно целиком класс засунуть, т.е. большую иерархию параметров сделать.
Также, под XML в соврем. языках (С#, Java) уже есть библиотечные функции.


on 1374605258, Artem13 wrote:
Задача: написать б-м универсальную программу хотя бы для визуализации принятых с прибора данных. На данный момент я вижу один способ - во внеш. конфигурационных файлах описывать данные, получаемые с каждого типа приборов (доступное адресное пространство, название тип данных по определённым адресам).
Можно сделать выпадающий список, при старте программа будет искать в папке "\devices" файлы ini, из них вытаскивать параметр "Name", и засовывать в ComboBox. Достаточно просто ini-файл с параметрами положить, и так подключаются новые устройства.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 23.07.2013 в 22:57:27

on 1374607045, jz wrote:
Можно сделать выпадающий список, при старте программа будет искать в папке "\devices" файлы ini, из них вытаскивать параметр "Name", и засовывать в ComboBox. Достаточно просто ini-файл с параметрами положить, и так подключаются новые устройства.

Ну примерно так оно и задумывается.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем bugmonster на 24.07.2013 в 00:37:21

on 1374607045, jz wrote:
Как я понял, большое преимущество XML перед INI - производителность при чтении Больших файлов. Т.е. 1Мб и т.д.
Если файл маленький, то INI лучше тем, что он проще по структуре, и понятнее обычным пользователям.  

Это стандартные виндовые функции ini медленные. Кому нужно используют нестандартные парсеры, которые и побыстрее xml могут быть. У xml тоже разное по скорости бывает, dom - медленное, sax - быстрое.

2Artem13: Если делать как следует и "для следующих поколений", то внешние конфиг-файлы, и выбор текущего в программе (да ещё и редактирование там же).
А если нужно чтобы работало и просто, то забей всё массивами прямо в исходниках.

По формату файлов: modbus не сложный, хватит и ini, и чтением виндовыми функциями (могу дать свой мегапарсер). Если нужны какие-то дополнительные навороты, думай про xml, google protocol и т.д.
Можно использовать boost::serialization, он вообще отвязан от типа файла, в котором сохраняет данные.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 24.07.2013 в 01:27:09

on 1374615441, bugmonster wrote:
По формату файлов: modbus не сложный, хватит и ini, и чтением виндовыми функциями (могу дать свой мегапарсер).

Да дело то не в протоколе как раз. В ини будет хранится данные по интерпретации полученных по этому самому протоколу данных. Для модбаса у меня уже нарисована собственная кривенькая библиотека.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jz на 24.07.2013 в 06:26:13

on 1374618429, Artem13 wrote:
Для модбаса у меня уже нарисована собственная кривенькая библиотека.
:o

http://libmodbus.org/documentation/
http://www.servotechnica.spb.ru/library/Modbus
http://www.cyberforum.ru/asutp/thread426227.html
http://www.codesys.ru/art3
http://sourceforge.net/projects/jamod/
http://sine.ni.com/devzone/cda/epd/p/id/4756
http://www.movicom.ru/ru/software/movidevlib.html

Наверное,уже все написано до нас. Эти ссылки, может некорректные, но наверняка в инете уже написано (особенно в американском). Бывает даже крутые вещи с GPL/GNU, на которые в России можно наплевать :-).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 24.07.2013 в 20:27:43
2jz: Для меня проще нарисовать свою, чем пытаться разобраться как работают чужие. Как правило, документёж у них слабоват для моего понимания.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.09.2013 в 08:02:23
Весь день думаю ЧЯДНТ.

WinApi с его LPWSTR текстами умеет работать с вещественными числами?

Абстрактно есть три поля "EDIT", программе надо из двух из них считать два вещественных числа, сложить их, и вывести в третье. Это возможно без бубна?

По непонятным мне причинам, с целыми числами всё работает, а с вещественными нет. Такое ощущение, что swscanf, wsprintf и им подобная ересь не знают о существовании %f, %e и %g.  :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.09.2013 в 08:22:56
А Винда вообще в курсе, что есть вещественные числа?

Консольный вариант уверенно читает целые числа, а при встрече с вещественным сразу же ноль.


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.09.2013 в 08:52:39
Как хорошо, что мне надо программировать под линукс.  ::)
Я просто офигеваю от винды.

Я честно не понимаю, почему вещественное число получается читать так:
std::cin >> b;

и не получается так:
scanf ("%g", &b);

Хотя с линуксом я годами обходился без первого варианта и всё читалось просто классно.  :o

А целые читаются и так и так.  ::)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.09.2013 в 10:46:39
Удалось пришить вещественные числа через std::wstringstream и ifstream, кажется, теперь всё работает. Чувствую себя верховным шаманом, который после 15 часов игры на бубне призвал тёмного духа, отлучённого от света за познание дробных чисел.

Если кто-то мне расскажет, почему у меня ничего не получилось нормальными методами (sprintf etc) -  я с удовольствием послушаю.  :)


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 08.09.2013 в 17:47:52
2Lion:
Наверное нужно пару базовых моментов прояснить сначала:
1. "виндовс" не знает, что такое вещественные числа. Если мы говорим о языке программирования С++ то в нем есть строго определенный набор типов данных. Что касается чисел - есть целые числа (int, int64) и числа с плавающей точкой (float,float64,double). Как я понимаю, вопрос касается чисел с плавающей точкой.
2. Поля Edit и консольные функции scanf,printf друг с другом не сочетаются. Или ты делаешь приложение визуальное (vcl,windows forms и т.п.) или консольное и тогда ты используешь функции ввода/вывода через потоки. Смешивать одно с другим конечно можно, но обычно получается не комильфо.
3. По объяснениям понять сложно. Если проблема как у тебя в коде - давай в студию кусок кода, который не работает. А так - понять сложно, в чем именно у тебя причина, поэтому мало кто сможет "рассказать почему не получилось"

Ну и собственно предположительный ответ: у меня все получается. Так что смотри скорее всего ошибки в своем коде:
[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 08.09.2013 в 21:27:40
Ну да. Лёва, ты бы хоть озвучил в чем на винде работать пытаешься.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.09.2013 в 22:19:15
2Korchy:
1. Бытие определяет сознание. Я в жизни с float и double работаю очень редко. Для меня они именно вещественные, потому что, когда я пишу для учёбы, у меня бывают числа:
целые:
INTEGER
вещественные:
REAL*4 и REAL*8
и комплексные:
COMPLEX*8 и COMPLEX*16

По аналогии со вторыми float и double в моём сознании оказываются вещественными.

А когда я на отдыхе, то я оказываюсь в весёлом мире целых чисел:
UINT8; INT8; UINT16; INT16; UINT32; INT32;

2) Понятно, но мне потоки визуально не нравились, как они в тексте программы выглядят. Я всегда писал scanf, printf, sprintf, sscanf... а тут плохо пошло.

3) Спасибо. Уже нашёл - мой косяк. Потерял буковку "l". Вот что получается, если за полтора года не встретить ни одного числа типа float или double. :shuffle:

Мне стыдно.

Зато что-то в первый раз написал с потоками, только  следующему разу всё-равно забуду.  :(

2Artem13: Microsoft Visual Studio 2010 Express

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 08.09.2013 в 23:44:00

on 1378667955, Lion wrote:
По аналогии со вторыми float и double в моём сознании оказываются вещественными.  

float ни разу не вещественное число. Никакой аналогии здесь быть не может.
Попробуй поскладывать/вычитать маленькие float, пять шесть нулей после запятой. Почувствуешь разницу :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 09.09.2013 в 01:39:55

on 1378673040, Korchy wrote:
Попробуй поскладывать/вычитать маленькие float, пять шесть нулей после запятой.
А не надо такие числа складывать/вычитать.

Есть мнение, что если надо вычитать два таких числа, то у автора неправильная система единиц.

Считается, что в идеале при вычислениях все числа должны быть порядка 1.
А если вы измеряете свой рост в а.е., то это плохо.  ::)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 09.09.2013 в 04:27:30
2Lion:  
on 1378679995, Lion wrote:
Есть мнение, что если надо вычитать два таких числа, то у автора неправильная система единиц.  
Это с каких таких пор? Например, нормированная матрица описывающая движение (ротация, трансляция и масштаб) состоит из реальных чисел <=1. При операциях с такой матрицей важна точность, скажем 10^-12, например при поиске инверсионной матрицы. На практике у меня доходило до того что C++-го double не хватало и у меня выходил другой результат чем у той же операции но в MATLABе.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 09.09.2013 в 05:57:04
2jarni:  

on 1378690050, jarni wrote:
Это с каких таких пор?
Про человеческий рост и а.е. в предыдущем посте, например.

Во-вторых, если уж вам так хочется  
on 1378690050, jarni wrote:
точность, скажем 10^-12, например при поиске инверсионной матрицы.
То можно использовать специальный аттач к Си, который позволяет получать любую точность. У меня так знакомый считал H-функцию Чандрасекара со 100 значащими цифрами. :nervous:

Могу узнать, чем он пользовался. Интернеты говорят о нескольких возможных вариантах.  ::)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем coolberg на 09.09.2013 в 06:59:25
Float на то и float, что он floating point. Неважно (практически), маленькое это число, или большое. Важно, каково соотношение между старшими и младшими порядками в записи этого числа. Мантисса float по IEEE754 имеет 23 бита, это даёт разброс значений между старшим и младшим битами в 2^23 ~ 9 000 000 раз.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 09.09.2013 в 07:11:01
2Lion:  
on 1378679995, Lion wrote:
А не надо такие числа складывать/вычитать.  

Это просто для наглядного примера. На самом деле складывая float 0.25 и 0.25 не всегда получишь 0.5.
А где это реально проявляется - банально движение объекта по экрану. Стандартынй твипс = 0.25 пиксела. Вот только при дельте движения в четверть пиксела через какое-то время объект начинает заметно глазу дрожать. Потому как float.


on 1378699165, coolberg wrote:
Важно, каково соотношение между старшими и младшими порядками в записи этого числа.  

Ну это если углубляться. Я всего-лишь хотел сказать что float нельзя приравнивать к вещественному числу.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 09.09.2013 в 07:21:58

on 1378699861, Korchy wrote:
Я всего-лишь хотел сказать что float нельзя приравнивать к вещественному числу.
Ну... Это модель вещественного числа, а модели всегда отражают реальность лишь в некотором приближении. А что такое реальность?

С достаточно большой точностью каждый из нас не существует.  ::)

[offtop]компьютеры не идеальны,
мир не справедлив,
мы ничего не знаем точно,
каждому из читающих этот пост может в следующую секунду с некоторой вероятностью преодолеть потенциальный барьер и оказаться на Луне....[/offtop]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 09.09.2013 в 07:47:10
[offtop]Хм, а я то думал, астрономия - точная наука ;D[/offtop]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем coolberg на 09.09.2013 в 08:01:36

on 1378699861, Korchy wrote:
Это просто для наглядного примера. На самом деле складывая float 0.25 и 0.25 не всегда получишь 0.5.  
Всегда.
А вот если инициировать переменную float sum = 0.f и в цикле делать sum += 0.25f - вот тут-то начиная с какой-то большой итерации и полезут ошибки.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 09.09.2013 в 08:03:57
2Korchy: [offtop]Это смотря в какой её части.  ;D

Кто-то бьётся ради каждой миллисикунды дуги и каждый сантиметр расстояния до Солнца...

А у кого-то точность в половину порядка считается достаточно хорошей. (А ошибка на порядок может считаться не такой уж серьёзной)

Так устроен мир.[/offtop]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 09.09.2013 в 20:36:39
2coolberg:
Собственно про цикл я и писал выше :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем coolberg на 10.09.2013 в 00:18:23
2Korchy: сорри :) Опять эта моя привычка читать одно предложение и сразу бросаться на клавиатуру ;D

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 22.11.2013 в 21:52:34
Други, вопрос по СОМ-порту - как можно проверить паритет принятой посылки? Если вообще можно.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.07.2014 в 02:26:58
Какая-то непонятная хрень сейчас произошла.
Моя прога, написанная на С++, перестала запускаться на рабочем компе. Экзешник не запускается принципиально, при попытке запустить из-под оболочки (Visual studio 2008 ) выдает: The program '[1640] inst_cycle.exe: Native' has exited with code -1073741823 (0xc0000001). Сразу, без перехода даже к первой строке кода.
Пикантность ситуации заключается в том, что на моем домашнем компе и даже на другом рабочем компе она запускается без проблем.
На всех трех компах стоит Win7 (на проблемном и домашнем 64 бит, на втором рабочем 32 бит), одна и та же ВижуалСтудия, памяти хватает. Я ничего не понимаю.
Думал, глюканул проект. Создал проект заново - не помогло.
Есть у кого идеи?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.07.2014 в 02:54:37
Щас, поподробнее.

Другую мою прогу запускаю на том же компе. Запускаю по F5, в отладочном режиме.
Мне Студия пишет:

Quote:
'Dosetest.exe': Loaded 'C:\Work\Visual Studio projects\MyProjects05\Dosetest\Debug\Dosetest.exe', Symbols loaded.
'Dosetest.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll'
'Dosetest.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll'
'Dosetest.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll'
'Dosetest.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\msvcp90d.dll', Symbols loaded.
'Dosetest.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\msvcr90d.dll', Symbols loaded.


Когда запускаю по F5 эту прогу, мне Студия пишет другое:

Quote:
'inst_cycle.exe': Loaded 'C:\Work\Visual Studio projects\MyProjects05\inst_cycle\Debug\inst_cycle.exe'
'inst_cycle.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll'
'inst_cycle.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll'
'inst_cycle.exe': Unloaded 'C:\Windows\SysWOW64\kernel32.dll'
The program '[5448] inst_cycle.exe: Native' has exited with code -1073741823 (0xc0000001).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 23.07.2014 в 04:28:09
2Ushwood: дык говорит жеж, что кернел не загружен. Есть ощущень, что система глюканула.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.07.2014 в 06:09:24
2Artem13: дык а почему он то загружен, то не загружен? С одного компа подряд запускал те две проги...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 23.07.2014 в 06:28:32
2Ushwood: Вариантов много:
1. Что-то попортилось в самой проге, ребилд может помочь.
2. Что-то попортилось в винде, может помочь обычный рестарт.
3. Недавно установился апдейт который что-то где-то попортил - откат до апдейта.
4. Антивирю что-то не нравится и он не позволяет программе запуститься.
5. Попробуй включить режим совместимости.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.07.2014 в 07:34:56
2jarni: ребилд не помог, недавно (т.е. между "только что работала" и "ой, не работает") ничего вообще не ставил, остальное завтра на работе попробую.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 23.07.2014 в 19:59:05
Я бы попробовал еще полную пересборку. Удали все временные файлы (obj, lnk и т.п.) и сделай полный ребилд (не запуск по f5, а Project - Rebild All)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.07.2014 в 21:11:37

on 1406134745, Korchy wrote:
Я бы попробовал еще полную пересборку. Удали все временные файлы (obj, lnk и т.п.) и сделай полный ребилд (не запуск по f5, а Project - Rebild All)
     
Это я еще вчера пробовал.

2jarni: будешь смеяться, но помогла банальная перезагрузка компа :). Т.е. да, система глюканула.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 23.07.2014 в 21:42:28

on 1406139097, Ushwood wrote:
будешь смеяться, но помогла банальная перезагрузка компа . Т.е. да, система глюканула.

Винда жеж ...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 23.07.2014 в 22:05:45
2Ushwood: :). Смеялся бы если бы не было так грустно. ЕМНИП у коллеги недавно была подобная проблема и он говорил что помог обычный рестарт системы, но перед этим пол дня пром*дохался пытаясь понять где же проблема.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 23.07.2014 в 23:15:27
Жжоте, господа.  ::)
Семь бед - один резет не шутка, а насущная необходимость. Перезагрузка системы конечно не панацея, но в случае винды должна стоять на первом месте.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 24.07.2014 в 05:00:19
2ПМ: Я сейчас второй день активно ковыряю исходники НО. VS 2010. Примерно в трети случаев проект не собирается из-за каких-то непонятных ошибок. Получив такое сообщение нажимаю на ту же самую команду сборки проекта. И, о чудо, проект собирается идеально.

Почему при сборе одних и тех же исходников они сначала не собрались, а через 20 секунд собрались - ума не приложу.  :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 24.07.2014 в 05:11:39
2Lion:
Кто разработчики VS?  :D

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 24.07.2014 в 05:20:11
2ПМ:  :D
В том то и проблема.
Можно, конечно, перевести сбор исходников на другое IDE, вот только кто этим будет заниматься?
Для учёбы/работы VS не использую, но там объёмы меньше и можно обходиться более простыми  средствами.
[offtop]Последнее общение с Borland C++ Builder тоже было не самое приятное. Но редактор для НО я модифицировал, а больше пока ничего не надо.[/offtop]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 24.07.2014 в 05:45:58

on 1406168411, Lion wrote:
Последнее общение с Borland C++ Builder тоже было не самое приятное.

Только из-за неправильных действий оператора. За 10 лет использования глюков самой ИДЕ не ловил. Начал с 4 версии, сейчас на 6.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 24.07.2014 в 08:22:43
2Artem13: Может быть. Может из-за того, что очень непривычен такой формат IDE, ибо работаю я с ним по 2 дня раз в два года.  :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 24.07.2014 в 08:55:24

on 1406169958, Artem13 wrote:
За 10 лет использования глюков самой ИДЕ не ловил

Поддерживаю, борландовский компилятор на удивление стабилен, по сравнению с микрософтовским.


on 1406167219, Lion wrote:
Почему при сборе одних и тех же исходников они сначала не собрались, а через 20 секунд собрались - ума не приложу

Исходники JA же портированы с C на С++. Отсюда растут ноги множества совершенно непонятных проблем.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 24.07.2014 в 20:51:55

on 1406181324, Korchy wrote:
борландовский компилятор на удивление стабилен
Пожалуй, я не совсем правильно выразился: сам процесс компиляции не вызывает нареканий, а вот процесс написания очень непривычен.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 24.07.2014 в 21:00:43

on 1406167219, Lion wrote:
Примерно в трети случаев проект не собирается из-за каких-то непонятных ошибок.

При определённых изменениях, особенно хидеров (.h), проблемы могут возникнуть из-за инкрементальной линковки. Лечится перекомпилацией всего проекта или его части. Тут нужно выбрать или скорость, или безглючность.


on 1406181324, Korchy wrote:
Исходники JA же портированы с C на С++. Отсюда растут ноги множества совершенно непонятных проблем.

Нет там никаких проблем. Исходники написаны практически целиком на С. А перевод компиляции на более строгие правила С++ наоборот позволил выявить некоторые ошибки.


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 24.07.2014 в 21:22:16

on 1406224843, Терапевт wrote:
Нет там никаких проблем

Тут тебе виднее. Я с исходниками JA имел дела очень мало. Но сталкивался с подобным при переводе других проектов с С на С++.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 12.08.2014 в 20:55:35
Продолжаю запрос из Рабочих вопросов :)
Кто имел дело с программированием мобильных устройств. Желательно планшетов. Что использовали? а то подозреваю, что мой любимый ВСВ6 на Вин8 не запустится вовсе :) Пиратить VS не хочется, покупать -  дорого (теоретически, но надо уточнять). Осваивать его почти с 0.
Есть вариант перейти на Qt, но его преимущества ограничиваются бесплатностью и кроссплатформенностью. И осваивать также почти с 0.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 12.08.2014 в 21:56:51

on 1407866135, Artem13 wrote:
мой любимый ВСВ6 на Вин8 не запустится вовсе  

По слухам он вполне нормально работает и на 7, и на 8, если ставился с корректного дистрибутива.
А планшет на Win8 от полноценного компьютера отличается только размером.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 13.08.2014 в 17:19:19
На Win7 уже имею с ним проблемы, корректно не запускается в отладочном режиме приложение для работы с базами через odbc. Обхожусь установкой виртуалки с ХР и с билдером уже на ней. На вин-8 скорее всего будет еще хуже.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 14.08.2014 в 20:50:14
В общем, с доступностью и ценой Вин-планшетов все плохо. Но это как начальство решит.
Поэтому вопрос программирования под андроид пока актуален. Но поскольку я вспомнил про Qt, то само программирование уже не проблемно. Возникает вопрос программирования USB под Линукс/Андроид. Есть тут кто занимался? Ну или посоветуйте адекватный русскоязычный ресурс (чтени по-аглицки меня сильно напрягает и хватает меня ненадолго :( ).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 18.04.2015 в 01:06:56
Народ, а тут кто-нибудь программирует с использованием OpenMP? А то я сейчас его осваиваю, по одному вопросу пребываю в недоумении, а спросить не у кого.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 18.04.2015 в 01:11:19
2Ushwood: Увы, я нет.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 18.04.2015 в 03:57:24
Пока суд да дело, возник вопрос просто по Visual studio.

Где сидит настройка компилятора, которая определяет, вычисляется логическое выражение до конца или до получения результата? И как оно по умолчанию?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 18.04.2015 в 04:01:33
Такой настройки нету потому что это поведение не настраивается, оно определено стандартом. ИЛИ вычисляется до первого ПРАВДА, И до первого ЛОЖНО.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 18.04.2015 в 04:58:34
Спасибо.

Хм... то, что такой настройки нет, вызывает недоумение, но существующий вариант в большинстве случаев подходит :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 18.04.2015 в 05:09:43
То что такой настройки нет это большое счастье иначе на данную конструкцию невозможно бы было положиться и она бы потеряла весь смысл своего существования. Только представь себе, ты написал код
if (ptr && ptr->checksomething())
надеясь что второе выражение не будет исполнено если указатель нулевой, а кто-то взял и включил настройку которая заставляет исполнится оба выражения в обязательном порядке. Думаю что из данного примера становится очевидно что такая настройка уничтожила бы детерминизм, саму основу программирования.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 18.04.2015 в 06:53:58
2Ushwood:

on 1429322314, Ushwood wrote:
Хм... то, что такой настройки нет, вызывает недоумение, но существующий вариант в большинстве случаев подходит

А приведи вариант, в котором он не подходит? ;)

На самом деле все, мне кажется, проще: когда пишется условие - единственное, что нужно, это знать выполняется оно или нет. И чисто математически если часть условия И уже равна false (т.е. не выполняется) то и все условие целиком будет false. Тоже самое с ИЛИ.
На этом просто экономятся вычислительные мощности. Если ты пишешь что-то вроде
if(func1()&&func2()&&func3())
и вычисление каждой из этих функций занимает по 3 часа - логично потратив первые 3 часа на вычисление первой из них, если она однозначно указывает, что все условие не выполняется - не тратить еще 6, а сразу выйти.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 18.04.2015 в 07:13:17
2Korchy: представь себе, что в приведенном тобой примере эти func1() и прочие делают еще что-то, помимо собственно вычисления результатов функции. И тебе нужно не только значение логической конструкции, но и сопутствующие изменения других каких-то переменных.
У меня один раз был такой случай. Давно, когда я еще на Паскале программировал. Тогда я этим вопросом и озаботился... и там как раз эту вещь можно было настраивать. Потому-то я и удивился, что ее нельзя настраивать здесь.
Сейчас у меня не такой случай, а как раз ближе к тому, который выше привел Ярни, и именно поэтому, памятуя о своих прошлых приключениях с Паскалем, я задал здесь этот вопрос - чисто на всякий пожарный.

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

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 18.04.2015 в 07:40:40
2Ushwood: в случае если тебе надо выполнить независимые операции то ты не имеешь права использовать данную конструкцию, она сделана исключительно для того чтобы выполнять следующую операцию в зависимости от результата выполнения предыдущей. считай это ограничением языка на котором тебе приходится писать, увы.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 18.04.2015 в 08:12:35
2Ushwood:
Не могу на вскидку придумать пример, но вот как-то так:

int a = 2;
if(func1()&&func2()) return false;
else return true;

bool func2() {
if(a<3) {
a = 10;
return true;
}
else return false;
}

bool func1() {
if(a<5) return false;
else return true;
}

что должно вернуться в итоге при твоем подходе?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 18.04.2015 в 08:27:46

on 1429322983, jarni wrote:
То что такой настройки нет это большое счастье иначе на данную конструкцию невозможно бы было положиться

В интерпретируемых языках на неё и нельзя без проверки полагаться. Не знаю, как в современных скриптовых, но в старых MS VB6/VBA/VBS, с которыми мне порой до сих пор приходится иметь дело, логическое условие выполняется целиком, что доставляет массу практических неудобств.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 18.04.2015 в 08:28:50
2Korchy: зачем придумывать заведомо парадоксальные конструкции? Такое, естественно, никто писать не будет.
Функция func2 может содержать какое-нибудь безобидное b++, которое в силу каких-то причин должно выполняться именно в функции func2.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 18.04.2015 в 09:21:15
2Ushwood:
Мой парадоксальный пример должен был сказать - "не надо стрелять себе в ногу". Собственно он иллюстрирует слова Ярни о том, что нельзя смешивать логику выполнения  
on 1429330397, Ushwood wrote:
еще что-то, помимо собственно вычисления результатов функции

и собственно вычисления условия. Если в результате твоего безобидного b++ функция, которую ты уже просчитал будет возвращать не то значение, которое было до инкремента b, ты получишь тот же самый парадокс. Такие вещи не должны смешиваться иначе рано или поздно мой пример окажется очень реальным :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 18.04.2015 в 09:26:37
2Терапевт: Я, честно говоря, при упоминании Visual Studio автоматически подумал о С++ и из этого исходил, указывая что поведение описано в стандарте. С другими языками мне приходилось сталкиваться мало и все они в идеологии исходили из с/с++.

2Ushwood:  
on 1429334930, Ushwood wrote:
Такое, естественно, никто писать не будет.  
Ты был бы сильно удивлён... :) Мне тоже как-то удалось написать конструкцию напоминающую каконическую
int x = 7;
x = ++x + x++;
Пример Korchy вполне реально написать если не знать всего что делают функции (побочные эффекты о которых ниже), что есть нормально при использовании библиотечных функций.


on 1429334930, Ushwood wrote:
Функция func2 может содержать какое-нибудь безобидное b++
Правила хорошего тона говорят что функция не должна иметь побочных эффектов, то есть, если есть функция которая выполняет b++ а также возвращает bool результат которого от b++ не зависит то код должен быть разделён на две функции. Понятно что в жизни это не всегда так, но тогда и конструкции надо подбирать соответсвующие, исходя из знания тела вызываемых функий.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 07.04.2016 в 09:11:58
Народ, нарвался на задачку, придумать решение которой не могу.
Есть переменной длины (1000 +/- 5%) набор отсчетов. Нужно визуализировать его в жестко заданной сетке 300х600 пикселей с неизвестным заранее масштабом. Если ординату я могу отнормировать, то как это дело уложить по абсциссе - не представляю :( Проблема в том, что я не могу сделать плавающий предел, как и как-то изменить (отсечь или аппроксимировать) длину выборки (масштаб по абсциссе задан начальным и конечным значением). Единственное, что придумалось - проредить массив. Но я не могу придумать алгоритм, позволяющий это сделать при переменной его длине, да еще и так, чтобы он составил конкретную конечную длину (500-600).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 07.04.2016 в 09:36:24
Если измерения идут с фиксированным интервалом тогда все ок, иначе будут дыры.
1. Считаешь масштаб, скажем, 1079 измерений от 5 до 14 секунды на 600 пикселей. Это 15 мс на пиксель.
2. В цикле с 15 мс шагом ищешь ближайшее измерение к данному времени, то есть ближайшее к t из интервала [t-dt/2, t+dt/2], где dt = 15, t это актуальное время в цикле.
3. Если нету никого близко тогда данный столбец останется пустым.

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

Кажется простым, но это может быть потому что я не на 100% понял задание. Может на бумаге нарисуешь что есть и чего хочешь достичь?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 07.04.2016 в 10:16:04
2jarni: Ага, уловил. Что-то подобное крутилось в голове, но вот так алгоритмизировать не сумел. Вроде похоже на правду. Единственное - там масштаб абсцисс опосредованный, т.е. отсчёты берутся с постоянным ВРЕМЕННЫМ шагом, а масштаб - ток :) Т.е. известны начальный и конечный токи и характеристика его изменения между, но нет однозначного соответствия отсчитываемым значениям. Но попробую твой алгоритм применить к индексам исходного массива.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 28.09.2016 в 09:49:43
I need help!!! Вернулся из "отпуска". Во время моего отсутствия винда (10) обновилась. Теперь Билдер 6 отказывается собирать проект - Linker Fatal Error Unable to open file VCLX.L  Кто знает, что с этим делать? Переустановка BCB6 не помогла :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 28.09.2016 в 10:25:39
Я даже с 7 виндой не смог шестой билдер корректно подружить. Выхожу из положения так - скачал vmware, поставил туда XP, расшарил папку с проектами и подключил ее в XP как диск, с которого и беру проекты в билдере. Единственный затык - достаточно медленное обращение по сети, тестировать живые сетевые проекты не особо удобно.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 28.09.2016 в 10:43:28
2Korchy: Не знаю, как сетевые сокеты и прочая фиговень - не работал, а с десктопными приложениями траблов не было и тут такой вот закидон. Напиться с горя, чтоли :( Давно надо было на Qt  перейти, да все лень было :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 28.09.2016 в 11:36:45
Да, как раз с сетью у меня и были проблемы, и вот через такой костыль с виртуалкой их удалось худо-бедно решить.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 28.09.2016 в 13:24:49
Всё оказалось проще - какой-то левый мусор в файле проекта. Почистил файло ручками - все заработало.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 24.02.2017 в 15:41:48
Комрады, хочу проконсультироваться.
Я тут озаботился производительностью одной из своих программ. Прогнал ее через встроенный профилятор VS2015 и получил несколько озадачивших меня результатов. Оказалось, узкие места моей программы совсем не там, где я предполагал.
Вот один пример.
[attach]
Прям так и хочется спросить: какого черта?
В строке 1069 всего одна операция умножения двух величин типа double. В строке 1067 одна операция умножения инта на дабл и одна операция сравнения. Почему первая занимает 2.2% времени, а вторая меньше 0.1% (иначе профайлер мне бы ее подсветил)?
Строка 1068 понятна, только если сравнивать со строкой 1069, - все-таки там два сложения, одно деление и одно умножение (sqr у меня оформлен как директива #define sqr(x) ((x)*(x)) ). А строка 1072 непонятна вообще. Там всего лишь сравнение двух даблов и проверка двух булевских условий (одно - глобальная контанта, второе - параметр), причем первое условие выполняется крайне редко, в 0.07% случаев.
Может кто-нить пояснить, что именно я не понимаю, а главное - как это можно вылечить?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 24.02.2017 в 15:55:21
Добавлю еще: чуть ниже по ходу этой функции идет вот такая строка:
if (bond_flag && bond_potential_flag && r2 > diam2*sqr(rrectmax))
           return 0;
Здесь первые две - булевские константы, равные 1, а в конце проверка условия с двумя умножениями. Так вот, она "весит" 3.6% против 7.1% у строки 1072. Никаких ветвлений между этими строками нет, return в строке 1073 почти никогда не выполняется...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 25.02.2017 в 14:27:05

on 1487940108, Ushwood wrote:
Прям так и хочется спросить: какого черта?

Для ответа на этот вопрос надо смотреть, какой там получается ассемблерный код, как распараллеливаются инструкции конвеера. Операции с плавающей точкой очень ресурсоёмки в плане тактов процессора.


on 1487940921, Ushwood wrote:
Так вот, она "весит" 3.6% против 7.1% у строки 1072.  

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

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 25.02.2017 в 15:22:16

on 1488022025, Терапевт wrote:
В данном случае, возможно, имеет смысл для строки 1072 сравнение убрать в конец условия, чтобы сначала срабатывали простые логические проверки. Такие условия вычисляются не целиком, а до того момента, когда уже однозначно можно судить о результате.  
это-то я знаю. Но r2<diamcore дает true всего в 0.07% случаев (в том конкретном расчете), параметр hardcount - в 50% случаев, а hardcoreflag - константа, которая всегда равна 1. Я потому и поставил на первое место самое редко выполняющееся условие.


on 1488022025, Терапевт wrote:
Операции с плавающей точкой очень ресурсоёмки в плане тактов процессора.  
Это понятно, и я бы не задавал вопросов, будь в строке 1067 произведение двух интов. Но там же инт на дабл - неужели это в несколько десятков раз производительнее, чем дабл на дабл?


on 1488022025, Терапевт wrote:
Для ответа на этот вопрос надо смотреть, какой там получается ассемблерный код, как распараллеливаются инструкции конвеера.
Это вообще реально сделать? Тут я полный чайник :(.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 25.02.2017 в 16:40:55

on 1488025336, Ushwood wrote:
это-то я знаю. Но r2<diamcore дает true всего в 0.07% случаев (в том конкретном расчете), параметр hardcount - в 50% случаев

Извини, но не знаешь. :)
Если ты поставишь на первое место проверку hardcount, то в 50% случаев до r2<diamcore дело вообще не дойдёт. А ты постоянно первым делом оцениваешь r2<diamcore, что по ресурсоёмкости намного больше простенькой проверки hardcount.


on 1488025336, Ushwood wrote:
Но там же инт на дабл - неужели это в несколько десятков раз производительнее, чем дабл на дабл?

Думаю, что в зависимости от точности результата раза в 2-3. Чтобы сказать точнее, нужно поднимать справочную информацию.


on 1488025336, Ushwood wrote:
Это вообще реально сделать?

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

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 25.02.2017 в 17:32:55

on 1488030055, Терапевт wrote:
Например, можно в отладчике посмотреть. Только это тебе мало что даст, без изучения ассемблера и правил оптимизации для распараллеливания команд.  
Ясно. То есть для меня сейчас тупик.


on 1488030055, Терапевт wrote:
Извини, но не знаешь. :)
Если ты поставишь на первое место проверку hardcount, то в 50% случаев до r2<diamcore дело вообще не дойдёт. А ты постоянно первым делом оцениваешь r2<diamcore, что по ресурсоёмкости намного больше простенькой проверки hardcount.
Это я сейчас решил проверить, не откладывая в долгий ящик. И... о сколько нам открытий чудных... ::)

Сделал в каждом из двух вариантов по три тестовых пуска, чтобы нивелировать флуктуации. Привожу для каждого из вариантов результаты, сооветствующие промежуточному общему времени выполнения.
http://i91.fastpic.ru/big/2017/0225/db/39179eddd67d8767f87cac911c5b51db.jpg

http://i90.fastpic.ru/big/2017/0225/67/1cfb5d47108a0362280ea8763e657867.jpg

Ты был прав, второй вариант посчитался быстрее. Среднее время выполнения тестовой задачи 11.5 с против 11.9 с. Но смотри, какую хрень выдает профайлер. Во втором случае на эту самую строку выпадает куда большая доля нагрузки, зато куда меньшая приходится на две предыдущие строки, которые вообще не менялись.
Нагрузка на саму функцию u в обоих вариантах одна и та же, ~50% от общего времени работы программы.
Начинаю подозревать, что профайлер глючит... :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 25.02.2017 в 18:02:50

on 1488033175, Ushwood wrote:
То есть для меня сейчас тупик.

Компиляторы этой фигнёй уже давно сами занимаются. Да и процессоры последовательность выполнения команд тоже умеют сами менять. Не заморачивайся.


on 1488033175, Ushwood wrote:
Начинаю подозревать, что профайлер глючит...  

Вполне возможно. Я вообще не представляю, как это можно оценивать в скомпилированном машинном коде, не засирая код дополнительным кодом. Если код интерпретируемый, как у большинства современных сред, то тогда такая оценка возможна.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 25.02.2017 в 18:06:46
2Терапевт: в любом случае спасибо за помощь :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 25.02.2017 в 18:41:29
2Ushwood:
Эх, сто лет уже не касался си, не помню уже ничего...
В первую очередь то, что сильно бросается в глаза - у тебя там куча обращений ко внешним и глобальным переменным. Если просто оставить в стороне аксиому, что глобальные переменные - зло, попробуй ради эксперимента передать их хотя бы указателями в тестируемую функцию. Возможно какое-то количество ресурсов тратится на проверки областей видимости и копание в куче тупо при обращении к глобалкам.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 25.02.2017 в 18:52:39
2Korchy: во, кстати. Много раз слышу в разных вариациях, что глобальные переменные - зло, но не разу не видел внятного объяснения, почему. Может, ты просветишь?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 25.02.2017 в 19:14:07

on 1488037959, Ushwood wrote:
Много раз слышу в разных вариациях, что глобальные переменные - зло, но не разу не видел внятного объяснения, почему.

Только с точки зрения читаемости, общей архитектуры программы и контроля содержимого этих переменных.


on 1488037289, Korchy wrote:
Возможно какое-то количество ресурсов тратится на проверки областей видимости и копание в куче тупо при обращении к глобалкам.

Проверка области видимости существует только в рамках логики языка. После компиляции никаких проверок на это нет. Под глобальные переменные память, как правило, выделяется не из кучи (стека), а просто в области данных.


on 1488037289, Korchy wrote:
попробуй ради эксперимента передать их хотя бы указателями в тестируемую функцию.

При этом производительность упадёт, хотя и незначительно (или всёже заметно, если функция вызывается очень часто). Будет тратиться дополнительное время на загон в стек всех переменных функции или указателей на них.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 25.02.2017 в 19:17:28

on 1488039247, Терапевт wrote:
При этом производительность упадёт, хотя и незначительно (или всёже заметно, если функция вызывается очень часто). Будет тратиться дополнительное время на загон в стек всех переменных функции или указателей на них.  
Вот, собственно, из этих соображений я и предпочитаю передавать в функцию в виде параметров только минимально необходимый набор переменных...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 25.02.2017 в 19:25:51

on 1488039247, Терапевт wrote:
Проверка области видимости существует только в рамках логики языка. После компиляции никаких проверок на это нет. Под глобальные переменные память, как правило, выделяется не из кучи (стека), а просто в области данных.

Вполне возможно. Наверное уже все позабыл. Прям Дмитрием себя чувствую иногда :)
Но я бы все-таки попробовал бы ради эксперимента.


on 1488037959, Ushwood wrote:
внятного объяснения, почему

Потому, что ты никогда в точке обращения к глобальной переменной не знаешь точно, чему она равна. Потому как ты не знаешь, кто, где и когда ее поменял.
Грубо говоря, назначив глобальную переменную int a = 4. Ты периодически вполне можешь недоумевать, почему где-то в коде условие if(a==4) return true; else return false; упорно возвращает false. И долго и с матюками отыскивать в коде место, где же все-таки меняется значение переменной а.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 25.02.2017 в 19:36:41
По реке плывет баржа из села Кукуева
А у нас в селе живут программисты Зуевы

гы...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Round Owl на 18.05.2017 в 22:33:59
Понадобилось тут переписать небольшой кусок опенсорсного кода на С++, а потом собрать приложение обратно. У меня была установлена Visual Studio 2015 Community, обновил до VS 2017. Поставил Windows SDK, поставил (с бубном) DirectX SDK, всё равно возникают какие-то ошибки. Раньше собирал всё в MinGW и был счастлив. А как вы компилите свой код?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 21.03.2018 в 16:27:25
Возникла тут дурацкая проблема.
У меня сишная программа, работающая с методом Монте-Карло, соответственно много-много-много раз вызывается генератор случайных чисел. И вот я заметил, что через какое-то время работы программа начинает повторяться, т.е. выводить в точности те результаты, которые уже выводила ...надцать минут назад. Т.е. генератор зациклился и пошел выдавать то же самое. Как с этим бороться?

Я испробовал очевидный способ - через сколько-то минут переинициализировать генератор через srand(time(NULL)), но это не помогло.

Работаю в Visual Studio 2015, если это имеет значение.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Strax5 на 21.03.2018 в 16:44:22
2Ushwood: http://www.fourmilab.ch/hotbits/ - теперь и с полонием!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 21.03.2018 в 16:54:40
2Strax5: выглядит симпатично, но, если я правильно понял их английский, я не генерирую случайные числа у себя, а посылаю тем ребятам запрос на какое-то их количество.
Тут есть маленькая загвоздка: если мне нужно для каждого расчета несколько миллиардов или десятков миллиардов случайных чисел (я не шутил про "много-много-много раз"), у меня тупо будет проблема и с местом на винте для их хранения, со скачиванием этого массива и с производительностью программы.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем pipetz на 21.03.2018 в 18:44:42

on 1521638845, Ushwood wrote:
Т.е. генератор зациклился и пошел выдавать то же самое. Как с этим бороться?  

Может вызывать srand(time(NULL)) перед каждым вызовом rand()?
Одним, словом надо какой-то источник энтропии подмешивать, если тебя не устраивает длинна периода ГПСЧ.
Или как вариант использовать в качестве "случайных" чисел последовательность знаков
какого-либо
трансцендентного числа, которая заведомо не периодична.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 21.03.2018 в 18:57:30

on 1521647082, pipetz wrote:
Может вызывать srand(time(NULL)) перед каждым вызовом rand()?  
Так делать нельзя. Системное время не успеет сдвинуться, и новая инициализация будет тем же числом, что и предыдущая. Переинициализировать надо спустя какое-то время.

ЗЫ. Наткнулся на прелюбопытную ссылку, сейчас ее перевариваю: http://en.cppreference.com/w/cpp/numeric/random
Возможно, это то, что мне надо...
Там упоминается Mersenne Twister - я когда-то читал про него, это очень хороший алгоритм генерации псевдослучайных чисел.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 21.03.2018 в 20:25:31

on 1521647850, Ushwood wrote:
Так делать нельзя. Системное время не успеет сдвинуться, и новая инициализация будет тем же числом, что и предыдущая. Переинициализировать надо спустя какое-то время.

Так делать нельзя потому что будет ухудшена случайность распределения.
Как оно работает:
https://pdfs.semanticscholar.org/6b0d/a7c081d9388f304bf6499db373b8d838bb53.pdf
А вот по этой ссылке как с этим жить можно жить на Windows
https://msdn.microsoft.com/en-us/library/bb982398.aspx

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 21.03.2018 в 22:32:38

on 1521653131, Zed wrote:
А вот по этой ссылке как с этим жить можно жить на Windows  
Ага, это аналогично тому, на что ссылку я привел выше. И я уже проверил, это работает. Спасибо :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем pipetz на 21.03.2018 в 22:51:40

on 1521647850, Ushwood wrote:
Системное время не успеет сдвинуться

Ну это тебе виднее, конечно, успеет у тебя сдвинуться или нет.


on 1521653131, Zed wrote:
Так делать нельзя потому что будет ухудшена случайность распределения.  

Зато последовательность будет с большой долей вероятности апериодична.
Человек жалуется на короткий период.

Ну, а если там есть некий класс который использует шум вентилятора, для генерации случайных чисел
то это лучше всего, спорить не буду.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 14.05.2018 в 16:45:57

on 1521653131, Zed wrote:
А вот по этой ссылке как с этим жить можно жить на Windows
https://msdn.microsoft.com/en-us/library/bb982398.aspx
     
А есть ли какие-нибудь идеи, как с этим можно жить на Линуксе?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 15.05.2018 в 11:39:32
2Ushwood:
а есть какая то проблема? Где затык то получился?
А так вызывай http://man7.org/linux/man-pages/man2/getrandom.2.html
и радуйся жизни.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 20.05.2018 в 14:42:19
2Zed: извиняй, что долго не отвечал, просто как-то внезапно стало не до этого.


on 1526373572, Zed wrote:
а есть какая то проблема? Где затык то получился?  
Проблема в том, что то решение, похоже, сугубо для ВижуалСтудии, и при попытке скомпилировать его на линуксе компилятор пишет, что знать не знает такого зверя, как random_device, ну и всех последующих.


on 1526373572, Zed wrote:
А так вызывай http://man7.org/linux/man-pages/man2/getrandom.2.html
и радуйся жизни.  
Это я пока не делал,. потому что см. начало поста. Как сделаю, отпишусь, что такое хорошо и что такое плохо.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 14.02.2019 в 18:59:54
Камрады, помогите, пожалуйста, разобраться с проблемой.

Есть вот такой код:

Code:
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>

const int mapsize = 8127;
const int maxboxes1type = 2000000;  // max number of matrix boxes of certain type

FILE *in;
int i, j, k;
float *map1aa, *map10, *map1ii, *map1ai, *map1aaai, *map1iiai, *map1aaiiai, *map1h;
int aig[2][mapsize][2], aing[2][mapsize][2];  // 1st index - for different activity thresholds, 3rd - inactive(0)/active(1)
double expr[mapsize];  // sum expression level of all genes in the segment.
double exprnongene[10][mapsize]; // sum expression level of all nongenes in the segment, divided into types.
double cntnum_actinact[2][mapsize][5];  // in 2nd index: 1st field - total length of active genes in the bin, 2nd - of inactive genes, 3rd - of active NONgenes, 4th - of inactive NONgenes, 5th - of empty space
double distr_cnt_type[7][maxboxes1type]; // 1st index: aa, ii, 00, ai, a0, i0, complex

void init()
{
     map10 = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1aa = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1ii = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1ai = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1aaai = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1iiai = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1aaiiai = (float*)malloc(mapsize * mapsize * sizeof(float));
     map1h = (float*)malloc(mapsize * mapsize * sizeof(float));
     for (i = 0; i < 2; i++) for (j = 0; j < mapsize; j++) for (k = 0; k < 2; k++) aig[i][j][k] = aing[i][j][k] = 0;
     for (j = 0; j < mapsize; j++) expr[j] = 0;
     for (j = 0; j < mapsize; j++) for (k = 0; k<10; k++) exprnongene[k][j] = 0;
     for (j = 0; j < mapsize; j++) for (k = 0; k < mapsize; k++) {
           *(map10 + j*mapsize + k) = *(map1aa + j*mapsize + k) = -1;
           *(map1ii + j*mapsize + k) = *(map1ai + j*mapsize + k) = -1;
           *(map1aaai + j*mapsize + k) = *(map1iiai + j*mapsize + k) = -1;
           *(map1aaiiai + j*mapsize + k) = *(map1h + j*mapsize + k) = -1;
     }
     for (i = 0; i < mapsize; i++) for (j = 0; j < 5; j++) cntnum_actinact[0][i][j] = cntnum_actinact[1][i][j] = 0;
     for (i = 0; i < maxboxes1type; i++) for (j = 0; j < 7; j++) distr_cnt_type[j][i] = -1;
}

int main()
{
     init();
     free(map10);
     free(map1aa);
     free(map1ii);
     free(map1ai);
     free(map1aaai);
     free(map1iiai);
     free(map1aaiiai);
     free(map1h);
}


Это небольшой фрагмент моей прграммы (только инициализатор переменных). Прога работала при сравнительно небольших значениях mapsize (около 1000), но с 8000 она вылетает. На 36 строке, вот этой:
*(map1aaai + j*mapsize + k) = *(map1iiai + j*mapsize + k) = -1;
с диагнозом "access violation writing location".

Я понимаю, что это какие-то проблемы с памятью, но впервые сталкиваюсь именно с таким их проявлением. Обычно прога либо на стадии компиляции выдает ошибку, что я слишком много памяти прошу, либо вылетает на входе в какую-нибудь функцию со словами "stack overflow".

Подскажите, пожалуйста, что конкретно ей не нравится и как с этим можно бороться.
Уменьшить mapsize не вариант, т.е. задача - не уменьшить количество потребляемой памяти (я и так его уменьшил, заменив double на float), а убедить прогу выполняться вот с таким, какое есть.

Работаю в Visual Studio 2015.

ЗЫ. В первоначальной версии программы все вот эти map1... были двумерными массивами, но там было ровно то же самое: прога компилируется, потом вылетает с этим же диагнозом. Я переписал на указатели в надежде, что поможет, - не помогло.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.02.2019 в 19:04:29
Или компилируй как х64, или попробуй включить LARGE_ADDRESS_AWARE в настройках линкера (или компилятора, не помню). Ты создал массивов на больше чем 2ГБ, без LARGE_ADDRESS_AWARE ты можешь обращаться как раз к адресам до двух ГБ.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 14.02.2019 в 19:47:38
2jarni: скомпилировал как х64 - по крайней мере, вот этот тестовый кусочек прошел не пикнув.
Ларчик, как выяснилось, просто открывался.
Спасибо!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Psyho на 21.02.2019 в 23:41:44
2Ushwood: Ты жесток. Используй механизм отображения памяти в файл. А то чую при твоих запросах тебе никакой памяти не хватит. Ибо задачи имеют свойство расширяться :-)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 23.02.2019 в 17:07:58

on 1550781704, Psyho wrote:
Ты жесток. Используй механизм отображения памяти в файл
Ну я примерно так и делаю, когда размер mapsize переваливает за 10-20 тысяч :). Но это очень негативно сказывается на быстродействии (не могу себе позволить работать полностью на SSD), поэтому если есть возможность этого не делать, стараюсь не делать.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 18:40:13
Сел говнокодить редактор IMP, и возник вопрос.
Там в структуре мерка MERCPROFILESTRUCT имя и ник мерка объявлены как
     UINT16      zName[ NAME_LENGTH ];
     UINT16      zNickname[ NICKNAME_LENGTH ];
то бишь как массивы из unsigned short 16 бит.
Как эту хрень красиво в текст гонять и обратно?
Вроде бы псевдоюникод, но в лоб не хочет.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 18:43:29
2ПМ: А что там на самом деле? Если таки юникод, то просто reinterpret_cast используй. Если нет, то напиши 2 функции для конвертации туда/обратно.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 18:55:42
2jarni:
typedef unsigned short UINT16;

on 1560526813, ПМ wrote:
то бишь как массивы из unsigned short 16 бит.  

Гонять надо в строку юникода (поле визуального компонента), и обратно.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 18:58:11
2ПМ: Не, это я понял. Но что там в этих двух байтах, если не юникод? Не вин1251 ведь.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 19:13:04
2jarni:

Младший байт - символ, старший 00.

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 20:01:51
2ПМ: Ну, с английскими буквами всё понятно. В памяти лежит как LittleEndian, младшый байт занят. А какие ещё туда символы будут записываться? Русские? Если да, то WIN-1251? То есть так и останеться один байт занят?

Если да, то проще всего схлопывать из двух байт в один, а потом пользоваться MultiByteToWideChar\WideCharToMultiByte. Здесь хороший пример: https://www.chilkatsoft.com/p/p_348.asp . Только вместо CP_UTF8, использовать CP_ACP или прямо 1251.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 14.06.2019 в 20:29:20
2jarni:

О!!! Здрав будь, мОлодец!!!

А с обработкой анимаций поможешь ли? Кой-чо автоматизировать? Все доки доступны, и на аглицком.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 20:30:41

on 1560531711, jarni wrote:
схлопывать из двух байт в один

Как именно, и как потом загонять обратно именно в unsigned short?

В примере работа с кодировками строк, а у меня одна половинка именно что не строка.
Как мне эту "не строку" перевести в строковый тип?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 20:31:40
2Bonarienz:  
on 1560533360, Bonarienz wrote:
А с обработкой анимаций поможешь ли?
Разве что советом. Я свою часть в ОП-2.1 никак "доделать" не могу, летняя лень пришла.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 20:48:43
2jarni:
Я тормоз. А что я зациклился на оригинальном типе данных? Я же к игре не привязан. Мне главное размерность соблюсти.
Меняю прямо в структуре UINT16 на wchar_t, и все... :idea:


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 20:49:11

on 1560533441, ПМ wrote:
Как именно, и как потом загонять обратно именно в unsigned short?
Ну вот так например:


Code:
//! ensure that src length <= dst length in items, not bytes
void pack(const uint16_t* src, char* dst)
{
     while (*src)
           *dst++ = (char)(*src++);
     *dst = 0;
}

//! ensure that src length <= dst length in items, not bytes
void unpack(const char* src, uint16_t* dst)
{
     while (*src)
           *dst++ = (uint16_t)(*src++);
     *dst = 0;
}


Ну или если не брезгуешь лямбдами и STL функциями то так:

Code:
//! uint16_t -> char
std::transform(src, src + strlen(src), dst, [](uint16_t c) -> char { return (char)c; });
//! char -> uint16_t
std::transform(src, src + strlen(src), dst, [](char c) -> uint16_t { return (uint16_t)c; });

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 14.06.2019 в 20:58:05
2ПМ:

Ибо нефих с дитями шалить, кады кодишь!!!

2jarni:

Что такое "ОП-2.1"?

Речь о java-скриптах или приблудах на Си к фотожопе. Все алгоритмы есть, некоторые неполны, и без спец-модулей не работают - например, обводка только слева черной линией в пиксел контрастного изображения. Как делать ясно, но вот штатных струментофф не хватает, а рук и времени - жалко...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 20:59:06
2ПМ:  
on 1560534523, ПМ wrote:
и все...
Только при условии что там именно юникод и сохранялся.

Потому что "джа" в юникоде это "\u0434\u0436\u0430", а в UTF-8 это "d0b4 d0b6 d0b0", те же 3 раза по 2 байта, но контент разный.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 14.06.2019 в 21:01:58
2jarni:
Русский текст корректно грузится/сохраняется, и в игре отображается правильно - а мне больше ничего и не надо. Так что это реально эмуляция юникода.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 21:02:07
2Bonarienz:  
on 1560535085, Bonarienz wrote:
а рук и времени - жалко...
А моих рук и времени значиццо не жалко ;D

Я в жаба-скрипте только самые примитивные вещи делать могу. На С лучше, конечно. Ты конкретный пример дай.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 14.06.2019 в 21:14:04
2jarni:

ОК!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 14.06.2019 в 21:18:21
2Bonarienz:  
on 1560535085, Bonarienz wrote:
Что такое "ОП-2.1"?  
Забыл ответить. Мод для Сталкера, Объединённый Пак 2.1. Помогаю там с движком, в частности переводом его на х64.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 14.06.2019 в 21:31:12
2jarni:
Уйпля!!!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 15.06.2019 в 18:23:22
2jarni:
А вот с кодировкой не английского текста в ITEMDESC.EDT беда, придется все же заморачиваться с приведенным тобой примером. Пичаль...

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 15.06.2019 в 18:25:09
2ПМ: Ожидаемо. Ну, функции у тебя есть. Пробуй.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 15.06.2019 в 20:58:33
2jarni:
Прикрутилось как родное. Еще раз спасибо.

[attach]


Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 15.06.2019 в 21:13:04
2ПМ: :up:

Спасибо большое за новый редактор, всё старое было слишком... старое :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 15.06.2019 в 21:29:23
2ПМ:

Ты - гигант!

НО где аглицкий, фрицевский и лягушатниковый интерфейсы?

А майку со штанцами стоит сётаки к благообразию привести... А то фня кака-то невнятная...

2jarni:

Ты - тоже гигант!!!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 20.06.2019 в 12:03:22

on 1560623363, Bonarienz wrote:
А майку со штанцами стоит сётаки к благообразию привести... А то фня кака-то невнятная...  

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

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 20.06.2019 в 12:04:33
2ПМ: может имеет смысел ИД предмета в скобки загнать, а то 6 ПМ в руках смотрятся несколько сюрреалистически :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Green Eyesman на 20.06.2019 в 12:08:55
2ПМ: А можно такой же, но для предметов (или уже есть)?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 20.06.2019 в 12:37:02

on 1561021473, Artem13 wrote:
ИД предмета в скобки загнать

Гляну, как будет смотреться. Действительно, пробела маловато будет..


on 1561021735, Green Eyesman wrote:
А можно такой же, но для предметов

Лучше Excel все равно не получится.  :P
Написать такой редактор в принципе можно, но какой в нем смысл? Даже в Метавире совсем другой формат файла ттх.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 20.06.2019 в 12:44:50
Да, пожалуй скобочки уместны. Тока квадратные лучше смотрятся.

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Legend на 20.06.2019 в 13:50:55
2ПМ: Имхую, что в ИМПере было логичнее с отдельным окном для ID и отдельным для названия, желательно с алфавитной сортировкой - подсмотрел в ёкселе номер и вбил, или тупо по первым буквам названия нашёл. А то поиск становится уж очень муторным, мышка на колёсико жалуется.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 20.06.2019 в 15:09:16

on 1561027855, Legend wrote:
логичнее с отдельным окном для ID

Можно и так.

on 1561027855, Legend wrote:
желательно с алфавитной сортировкой

А вот это уже никак.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 20.06.2019 в 15:54:21
2ПМ:

Матрица переходов или матрица соответствия.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 20.06.2019 в 16:02:15

on 1561032556, ПМ wrote:
А вот это уже никак.  
А разве комбо-бокс не поддерживает сортировку? В С# можно либо включить алфавитную сортировку, либо отсортировать массив значений и сделать его дата-сорсом для комбобокса.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 20.06.2019 в 16:27:06
2jarni:
Надо будет посмотреть. Хотя емнип это уже излишество, тем более что в названиях кириллица и латиница весьма вольно используются.

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 20.06.2019 в 16:28:35
2ПМ:

on 1561037226, ПМ wrote:
Надо будет посмотреть.
Нафиг, так прекрасно смотрится.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 20.06.2019 в 16:37:26
2ПМ:

Ну, ёптыть! Ты что, хром на "рюске език"?

- Волосы * BROWNHEAD
- Кожа * TANSKIN
- Майка * CamoWestBrowmGr...
- Штаны * CamoWestBrowmG...

Это ненормально!!!

--------------------------

А вот от этого упаль и уписалсо:

"Руки" - "ПМ"!!! Видятся радужные флаги на фоне голубого неба...

---------------------------

Не говоря уже о том, что "Подвижность" - это, па-рюзьке, "Резвость"!!! Как у коника, сиречь у скаковых лошадей...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Legend на 20.06.2019 в 17:21:40
2ПМ: "Эволюцию" в "обучение" уже переименуй, а то нифига не понятно, в какую лягушку мерк эволюционировать должен ;D


Quote:
"Подвижность" - это, па-рюзьке, "Резвость"
Лучше "резкость". И градации - "к.г.п." (как генерал в погонах), "к.п.ж." (как прапор жилистый), "с.д.ч.в." (сержант дневальному черпаком выдал) и иже с ними =)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Luficer на 20.06.2019 в 17:43:17
И, кстати, где слюна жука?

Хочу слюну жукааааа...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 20.06.2019 в 17:50:03
2ПМ: А можешь руки, большие слоты и малые слоты сделать груп-боксами, как Индивидуальность или Инвентарь. Статики занимают слишком много места.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 21.06.2019 в 15:21:39

on 1561037846, Bonarienz wrote:
Это ненормально!

Это более чем нормально. Это реальные символьные значения, которые не стоит интерпретировать.


on 1561042203, jarni wrote:
руки, большие слоты и малые слоты сделать груп-боксами, как Индивидуальность или Инвентарь


[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Legend на 21.06.2019 в 15:54:17
2ПМ: А что значит "рукожоп"? Впервые вижу ;D И зачем номер вещи в название вернул, это же повторение?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 21.06.2019 в 19:22:55

on 1561121657, Legend wrote:
рукожоп

На мой взгляд наиболее точно отражает суть оригинального "Badass". Это тот уникум, который из автомата шмаляет с одной руки.


on 1561121657, Legend wrote:
номер вещи в название вернул

Не поверишь, но ориентироваться в списке удобнее.  :P

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Legend на 21.06.2019 в 20:16:03
2ПМ: Хмм. Рукожоп это у которого руки из той самой жопы, который делает всё через жопу. Badass это что-то совсем другое, кто-то непомерно крутой. Ещё мой словарь выдал "отморозок". Ну а т.к. в игре этот перс стреляет из Баррета с одной руки, то это тупо позер ;D


Quote:
ориентироваться в списке удобнее
Я думал таким образом искать нужное просто набирая название. Сейчас оно работает с номерами, т.к. они первые. Причём игнорируя первую скобку :D Вот такой же херни хочется с названием.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 21.06.2019 в 20:34:01

on 1561137363, Legend wrote:
просто набирая название

Для этого сначала надо все нахвания лопатить, чтобы латиница и кириллица были строго где надо.
Хм...
Или действительно убрать дублирование номера в описании?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем ПМ на 21.06.2019 в 21:19:06
Там всех дел - несколько строчек закомментировать.

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 06.01.2021 в 11:47:06
Пытаюсь сейчас построить решение в VS2019 с помощью cmake. Никогда раньше этого не делал и сейчас бы с удовольствием обошелся, но приходится.
(на всякий случай - речь идет о пакете Geant4 под Win10... не думаю, что это сейчас имеет значение.)

Так вот. Пишу в командной строке
> cmake --build . --config Release

и получаю кукиш следующего содержания:

Quote:
CMake Error:
 Generator

   Visual Studio 16 2019

 could not find specified instance of Visual Studio:

   D:/VS2019


Вопрос: какого хрена? Я никогда не устанавливал и не пытался устанавливать VS в эту папку. Она у меня установлена в стандартном месте: C:\Program Files (x86)\Microsoft Visual Studio\2019. Откуда вообще у Цмейка взялась идея искать ее на D, и как объяснить ему, что он неправ?

ЗЫ. На всякий случай тупо скопировал папку \2019 на D под этим самым названием, но результат ровно тот же самый.

ЗЗЫ. Компонента "Средства CMake C++ для Windows" установлена.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 06.01.2021 в 11:55:20
Посмотри что в PATH у тебя для cmake есть в наличии.
И каежтся, если я еще чего-то помню, cmake можно при установке visual studio установить интегрированный и собирать проект прям из студии.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 06.01.2021 в 12:49:20
В переменных среды никакого намека на путь d:\vs2019 не обнаружилось.

Более того, на cmake.org (https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html) я нашел вот что:

Quote:

VS 2019 supports multiple installations on the same machine. The CMAKE_GENERATOR_INSTANCE (https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_INSTANCE.html#variable:CMAKE_GENERATOR_INSTANCE) variable may be set as a cache entry containing the absolute path to a Visual Studio instance. If the value is not specified explicitly by the user or a toolchain file, CMake queries the Visual Studio Installer to locate VS instances, chooses one, and sets the variable as a cache entry to hold the value persistently.
When CMake first chooses an instance, if the VS160COMNTOOLS environment variable is set and points to the Common7/Tools directory within one of the instances, that instance will be used. Otherwise, if more than one instance is installed we do not define which one is chosen by default.


Я обнаружил, что в переменных среды нет переменной VS160COMNTOOLS. Я вписалее туда со значением C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools
Перезагрузил комп и... та же фигня :(.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 07.01.2021 в 18:11:43
Короче, проблему пришлось решать радикально. Я снес Студию, потом заново поставил по этому самому пути.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 03.09.2021 в 09:01:07
Так, други, наступает момент, когда меня принуждают ваять клиент под МЭК61850. В связи с этим вопрос/просьба - кто-то ТСР на Сях программил? Если да - пните в нужном направлении (литература/уроки/т.п.). Желательно русскоязычном. Аглицкий мну напрягает :(

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 03.09.2021 в 09:13:50

on 1630648867, Artem13 wrote:
литература/уроки/т.п.


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

https://www.ozon.ru/product/unix-razrabotka-setevyh-prilozheniy-2881910/

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 03.09.2021 в 09:32:55
Эм, для виндузятины оно покатит?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 03.09.2021 в 09:35:10

on 1630650775, Artem13 wrote:
для виндузятины оно покатит?

Вряд-ли. Меня "МЭК61850" смутил, подумал что там линь.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем jarni на 03.09.2021 в 09:50:51

on 1630648867, Artem13 wrote:
кто-то ТСР на Сях программил?
Довольно много но довольно давно :)


on 1630648867, Artem13 wrote:
в нужном направлении

on 1630650775, Artem13 wrote:
виндузятины

https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-reference
WinSock поддерживает формально как BSD socket API, то есть названия большинства функций такое же (bind, listen, connect, recv, send,...), но если не будешь код портировать на никсы то сразу используй WSA* функции для лучшей читабельности. Это почти всё что тебе нужно. Там у них очень много примеров для каждой функции.

Пошаговый мануал что за чем просто гугли, мне вот такой попался: https://firststeps.ru/mfc/net/socket/r.php?1

Книжки не порекомендую, учился по мере потребности из и-нета и документации.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Artem13 на 03.09.2021 в 09:54:32
Ок, сенькс. Попробую.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 30.06.2022 в 15:47:55
У меня возник вопрос, который в первый момент показался мне очень простым. Но как только я попытался его решить, выяснилось, что я в упор не понимаю, как.

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

Все элементарно. Если бы не один нюанс.
Эта программа должна быть трансферабельна с винды (visual studio) на линукс и обратно. А все примеры, которыми забит гугл, работают либо только в VS, либо только в линуксе. В результате сейчас в моей программе вот такой кошмар:

Code:
/*if(mkdir("dat")==-1)  // for Windows systems
           printf("Error creating dat directory\n");
     else printf("Dat directory created\n");
     if(mkdir("map")==-1)
           printf("Error creating map directory\n");
     else printf("Map directory created\n");
     if(mkdir("conf")==-1)
           printf("Error creating conf directory\n");
     else printf("Conf directory created\n");*/

     if(mkdir("dat",0777)==-1){  // for Linux systems
           printf("Error creating dat directory\n");
           }
           else printf("Dat directory created\n");
     if(mkdir("map",0777)==-1){
           printf("Error creating map directory\n");
           }
           else printf("Map directory created\n");
     if(mkdir("conf",0777)==-1){
           printf("Error creating conf directory\n");
           }
           else printf("Conf directory created\n");

и мне приходится вручную комментировать-раскомментировать нужные блоки всякий раз, когда я переношу прогу с одной системы на другую. И плюс еще в линуксе я каждый раз комментирую //#include <direct.h>, а в винде раскомментирую обратно...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 30.06.2022 в 15:53:54
2Ushwood:
тупая проверка не поможет?

#ifdef _WIN32
// Win
#else
// lin
#endif

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 30.06.2022 в 19:10:09

on 1656593275, Ushwood wrote:
Эта программа должна быть трансферабельна с винды (visual studio) на линукс и обратно.

https://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/index.htm

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 30.06.2022 в 20:32:48

on 1656605409, Zed wrote:
https://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/index.htm
А ещё лучше сказать, что у нас есть С++17 и не думать про boost

А в общем случае Korchy прав, если очень хочется, то системнозависимый код окружают макросами. И тут систем всего-то две.

[offtop]А ещё можно выделить объявления функций в один заголовочный файл, а реализации для win и linux разнести по разным файлам и прописать для разных систем сборку разных файлов исходного кода.[/offtop]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 30.06.2022 в 20:58:55

on 1656610368, Lion wrote:
А ещё лучше сказать, что у нас есть С++17 и не думать про boost  

Этак можно сказать что у нас есть питон или *список языков с функционалом "из коробки"* и плюсы ненужны :)

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 30.06.2022 в 21:05:39
2Zed: Ну зависит от задачи. Для некоторых задач проще действительно взять питон. Если выбирать между добавлением буста и апгрейдом стандарта, я бы сначала смотрел, можно ли дёшево сделать второе.

А так питон, конечно, многим хорош (особенно с аннотациями типов), только медленно и памяти много идёт.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 01.07.2022 в 11:58:56
2Korchy:
2Zed:
Спасибо, попробую.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем JAggernaut на 07.12.2022 в 02:01:22
[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 07.12.2022 в 13:35:53
2JAggernaut:

Инкапсулированные говнокодеры...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 08.02.2023 в 17:31:09
У меня в одной из сишных программ возникла какая-то дурацкая ошибка, с которой я никогда раньше не встречался.
Программа отказывается открывать текстовый файл для записи.[attach]
Файловая переменная равна NULL, и программа вылетает.
Что я перепробовал (следы этого частично видны на скрине выше):
- менял имя файла на какое-то совершенно безобидное;
- менял путь (текущая директория, корень разных дисков; место везде есть);
- пытался открывать через fopen или через fopen_s;
- файловую переменную задавал как локальную или глобальную;
- работал в режиме debug и release;
- перезагружал Студию, делал полный ребилд проекта (знаю, иногда сама Студия глючит, тогда эти меры обычно помогают);
- позакрывал большую часть приложений, так что у меня свободно 7 гигов оперативки, а сама программа жрет 200 мегов.
Все это ничего не поменяло :(.

Я в тупике. Не понимаю, в чем ЕЩЕ может быть проблема.

ЗЫ. Visual Studio 2015.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Korchy на 08.02.2023 в 18:49:57
путь абсолютным попробовать задать?

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем pipetz на 08.02.2023 в 19:08:05

on 1675871397, Korchy wrote:
путь абсолютным попробовать задать?

Или может прав нет на запись. Запустить от имени администратора.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 08.02.2023 в 20:55:05

on 1675866669, Ushwood wrote:
Файловая переменная равна NULL, и программа вылетает.

Это fopen возвращает NULL, что свидетельствует об ошибке.
Попробуй получить информацию об ошибке с помощью функции GetLastError().
https://learn.microsoft.com/ru-ru/windows/win32/debug/retrieving-the-last-error-code

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем pipetz на 08.02.2023 в 21:46:34
У меня такая прога отработала.
Разработал в блокноте, компилировал GNU gcc версии 6.3.0.


on 1675878905, автор wrote:
#include <stdio.h>

int main() {
     output();
     return 0;
}

void output() {
     
     FILE *out2;
     out2 = fopen("out.dat", "w");
     fputs("Hello, World!", out2);
     fclose(out2);
}

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 08.02.2023 в 22:43:18

on 1675871397, Korchy wrote:
путь абсолютным попробовать задать?
И абсолютным (там в предыдущих строках это видно), и относительным.

on 1675881994, pipetz wrote:
У меня такая прога отработала.
Естественно. Она и должна была отработать. Я пытаюсь понять, что могло пойти не так, из-за чего она не отработала у меня.
Естественно, кусок, который я привел, - это не вся программа. Но я понятия не имею, что в других ее местах могло привести к несрабатыванию в этом месте.

on 1675872485, pipetz wrote:
Или может прав нет на запись.
Есть права на запись. Собственно, эта же программа ранее (из другой функции) благополучно открыла файл на запись.


on 1675878905, Терапевт wrote:
Попробуй получить информацию об ошибке с помощью функции GetLastError().
Спасибо, попробую.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем pipetz на 08.02.2023 в 22:59:08

on 1675885398, Ushwood wrote:
Я пытаюсь понять, что могло пойти не так, из-за чего она не отработала у меня.  

Пришли расшифровку ДНК.  ;D

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Lion на 08.02.2023 в 23:20:24
2Ushwood: Стоит попробовать получить код ошибки, как уже писал Терапевт.
Кроме того может иметь смысл запускать программу не из студии.
Ещё я бы проверил, что не происходит нескольких подряд попыток открыть один и тот же незакрытый файл.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 09.02.2023 в 17:34:13

on 1675878905, Терапевт wrote:
Попробуй получить информацию об ошибке с помощью функции GetLastError().
https://learn.microsoft.com/ru-ru/windows/win32/debug/retrieving-the-las...
     
То ли лыжи не едут... ::)
Вставил функцию по этой ссылке в начало программы, вставил строку
if(!GetProcessId(NULL))
       ErrorExit(TEXT("GetProcessId"));
после того самого fopen, запустил ииии... прога вылетела внутри этой самой функции.

[attach]

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 09.02.2023 в 19:01:55
Следующая серия.
В попытке обойти проблему я убрал эту функцию вообще, открыл файл на запись в самом начале программы (и закрыл в самом конце). Прога немного поработала, потом вылетела с сообщением "Куча была повреждена".
Чувствую, теперь я буду дооолго искать, где именно и что я натворил с кучей...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 09.02.2023 в 19:03:06
2Ushwood:
Нужно было вызвать ErrorExit(TEXT("output")) после out2 = fopen("out.dat", "w");
Но чтобы не разбираться с возникшей ошибкой, напиши вызов так
...
out2 = fopen("out.dat", "w");
DWORD dw = GetLastError();
...
и посмотри отладчиком, какой код будет в dw. Расшифровка кодов тут:
https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 09.02.2023 в 19:34:30

on 1675958515, Ushwood wrote:
Прога немного поработала, потом вылетела с сообщением "Куча была повреждена".

Похоже на результат бесконтрольного рекурсивного (сама себя) вызова какой-то функции.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 10.02.2023 в 12:42:08
Рекурсивных функций у меня нет. А вот динамические массивы есть, и имел место выход за границы одного из них.
Дело раскрыто. Спасибо всем, кто помогал :).

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 10.02.2023 в 13:03:52

on 1676022128, Ushwood wrote:
А вот динамические массивы есть

Очень интересно. Только в Си нет готовых динамических массивов. Подобные штуки реализуются вручную через динамическое выделение памяти с помощью malloc().

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 10.02.2023 в 13:07:08
2Ushwood:

Лучше быть олигофреном
И пить водддку прям с утра
Чем складАть олигомеры
В динамический массив!..

2Терапевт:

Он же хымик, а не софтюк...

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Терапевт на 10.02.2023 в 13:25:19

on 1676023628, Bonarienz wrote:
Он же хымик, а не софтюк...

Одно другому не мешает. Я тоже профессионально никогда на Си не писал. Для меня это хобби.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 10.02.2023 в 15:13:12
2Терапевт:

СиКуЭльщик нищасный!

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Ushwood на 10.02.2023 в 18:18:19

on 1676023432, Терапевт wrote:
Подобные штуки реализуются вручную через динамическое выделение памяти с помощью malloc().  
Именно так и делал.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 10.02.2023 в 19:44:48
2Ushwood:

"Уж вы там добалуетесь, уж вы доизвлекаетесь!.."

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Zed на 10.02.2023 в 20:48:53
2Bonarienz:
Завидуй молча.

Заголовок: Re: С++ Вопросы и ответы.
Прислано пользователем Bonarienz на 10.02.2023 в 22:58:05
2Zed:

Товарищ Председатель! Мы не завидуем (никогда и никому!), мы неспешно грызем Яву. И фильтр, и язык (sic!)...

И ужо понимаем про инкапсуляцию - ведь олигомеры - это именно она... По ЗСЭ...



A.I.M. » Powered by YaBB Modification 4 (v.4.0.0-pre)!
YaBB © 2000-2003. All Rights Reserved.