Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    WiseAlex



    Софтовых дел М...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slava 1
    boost::filesystem ?

    Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 21:20 19-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет, народ.
    Есть проблема:

    Код:
     
      volatile std::vector<std::string> data;
      std::string str("Hello");
      data.push_back(str);
     

    И не компилится, ни под MSVC++, ни под GCC. Пробовал и так, и сяк, волатилы расставлял везде, где только можно - результата 0.
    Кто-то с этим сталкивался? Как это решить?

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 11:32 20-04-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude, переменная типа volatile в языке Си, это та переменная, которая не кэшируется на регистрах процессора. Эта переменная может в любой момент изменится и поэтому, при её использовании надо обращаться в память. Что может менять вектор, состаящий из строк? Компилятор это тоже не знает!

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 15:53 20-04-2007
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Вектор объявлен с модификатором. Его метод push_back() не имеет такого модификатора. Потому и ошибка компиляции - компилятор не нашёл std::vector<>::push_back(std::vector<>::value_type) volatile.
    Любой класс, который позволяет создавть свои volatile-экземпляры, должен предусмотреть соответствующие перегруженные методы. То же относится к const. Почему их нет у вектора, не знаю. Наверное потому, что такой вектор будет крайне неэффективен. Скажи лучше, зачем он тебе понадобился?

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 16:30 20-04-2007
    RedLord

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    здесь обсуждалось:
    __http://groups.google.bs/group/comp.lang.c++.moderated/browse_thread/thread/bc0f4e7d86647c05/0504099fbb7e81be?lnk=gst&q=volatile&rnum=7#0504099fbb7e81be

    Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 16:32 20-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Скажи лучше, зачем он тебе понадобился?

    Понадгобился именно затем, зачем имеется в наличии модификатор volatile: этот вектор может в любой момент времени измениться каким-либо тредом (т.е., либо дополниться. либо уменьшиться). На самом деле, я бы пометил как volatile не весь вектор, а только его мемберскую переменную size (или что там говорит о его размере), если бы была такая возможность. Я так понял, нужно просто создать какую-то функцию, помеченную как volatile, которая просто будет возвращать размер этого вектора, но так как она будет помечена волатилом, она оптимизироваться не будет, и всё будет работать именно так, как мне нужно. Или я не прав, и всё надо сделать как-то по-другому?

    ----------
    photocraft.com.ua

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 23:44 20-04-2007
    slonpts

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    Как я понял, в твоей программе работают несколько потоков, их которых по крайней мере один пишет что-то в вектор, а другие читают.
     
    Для корректной работы тебе придется использовать синхронизацию потоков с помошью функций, предоставляемых операционной системой (например, используя мьютексы).
     
    В любом другом случае программа может в некоторых случаях не работать, и такие ошибки будет очень трудно отловить, т.к. их практически невозможно воспроизвести. Если тебя устраивает "теория вероятностей" - т.е. то, что программа 1 раз из 1000 может выдавать ошибку (или, что еще хуже, неправильные данные, никак не сообщая об ошибке), то можно обойтись без синхронизации потоков.
     
    Насчет того, что процессор может в любом случае кэшировать вектор, я, честно говоря, не задумывался. Но лично я, используя мьютексы, события и семафоры, никаких проблем ни разу не заметил.
     
    Если хочешь серьезно заняться синхронизацией - читай "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" Джеффри Рихтера.

    Всего записей: 18 | Зарегистр. 28-12-2005 | Отправлено: 00:40 21-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slonpts

    Цитата:
    Для корректной работы тебе придется использовать синхронизацию потоков с помошью функций, предоставляемых операционной системой (например, используя мьютексы).

    Не нужно путать теплое с мягким: синхронизация и оптимизация это немногот разные вещи. Синхронизацию я и без того использую. У меня есть тред, который ждет изменения этого вектора в некотором цикле и время от времени его проверяет. Сам цикл очеь которткий: проверка длины вектора и слип на несколько секунд. Естественно, изменения вектора в самом этом цикле не происходит, и оптимизатор решает, что каждый раз вытаскивать длину вектора из памяти неэффективно, и поэтому один раз помещает эту переменную в регистр перед входом в цикл, и дальше, естественно, зависает в бесконечном ожидании того, чего случиться никогда не может, так как регистр этот в данном контексте выполнения никем и никогда не поменяется. А вот если бы я пометил вектор как volatile - это сказало бы оптимизатору, что оптимизировать таким образом не стоит, так как вектор (его длина, в частности) в любой момент времени может быть изменен другим тредом или процессом, и тогда он бы проверял не закешированное в регистре значение, а в каждый проход цикла заново вытаскивал бы это значение из памяти (стэка или хипа, неважно). Модификатор volatile именно для таких случаев и придуман, так что RTFM.

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 01:22 21-04-2007
    vsDev



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть такая задача: задано имя двоичного файла; заменить в этом файле все вхождения заданной последвательностти символов на некоторую другую последовательность. Например, заменить в некотором файле строки вида xxx "yyy" символами пробела. Т.е. был файл с содержимым "asdf xxx "yyyy" cfgfdgf xxx "yyy" drfsdf4remh'fdgf" - на выходе должен быть файл вида "asdf            cfgfdgf           drfsdf4remh'fdgf".  
    Просьба не писать полный код программы, а высказать мнения как лучше реализовать такую задачу (какие использовать технологии и подход). Интересует самое оптимальное по скорости решение.  
    Заранее спасибо.
     
    Добавлено:
    Причем значение текста yyy может быть произвольным, т.е. поиск можно осуществлять только по строке xxx " (yyy не известно до первого поиска)

    Всего записей: 11 | Зарегистр. 24-03-2007 | Отправлено: 01:27 21-04-2007
    RedLord

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    посмотри в сторону Intel Threading Building Blocks
    там есть  вектора, правильно работающие в нескольких потоках
     
    P.S. судя по исходному коду, мемберы вектора (не функции) объявлены как volatile, что подавляет оптимизацию
    похоже, это то, что надо

    Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 12:32 21-04-2007 | Исправлено: RedLord, 12:41 21-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RedLord

    Цитата:
    посмотри в сторону Intel Threading Building Blocks

    Она платная Бесплатно можно тоько для некомеческого использования.
    Но всё равно спасибо

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 12:58 21-04-2007
    RedLord

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    конечно для коммерческого ПО это не  подойдет. но посмотреть реализацию можно.
     
    там шаблоны. думаю вполне реально рипнуть код

    Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 15:18 21-04-2007
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    xdude
    Цитата:
    ...Синхронизацию я и без того использую. У меня есть тред, который ждет изменения этого вектора в некотором цикле и время от времени его проверяет. Сам цикл очеь которткий: проверка длины вектора и слип на несколько секунд.
    Не совсем правильно используешь, значит. Попробуй добавить критическую секцию к std::vector<>size(). Впрочем, читай дальше.
    Цитата:
    Естественно, изменения вектора в самом этом цикле не происходит, и оптимизатор решает, что каждый раз вытаскивать длину вектора из памяти неэффективно, и поэтому один раз помещает эту переменную в регистр перед входом в цикл, и дальше, естественно, зависает в бесконечном ожидании того, чего случиться никогда не может, так как регистр этот в данном контексте выполнения никем и никогда не поменяется.
    Давай угадаю - ты Билдер юзаешь. Впрочем, у предыдущих Intel C++ компиляторов тоже наблюдался подобный глюк оптимизации. Скажу сразу: оптимизатор не прав, выполняя такую оптимизацию. В стандарте чёрным по белому записано: все побочные эффекты, вызванные оптимизацией, обязаны быть нейтрализованы к моменту получения функцией управления. То же относится и к возврату из функции в точку вызова. Т.е. стандарт защищает программиста от таких агрессивных оптимизаторов, позволяя ему всегда рассматривать функции как нечто неделимое.
    Цитата:
    ...Модификатор volatile именно для таких случаев и придуман, так что RTFM.
    Это-то верно (хоть и только отчасти, но не суть), но используя volatile, ты согласаешься с неоптимизацей вектора всего и везде. Ой-ёй-ёй. Я бы сказал, что это очень плохое согласие. Попробуй напиши простой код с вектором и замерь производительность с полной оптимизацией и полным её отсутствием. Разница будет в десятки раз, уж поверь.
    Теперь по сути. Вот такой код у меня
    Код:
    #include <windows.h>
    #include <process.h>
    #include <conio.h>
    #include <cstdlib>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <iostream>
     
    std::vector<std::string> v;
    HANDLE                   evExit;
     
    unsigned __stdcall thread(void*)
    {
     while(v.size() < 400000) Sleep(1000);
     
     while(WaitForSingleObject(evExit, 1000) == WAIT_TIMEOUT)
      std::cout << v.size() << '\t';
     std::cout << std::endl;
     return 0;
    }
     
    int main()
    {
     evExit = CreateEvent(NULL, TRUE, FALSE, NULL);
     
     unsigned  threadID;
     HANDLE    hThread=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, thread, NULL, 0, &threadID));
     
     while(!kbhit() || getch()!='\x1B')
      v.push_back(static_cast<std::ostringstream&>(std::ostringstream() << rand()).str());
     SetEvent(evExit);
     WaitForSingleObject(hThread, INFINITE);
     CloseHandle(hThread);
     CloseHandle(evExit);
    }
    и VC2003, и Intel C++ 9.1 отлично компилится и правильно оптимизируется. Сравни со своим и качественные отличия запости сюда, если потенция поразбираться ещё не кончилась.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 19:25 21-04-2007 | Исправлено: Qraizer, 19:27 21-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Попробуй добавить критическую секцию к std::vector<>size(). Впрочем, читай дальше.

    Это как? Я, вообще-то, пишу кросс-платформенное приложение, пользую boost::thread и соответственно, boost::mutex, который под виндой, насколько я понимаю, и разворачивается в критическую секцию (хотя, я могу и ошибаться). И что, критические секции оптимизатор обходит стороной?

    Цитата:
    В стандарте чёрным по белому записано:

    Про стандарт не знал. А gcc его придерживается? У меня было подобное приложение под линухом, которое временами входило в бесконечный цикл, так как там была похожая ситуация. А когда собирал без оптимизации - всё работало нормально.
     
    Добавлено:
    Qraizer
    Хмм... Очень интересная ситуация получается:

    Код:
     
    class Test
    {
    private:
      std::vector<int> tasks;
      bool finish;
      void th_main()
      {
        while (!finish)
        {
          cout << "foo" << "\n";
        };
        cout << "BAR!!!" << "\n";
      };
    public:
      Test(): finish(false) { };
      void run()
      {
        boost::thread th(boost::bind(&Test::th_main, this));
        for (int i = 0; i < 1000000; ++i)
        {
          tasks.push_back(i);
        };
        finish = true;
        th.join();
      };
    };
     

    И при полной оптимизации под MSVS 2005 всё работает нормально. Это как же понимать, модификатор volatile вообще никому не нужен, что ли? Или это опять Microsoft Specific?

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 20:15 21-04-2007 | Исправлено: xdude, 20:41 21-04-2007
    slonpts

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    Можешь попробовать такой финт ушами:

    Код:
     
    std::vector<std::string> v;
    volatile int notCachedVectorLength;
     

    везде, где меняется длина вектора, делаешь

    Код:
     
    notCachedVectorLength = v.size();
     

    а там, где идет проверка, делаешь примерно так:

    Код:
     
    while (1)
    {
      if (notCachedVectorLength  != previousVectorLength)
      {
        ...
      }
      Sleep(1000);
    }
     

     
    Плюсы:
    + оптимизация где надо, там работает, где не надо - там не работает;
    + работает не зависимо от того, насколько компилятор соответствует стандарту насчет оптимизации, о котором писал Qraizer.
     
    Минусы:
    - нужна дополнительная переменная, которую придется тащить везде вместе с вектором;
    - придется везде, где меняется длина вектора, добавлять код для ее изменения;
    - решение все-таки кривое.
     
    Но если ты меняешь длину вектора всего в 1-2 местах, то, по-моему, подойдет.

    Всего записей: 18 | Зарегистр. 28-12-2005 | Отправлено: 20:33 21-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slonpts
    Да, я после долгих мучений именно так и хотел сделать, но оставлял этот как самую крайнюю меру. Наверное, придется-таки к ней прибегнуть.
    Я даже пробовал написать функцию-обертку типа вот такого:

    Код:
     
    SomeClass
    {
    ...
    vector<string> someVector;
    ...
    vector<string>::size_type getNumItems() volatile
    {
      return someVector.size();
    }
    // или так
    volatile vector<string>::size_type getNumItems() volatile
    {
      return someVector.size();
    }
     
     

    Всё равно работать не хочет, так как внутри этой функции обращение к someVector.size() тоже требует, чтобы метод size() был помечен модификатором volatile.
    В общем, закавыка

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 21:06 21-04-2007
    RedLord

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Qraizer

    Цитата:
    В стандарте чёрным по белому записано: все побочные эффекты, вызванные оптимизацией, обязаны быть нейтрализованы к моменту получения функцией управления

     
    можно подробнее.
     
    т.е. компилятор при таком коде
     

    Код:
     
     
    void test()
    {
    std::vector<int> v;
    for (size_t i  = 0; i < v.size(); i++)
    {
    }
     
    // здесь код не использующий v
     
     
    for (size_t i  = 0; i < v.size(); i++)
    {
    }
     
    }
     

     
    не может выполнить оптимизацию?
    например такую:
     

    Код:
     
     
    void test()
    {
    std::vector<int> v;
    const size_t sz = v.size(); // добавляется оптимизатором
    for (size_t i  = 0; i < sz; i++)
    {
    }
     
    // здесь код не использующий v
     
     
    for (size_t i  = 0; i < sz; i++)
    {
    }
     
    }
     


    Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 23:13 21-04-2007
    vsDev



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пытаюсь освоить работу с файлами (MS C/С++)
    Нашел в мсдн такой раздельчик:
  • Stream I/O functions treat data as a stream of individual characters.
  • Low-level I/O functions invoke the operating system directly for lower-level operation than that provided by stream I/O.
    Прочитал - вроде бы понял, но хотелось бы услышать мнение бывалых, о том в каких случаях какой подход следует использовать? Или лучше использовать апишные функции для работы с файлами?

  • Всего записей: 11 | Зарегистр. 24-03-2007 | Отправлено: 23:18 22-04-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vsDev
    Если тебе low-level I/O не надо - то я бы порекомендовал юзать STL-ные стримы (#include <fstream>), код будет более наглядным и более портабельным, ну и они проще в использовании.
    Low-Level и API-функции обычно используют, когда нужна высокопроизводительная (и/или маловесная) программа, заточенная под конкретную ОС, ну или если не хватает функциональности более универсальных, но более ограниченных стримов.
     
    Добавлено:
    Товарисчи! Всё-таки вернусь к своему вопросу, заданному здесь
    Вразумитеольного ответа, как это заставить работать, я так и не получил. Почему это не работает - я и сам знаю, меня интересует, можно ли в принципе как-то использовать бустовские байнды с обычными C-style коллбэками?

    ----------
    photocraft.com.ua

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 11:49 23-04-2007
    Qraizer



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    RedLord
    Не может. const size_t sz = v.size(); // добавляется оптимизатором неправомерно, ибо вызов функции есть вызов функции, и нет никаких гарантий, что в разные вызовы она будет возвращать одинаковые результаты, что в действительности и происходит. И тот факт, что этот метод простенький и легко встраивается (в результате чего вызова метода как такового уже и нет, а вместо него оптимизатор видит его тело) ничего не меняет - стандарт об этом чётко заявляет. Глюк оптимизации как раз и проявляется в тех случаях, когда после встраивания inline-методов и функций оптимизатор "забывает" о том, что раньше это были вызовы. Другое дело, если метод имеет модификатор const и вызывается с константным экземпляром... Тогда оптимизатор имеет право оптимизировать этот вызов. И если программист его "обманул" каким-нибудь const_cast<>-ом, то виноват будет уже он.
    Цитата:
    можно подробнее.  
    Можно. Раздел 5.2.2 "Function call" пункт 8: "The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified." Это что касается вызова функции. Непосредственно к рассматриваемой теме это отношения не имеет, но мною было упомянуто. Раздел 1.9 "Program execution" пункт 17: "When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function11)." И сноска 11): "The sequence point at the function return is not explicitly specified in ISO C, and can be considered redundant with sequence points at full expressions, but the extra clarity is important in C++. In C++, there are more ways in which a called function can terminate its execution, such as the throw of an exception." Надо ещё отметить, что компилятор должен просечь разные области видимости у элемента вектора, в котором хранится его размер (если это и правда отдельное поле в классе) и у переменной, которой присваивается результат вызова этого метода. Он ну никак не может гарантировать полное отслеживание всего контекста использования этого экземпляра класса, за исключением весьма специальных случаев, когда этот экземпляр живёт очень недолго.

    Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 16:38 23-04-2007 | Исправлено: Qraizer, 16:44 23-04-2007
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru