Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: xdude
Дата сообщения: 12.12.2007 15:27
Rudia

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

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

MFPSoftware
Переделай немного функцию - и всё заработает:

Код:
int RandN(int a,int b)
{
return a + rand() % (b - a + 1);
}
Автор: Rudia
Дата сообщения: 12.12.2007 15:29
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();
}
Автор: xdude
Дата сообщения: 12.12.2007 16:09
Rudia
Это явно какая-то кривая реализация библиотеки stdc. Я у себя опытным путём таких зависимостей не выявил, да и по логике вещей такого быть не должно.
Автор: lakerdes
Дата сообщения: 12.12.2007 17:06
xdude

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

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

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

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

xdude

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

Микрософтовская.
VC 7.0 даёт имено такой результат.
Автор: vjunk
Дата сообщения: 12.12.2007 19:53
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;
}
Автор: xdude
Дата сообщения: 12.12.2007 20:10
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
Дата сообщения: 12.12.2007 20:31
xdude

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

mingw всю жизнь использовал микрософтовский рантайм.
Автор: xdude
Дата сообщения: 12.12.2007 20:42
Abs62
Я так не думаю. Как-то я пытался слинковать свою прогу под mingw с какой-то стандартной майкрософтовской статической либой - не вышло. Там врода бы даже формат немного различается, то ли именование переменных, то ли что-то ещё. Кроме того, когда-то на одной фирме писали софтину кросс-платформенную, тестили не помню точно какую фичу - под VS 2003 так работает, под 2005 - по-другому, а под mingw - совсем по-третьему.
Да и зачем им нужен майрософтовский рантайм, если у gcc свой собственный имеется?
Автор: Abs62
Дата сообщения: 12.12.2007 21:15
xdude

Цитата:
Я так не думаю.

А родному сайту mingw поверишь?

Цитата:
The MinGW basic runtime system, which is basically the glue to the underlying operating system, is completely in the public domain. The runtime system includes MinGW headers (such as stdio.h), libraries (such as libmingw32.a) and import libraries for CRTDLL/MSVCRT.
Автор: d2alex
Дата сообщения: 12.12.2007 21:19
Здравствуйте! Подскажите пожалуйста, как правильно записать логическое выражение из вот этого задания: "...a, b, c -действительные числа. Функция F должна принимать действительное значение, если выражение:
НЕ(Ац ИЛИ Вц ИЛИ Сц)
не равно нулю, и целое значение в противном случае. Через Ац, Вц, Сц обозначены целые части значений a, b, c, операции НЕ и ИЛИ - поразрядные..."
У меня вот, что получилось:
if(~(((int)a|(int)b)&&((int)b|(int)c))) Не знаю правильно или нет.
Автор: distance
Дата сообщения: 12.12.2007 22:18
KChernov

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

просто нубы видят в тексте С++ и остальное уже не читают...
Автор: xdude
Дата сообщения: 12.12.2007 23:44
Abs62

Цитата:
А родному сайту mingw поверишь?

Верить-то верю, но значит опять же маздай рулит и жжот нипадеццки - в каждой версии MSVC у них всё работает по-разному. Более того, вспомнил только что, что после установки SP1 на msvs 2005 и проведения вышеупомянутого теста результаты опять отличились от всех предыдущих попыток Жалко, блин, не могу вспомнить, чего именно касались тесты, больше чем полгода назад это было.
Автор: MFPSoftware
Дата сообщения: 12.12.2007 23:55
xdude
Код

Код: a + rand() % (b - a + 1);
Автор: Rudia
Дата сообщения: 13.12.2007 09:00
vjunk
Если бы вы внимательно читали, то заметили бы, что я проводил эксперимент насчет того, как seed на основе времени влияет на первое число в псевдослучайной последовательности.
Автор: ellic
Дата сообщения: 13.12.2007 16:29
Привет Всем.Помогите,пожалуйста,туплю ужасно.Двумерный понимаю, атрех нет((((

//Задание 1. Объявите трехмерный массив и сформируйте указанные
//значения элементов следующим образом:
//а) проинициализируйте массив при объявлении
// |--------|
// / |3 3 3 |
// |---------|3 |
// / | 2 2 2 |3 |
// |---------|2 |__|
// | 1 1 1 |2 | /
// | 1 1 1 |__|
// | 1 1 1 | /
// |_________|
Это как?
Автор: Rudia
Дата сообщения: 13.12.2007 16:55
ellic
int a[3][3][3] = {{{1,1,1},{1,1,1},{1,1,1}}, {{2,2,2},{2,2,2},{2,2,2}}, {{3,3,3},{3,3,3},{3,3,3}}};
Автор: ellic
Дата сообщения: 13.12.2007 17:10
Rudia Спасибо тебе огромное)))))

