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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    KChernov



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Разбираюсь сейчас с кодом, в котором активно используются макросы и шаблоны и попал в ситуацию, из которой пока не вижу выхода
    Есть такое объявление экземпляра класса:

    Код:
    PreconditionerILU0<MT_SP<VSTFORMAT<VPRECISION> > >   M( aa );
    (все капитализированное суть дефайны)
    Но насколько я помню С++, должно быть написано несколько иначе:

    Код:
    PreconditionerILU0<MT_SP<VSTFORMAT<VPRECISION> > >   M = new PreconditionerILU0<MT_SP<VSTFORMAT<VPRECISION> > >( aa );

    Однако такой вариант не работает - при компиляции выдается ошибка:

    Цитата:
    error C2440: 'initializing' : cannot convert from 'class pmlp::PreconditionerILU0<class pmlp::MatrixGeneral<class pmlp::CSR<double> > > *' to 'class pmlp::PreconditionerILU0<class pmlp::MatrixGeneral<class pmlp::CSR<double> > >'
            No constructor could take the source type, or constructor overload resolution was ambiguous


    Описание ошибки в мсдн-е как-то не наводит на правильные мысли.
    Почему исходное работает, а мое нет?

    Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 16:48 11-12-2007 | Исправлено: KChernov, 16:49 11-12-2007
    Abs62



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

    Цитата:
    Почему исходное работает, а мое нет?

    Надо полагать потому, что SomeClass M(aa) писать можно (это обычное объявление нового экземпляра класса), а SomeClass M=new SomeClass M(aa) - нельзя, ибо new возвращает указатель на класс. Можно писать SomeClass *M=new SomeClass M(aa) и дальше работать с M как с указателем.

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:02 11-12-2007
    Rpining

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста решить задачу!!!
    Спроэктировать класс Men в качестве константы задоно день рождение человека, в качестве задачи посчитать прожитые дни. В качестве входного потока дата.

    Всего записей: 2 | Зарегистр. 11-12-2007 | Отправлено: 19:13 11-12-2007
    lakerdes

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ситуация:
    Пишу shell под Slackware linux. Надо реализовать запуск процесса в фоновом режиме. Никак не могу понять как это сделать, если есть идеи - поделитесь. Заранее спасибо.

    Всего записей: 15 | Зарегистр. 11-12-2007 | Отправлено: 19:45 11-12-2007
    MFPSoftware



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

    Код:
    int RandN(int a,int b)
    {
        return (int) (a+(b-a)*rand()/double(RAND_MAX));
    }
     

     
    Функция выводит случайное целочисленное число в пределах от а, до б, включительно.
     
    Но если я пишу - cout << RandN(1, 10) << endl; То система выводит какое-то одно число, и так постоянно при любом запуске программы. Если второй раз вызвать функцию, то число будет другое, но полследовательность сохранится при следующем запуске программы.
     
    Как сделать так, что бы числа всегда выводились разными и, последовательность, не повторялась?

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 21:44 11-12-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lakerdes
    Хм... Пишешь свой shell, типа bash/sh? Или пишешь shell-скрипт под них? Если второе - то причём тут С++. А если первое - то зачем изобретать велосипед?
    Вообще, чтоб процесс в демона превратить (запустить в бэкграунде), надо позакрывать его стандартные дескрипторы ввода/вывода (stdin/stdout/stderr), а потом открыть их по новой и перенаправить в /dev/null или в файл какой-нибудь (хотя, это вроде бы не обязательно). Я уже точно не помню, но когда-то я что-то подобное делал, и последовательность действий была приблизительнго такой:

    Код:
     
    ...
    pid_t pid=vfork();
    if (pid==0)
    {
      close(0);
      close(1);
      close(2);
      if (-1==execve(argv[1],&argv[1],NULL))
      {
        fprintf(stderr,"Error spawning process\n");
        return -3;
      };
    };
    ...
     

     
    Добавлено:
    MFPSoftware
    Надо инициализировать генератор псевдослучайных чисел, смотри функцию srand() (туда обычно time(NULL) передают, т.е. srand(time(NULL)) тебе должно быть достаточно).

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 22:29 11-12-2007 | Исправлено: xdude, 22:30 11-12-2007
    lakerdes

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    Пишу свой на с++. Задание такое дали.  
    Вобщем, спасибо за ответ, но вопрос пока всё ещё открыт.

    Всего записей: 15 | Зарегистр. 11-12-2007 | Отправлено: 10:47 12-12-2007
    KChernov



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

    Цитата:
    Надо полагать потому, что SomeClass M(aa) писать можно (это обычное объявление нового экземпляра класса), а SomeClass M=new SomeClass M(aa) - нельзя, ибо new возвращает указатель на класс. Можно писать SomeClass *M=new SomeClass M(aa) и дальше работать с M как с указателем.

    Большое спасибо - теперь все заработало!
    Совсем забыл про это с той кучей языков, которыми пользуюсь
     
    Оффтопик:
    А почему есть целых 2 темы: Вопросы по программированию на С++ и Задачи по С++ - которые на самом деле почти одинаковые: и там, и там и задачи рассматриваются, и на вопросы отвечают???
    Почему бы их тогда не объединить?
    Ну или, как в других темах бывает сделано, прикрепить первый пост и дать в нем ссылку на соседнюю тему - типа все вопросы туда и наоборот?

    Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 11:18 12-12-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
    Вызываю функцию:

    Код:
    srand ((unsigned) time(NULL));
    cout << RandN(1, 10) << endl;

    Результат аналогичный. Каждый раз одно и тоже число.

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 12:28 12-12-2007
    Rudia



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MFPSoftware
    time возвращает количество секунд, соответсвенно при вызове программы через секунду, rand() вернет число где-то на 10 больше, т.е. при вашей функции генерации числа от 1 до 10 начальное значение изменится только если вы вызовете вашу программу минут через 6 после предыдущего вызова.
     
     
    Добавлено:
    Рекомендую сделать так:

    Цитата:
    srand ((unsigned) time(NULL));
    rand();
    cout << RandN(1, 10) << endl;
     

    Ибо у 2-го числа разброс значений будет уже большой.

    Всего записей: 324 | Зарегистр. 13-09-2006 | Отправлено: 15:50 12-12-2007
    KChernov



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как сделать, чтобы вывод в один поток приводил к выводу в несколько?
    Конкретно нужно, чтобы все
    Код:
    cout << ...;
    приводили кроме обычного действия еще и к выводу в файл.
    То есть в конце работы программы все, что выводилось на экран, должно быть и в файле.

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



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

    Цитата:
    соответсвенно при вызове программы через секунду, rand() вернет число где-то на 10 больше

    Это где такое написано, можно поинтересоваться? И почему именно на 10? o_O
     
    MFPSoftware
    Переделай немного функцию - и всё заработает:

    Код:
     
    int RandN(int a,int b)
    {
      return a + rand() % (b - a + 1);
    }
     

     
    lakerdes

    Цитата:
    спасибо за ответ, но вопрос пока всё ещё открыт.

    Так что, не помогли приведенные строчки? Только что нашел специально свой старый проект - там именно так всё и делается, и работает как часы.

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KChernov
    Единственное что пока пришло на ум: сделать свой класс и перегрузить оператор '<<'
     
    Добавлено:

    Цитата:
    Это где такое написано, можно поинтересоваться? И почему именно на 10? o_O  

    Опытным путем)

    Код:
     
    #include<iostream>
    #include <conio.h>
    #include <time.h>
    #include <windows.h>
    using namespace std;
     
    int main()
    {
      for (int i = 0 ; i<10; i++) {
        srand((unsigned)time(NULL));
        cout << rand() << endl;
        Sleep(3000);
      }
      _getch();
    }
     

    Результат:
    22986
    22995
    23005
    23015
    23025
    23035
    23044
    23054
    23064
    23077
     
    Т.е. при первом вызове функции rand значение будет изменяться на 3 с копейками с секунду или приблизетельно на 10 через 3 секунды.

    Всего записей: 324 | Зарегистр. 13-09-2006 | Отправлено: 16:29 12-12-2007 | Исправлено: Rudia, 16:54 12-12-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Rudia
    Это явно какая-то кривая реализация библиотеки stdc. Я у себя опытным путём таких зависимостей не выявил, да и по логике вещей такого быть не должно.

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

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

    Цитата:
    Так что, не помогли приведенные строчки? Только что нашел специально свой старый проект - там именно так всё и делается, и работает как часы.

    Нет, что то у меня не получается то что должно. Хз, может я объяснил не так как-то, но вобщем надо думать дальше. Один товарищ из другой группы сделал это как то с помощью сигналов. Их как нибудь можно пристроить сюда?

    Всего записей: 15 | Зарегистр. 11-12-2007 | Отправлено: 18:06 12-12-2007
    Abs62



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

    Цитата:
    А почему есть целых 2 темы: Вопросы по программированию на С++ и Задачи по С++ - которые на самом деле почти одинаковые: и там, и там и задачи рассматриваются, и на вопросы отвечают???

    А чтобы в этой теме действительно вопросы задавали, а "сделайте мне лабу" просили в "Задачах".
     
    xdude

    Цитата:
    Это явно какая-то кривая реализация библиотеки stdc.

    Микрософтовская.
    VC 7.0 даёт имено такой результат.

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:18 12-12-2007
    vjunk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Rudia
    Не нужно вызывать srand в цикле, она вызывается один раз в начале программы.

    Код:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main(void)
        {
        int i;
     
        printf("=== loop1 ===\n");
        for(i=0; i<10; i++)
            {
            srand((unsigned)time(NULL));
            printf("%d\n", rand());
            }
     
        printf("=== loop2 ===\n");
        srand((unsigned)time(NULL));
        for(i=0; i<10; i++)
            {
            printf("%d\n", rand());
            }
     
     
        return 0;
        }


    Цитата:
    === loop1 ===
    4353
    4353
    4353
    4353
    4353
    4353
    4353
    4353
    4353
    4353
    === loop2 ===
    4353
    10548
    24902
    22336
    31278
    9343
    18222
    10603
    22086
    32173

    Почувстуйте разницу

    Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 20:53 12-12-2007 | Исправлено: vjunk, 20:55 12-12-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lakerdes
    насчёт сигналов - не знаю, а насчет неправильно объяснил - я так понял, что надо запустить приложение в фоне, по типу как если бы это из bash сделать командой "/usr/local/bin/some_app &". Кусок кода, который я тебе написал, именно это и делает, это кусок утилиты, с помощью которой я когда-то запускал фоновые процессы, занимающиеся длительной обработкой больших объёмов данных. После форка в дочернем процессе закрываются все стандартные дескрипторы и делается exec, который и произойдёт в фоновом режиме. А в родительском процессе работа продолжается как и прежде, т.е., если это shell - то можно продолжить считывание команд из консоли. Может, ты не в курсе как работает fork? Вот на всякий случай тебе этот же код с небольшим продолжением и пояснениями:

    Код:
     
    //  Здесь происходит разветвление на материнский и дочерний процессы
    pid_t pid=vfork();
    if (pid==0)
    {
      // Мы в дочернем процессе, закрываем дескрипторы и выполняем exec
      close(0);
      close(1);
      close(2);
      if (-1==execve(argv[1],&argv[1],NULL))
      {
        // Дочернему процессу не удалось исполнить необходимую программу
        fprintf(stderr,"Error executing process\n");
        return -3;
      };
      // Здесь дочерний процесс завершает свою работу
      return 0;
    }
    else if (pid==-1)
    {
      // Вызов fork не удался, дочерний процесс не создан
      printf("Failed to spawn process\n");
      return -1;
    }
    // Мы в материнском процессе, дочерний процесс создан и работает в фоне
    printf("Spawned process executed successfully\n");
    // Далее можно продолжать нормальную работу материнского процесса, например. продолжить считывание команд из консоли
     

     
    Abs62

    Цитата:
    Микрософтовская.
    VC 7.0 даёт имено такой результат.  

    Никогда не доверял маздаю ) Даже когда под ним сидел - писал под gcc/mingw. А теперь вообще на макось перешел.

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 21:10 12-12-2007 | Исправлено: xdude, 21:14 12-12-2007
    Abs62



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

    Цитата:
     Никогда не доверял маздаю ) Даже когда под ним сидел - писал под gcc/mingw.

    mingw всю жизнь использовал микрософтовский рантайм.  

    Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:31 12-12-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Я так не думаю. Как-то я пытался слинковать свою прогу под mingw с какой-то стандартной майкрософтовской статической либой - не вышло. Там врода бы даже формат немного различается, то ли  именование переменных, то ли что-то ещё. Кроме того, когда-то на одной фирме писали софтину кросс-платформенную, тестили не помню точно какую фичу - под VS 2003 так работает, под 2005 - по-другому, а под mingw - совсем по-третьему.
    Да и зачем им нужен майрософтовский рантайм, если у gcc свой собственный имеется?

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 21:42 12-12-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