Автор: MFPSoftware
Дата сообщения: 14.12.2007 21:21
При выводе переменной типа string через cout, компилятор выдает ошибку:

Код:
d:\programs\microsoft visual studio\vc\include\ostream(653): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]

...
while trying to match the argument list '(std::ostream, std::string)'
Автор: Rudia
Дата сообщения: 14.12.2007 21:48
MFPSoftware
#include <string>
Автор: MFPSoftware
Дата сообщения: 14.12.2007 23:04
Странно. А чем string.h отличается от string?
Автор: BrdGuest
Дата сообщения: 14.12.2007 23:22
MFPSoftware
string.h - сишный хедер с прототипапим строковых функций
string - си++'ный хедер, в котором описаны шаблонные ф-ции для basic_string, basic_istream, basic_ostream. Открой два хедера и сравни содержимое.

Добавлено:
Мне надо считать введённую строку, начиная с первого непробельного символа (пробельным символом считается ' ' и '\t'). После этого непробельного символа могут идти как пробелы, так и нет. Например, из введённой строки " abc fht httnhh htht htht tn 3443ht " считываем "abc fht httnhh htht htht tn 3443ht " (кавычки, естественно, в строку не входят). Можно, конечно, выделить буфер длиной 4094 символов (столько максимум можно ввести в xp'шном cmd), fgets'ом получить всю строку и удалить из неё первые пробельные символы. Но на это тратится слишком много памяти (тем более, если учесть, что ограничение в 4094 символа можно обойти, вызвав прогу как-нибудь так: prog.exe < big_text_file.txt). После первого непробельного символа нужных символов будет штук двести. Дальше можно всё обрезать. В общем, мне надо что-то, типа scanf("%200[\t \x21-\xFF]", s), в котором [\t ] начинает учитываться только после первого непробельного символа.

Возможно, несколько сумбурно выразился. Но, извините. Ночь ведь )
Автор: Qraizer
Дата сообщения: 17.12.2007 12:13

Код: std::string buffer;
std::getline(ins >> std::ws, buffer);
Автор: KChernov
Дата сообщения: 17.12.2007 13:55
Есть ли в С++ динамические массивы?
То есть чтобы можно было объявить массив с размерностями, являющимися переменными, а не константами.
Конкретно сейчас надо внутри функции объявить временный 4-х мерный массив по размерностям, которые переданы как параметры.

Варианты типа
Код: void bcp(long NX, long NY, long NZ) {
    double *e = (double *)new double[NZ][NX][NY][TP_SIZE];}
Автор: ItsJustMe
Дата сообщения: 17.12.2007 14:45
для начала убери размеры у e.

Код: double ****e;
Автор: KChernov
Дата сообщения: 17.12.2007 15:16
ItsJustMe
У меня получилась вот такая хрень:
Код:     double ****e;
    ***e = new double[NZ];
    for(j=0;j<NZ;j++) {
        **e[j] = new double[NX];
        for(i=0;i<NX;i++) {
            *e[j][i] = new double[NY];
            for(k=0;k<NY;k++) {
                e[j][i][k] = new double[TP_SIZE];
                for(kk=0;kk<TP_SIZE;kk++) {
                    e[j][i][k][kk] = 0.;
                }
            }
        }
    }
Автор: xdude
Дата сообщения: 17.12.2007 15:41
KChernov
В обратном порядке вообще-то надо было в таком случае идти. А ты сразу разыменовываешь указатель, который ещё не был проинициализирован.
Сначала инициализируй e, потом e[i], потом e[i][j] и т.д.
Автор: KChernov
Дата сообщения: 17.12.2007 15:53
xdude

Цитата:
Сначала инициализируй e

А как?
Я попробовал так
Код:     e = (double ***)new ***double[NZ];
Автор: distance
Дата сообщения: 17.12.2007 16:08
KChernov
на твои мучения больно смотреть ...
пример из официальной документации к Boost MultiDimensional Array Libary

Код: #include "boost/multi_array.hpp"
#include <cassert>

int
main () {
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);

// Assign values to the elements
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;

// Verify values
int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
assert(A[i][j][k] == verify++);

return 0;
}
Автор: KChernov
Дата сообщения: 17.12.2007 16:15
distance

Цитата:
на твои мучения больно смотреть ...
пример из официальной документации к Boost MultiDimensional Array Libary

Спасибо за сочувствие
Но я правильно понимаю, что здесь используется библиотека boost для решения этой проблемы?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.