Error c3861 rand

rand: идентификатор не найден C++/CLI Решение и ответ на вопрос 350664

Astrcomp.ru

0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

1

12.09.2011, 16:05. Показов 11880. Ответов 18

Метки нет (Все метки)


Доброго времени суток. Изучаю VС++, не знаю, что делаю не правильно, не могу запустить простейшую программу. пишу в MS VS 2008 C++ приложение windows form, программа

C++
1
2
3
4
private: System::Void timerl_Tick(System::Object^ sender, System::EventArgs^ e) {
int x1,x2,y1,y2;
x1=rand();
}

выдает ошибку при запуске …Form1.h(132) : error C3861: rand: идентификатор не найден

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Кошковед

520 / 508 / 63

Регистрация: 12.04.2010

Сообщений: 1,390

12.09.2011, 16:34

2

std::rand() % 100;



1



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

12.09.2011, 17:02

 [ТС]

3

объяснить, зачем это надо записать и куда, и вот еще то что это файл form1.h это нормально?



0



sandye51

12.09.2011, 22:02

Не по теме:

тебе сначала бы книгу простейшую прочитать, хотя бы Павловскую.



1



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

12.09.2011, 23:05

 [ТС]

5

ты думаешь я с головы взял такой код? простейший код и выдает ошибку



0



Freelance

Эксперт С++

2887 / 1822 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

12.09.2011, 23:36

6

Цитата
Сообщение от Astrcomp.ru
Посмотреть сообщение

rand: идентификатор не найден

<cstdlib> подключено ?



0



sandye51

12.09.2011, 23:55

Не по теме:

так вина в этом не кода или компилятора, а твоя :-|



0



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

13.09.2011, 09:15

 [ТС]

8

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

Добавлено через 2 минуты
добавил в cmd.cpp
#include <cstlib>
не помогло



0



Кошковед

520 / 508 / 63

Регистрация: 12.04.2010

Сообщений: 1,390

13.09.2011, 09:31

9

>_<
напиши вместо своего rand()
std::rand() % 100;

все же книжку в зубы и попер читать



0



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

13.09.2011, 10:06

 [ТС]

10

книга давно в зубах Пахомов C/C++ и MS Visual C++ 2008 для начинающих(у меня MS Visual C++ 2008), глава 11 страница 461(чтобы было понятно что я ЧИТАЮ книгу)там написано

Код

int x1,x2,y1,y2;
x1=rand();
x2=rand();
y1=rand();
y2=rand();

обЪясни пожалуйста почему в книге написано не правильно, и еще куда и почему надо записать

и с какой это книги взято???



0



co6ak

13.09.2011, 10:23

Не по теме:

продай книгу, купи бигмак и колу



0



Эксперт JavaЭксперт С++

8378 / 3600 / 419

Регистрация: 03.07.2009

Сообщений: 10,708

13.09.2011, 10:45

12

Цитата
Сообщение от Astrcomp.ru
Посмотреть сообщение

обЪясни пожалуйста почему в книге написано не правильно, и еще куда и почему надо записать

В книге все написано правильно, просто вы пытаетесь изучить питон по книге по джаваскрипту.
Вы создали проект CLR — С++.NET(по сути тот же C#, только с измененным синтаксисом и возможностью добавления некоторых конструкций нативного С++).

Добавлено через 31 секунду
Используйте те средства, которые предоставляет вам .NET и используйте System.Random Class
Или второй вариант — не спешите лезть в GUI, тем более .NET, а изучайте по порядку — создавайте Win32 Console Application и в нем пишите. Потом переходите к GUI, только не к WinForms, а MFC/WinAPI и только после этого смотрите в сторону .NET или Qt



0



Эксперт .NET

1819 / 1328 / 426

Регистрация: 10.06.2011

Сообщений: 2,117

13.09.2011, 11:01

13

Astrcomp.ru, подключите «stdlib.h».
И вообще попробовали хотя бы в Яндексе или Гугле набрать запрос «rand». Туже вам и куча кодов, и примеров, и куда вставлять. Вот к примеру первая ссылка на Яндексе.
Да и на данном сайте уже есть подробное описание про случайные числа.



0



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

13.09.2011, 11:32

 [ТС]

14

не можете подсказать какой же проект нужно создать, чтобы там была панлеь элементов, потому что в 11 главе идет речь об этой панели, а тот пункт который я читаю рассказывает об компоненте timer. Я думал надо создавать проект приложение Windows Form. вот полный листинг программы который записан в книге

Код

private: System::Void timer1_Tick(System::Object^ sender,
system::EventArgs^ e)
{
Color ^соl = gcnew Color() ;
Pen ^pen = gcnew Pen(col->Black);
//чтобы создать графический объект, надо получить ссылку на него 
//выполнив метод CreateGraphics() компонента (формы) 
Graphics ^im = this->CreateGraphics();
int x1,x2,y1, y2;
x1=rand(); //функция получения случайного числа 
x2=rand () ; 
y1=rand (); 
y2=rand ();
pen->Width=5; //ширина пера для рисования линии

/*надо привести интервалы случайных чисел, чтобы они попадали в форму*/
if(x1 > 200) 
x1=200-(x1%200) ;
pen->Color=Color::FromArgb (x1) ;
if(х2 > 200)
х2=200-(х2%200) ;
if(y1 > 200)
yl=200— (yl%200);
if(у2 > 200)
у2=200— (у2%200) ;
pen->Color=Color:: FromArgb (x1, х2, y1, у2) ;
im->DrawLine (pen,x1,y1,x2,y2) ;
/*рисует линию между 2-мя точками (х1,у1)и (х2,у2)*/ 
this->progressBar1->Value++;
}

private: System:: Void button1_Click (System::Object^ sender, 
System::EventArgs^ e) 
{
this->progressBar1->Value=0; 
//включение/отключение таймера 
if(!timer1->Enabled)
timer1->Enabled=true;
else
timer1->Enabled=false;
}

Добавлено через 2 минуты
novikov.ea, спасибо помогло, токо я думал подключать надо в в файлы исходного кода(cmd.cpp проект называется cmd), туда я вставил, не пошло, а когда вставил в form1.h то все заработало…



0



Эксперт .NET

1819 / 1328 / 426

Регистрация: 10.06.2011

Сообщений: 2,117

13.09.2011, 11:56

15

Astrcomp.ru, нажмите Ctrl+Alt+X — откроется панель элементов. Найдёте в нём Timer.



1



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

13.09.2011, 11:59

 [ТС]

16

novikov.ea, да просто мне сказали что я не ту книгу читаю и не там программирую, поэтому я и спрашивал какой проект надо создать чтобы была панель элементов, а так у меня все получилось, я думал подключать надо в файл исходного кода(cmd.cpp проект называется cmd), туда я вставил, не пошло, а когда подключил «stdlib.h» в form1.h то все заработало…



0



Эксперт JavaЭксперт С++

8378 / 3600 / 419

Регистрация: 03.07.2009

Сообщений: 10,708

13.09.2011, 14:22

17

Лучший ответ Сообщение было отмечено как решение

Решение

Astrcomp.ru, мда… что я могу сказать… Посмотрел я ее… Выбросьте эту книгу и забудьте про ее существование. Это что-то на уровне Павловской, а может даже выше… Как можно писать на .NET и использовать чтение из файла через File*? Возьмите нормальную книгу или по нативному C++, либо по CLR, а вот это просто выбросьте



3



0 / 0 / 0

Регистрация: 29.03.2011

Сообщений: 49

13.09.2011, 14:36

 [ТС]

18

M128K145, спасибо что посмотрел(+1 поставил), по твоему мнению какую лучше книгу начать читать?



0



Эксперт JavaЭксперт С++

8378 / 3600 / 419

Регистрация: 03.07.2009

Сообщений: 10,708

13.09.2011, 14:50

19

Да хотя бы С. Липпман «С++ для начинающих» и Дж. Либерти «С++ за 21 день».
У Липпмана лучше расписано все



0



Содержание

  1. Ошибка компилятора C3861
  2. Remarks
  3. Примеры
  4. Неопределенный идентификатор
  5. Идентификатор не в области
  6. Требуется квалификация пространства имен
  7. Устаревшая функция, вызываемая
  8. ADL и дружественные функции
  9. ‘random’: ошибка не найден идентификатор
  10. 2 ответы

Ошибка компилятора C3861

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

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

Изменения для удаления устаревших функций из библиотеки среды выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативами, если таковые есть. Дополнительные сведения см. в разделе «Устаревшие функции».

Если ошибка C3861 появляется после миграции проекта из более старых версий компилятора, могут возникнуть проблемы, связанные с поддерживаемыми версиями Windows. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Если макросы WINVER _WIN32_WINNT назначены одной из этих версий Windows, необходимо изменить макросы. Дополнительные сведения см. в разделе «Изменение WINVER и _WIN32_WINNT «.

Примеры

Неопределенный идентификатор

В следующем примере возникает ошибка C3861, так как идентификатор не определен.

Идентификатор не в области

Следующий пример приводит к возникновению ошибки C3861, так как идентификатор виден только в области его определения файла, если он не объявлен в других исходных файлах, использующих его.

Исходный файл C3861_a1.cpp :

Исходный файл C3861_a2.cpp :

Требуется квалификация пространства имен

Для классов исключений в стандартной библиотеке C++ требуется std пространство имен.

Устаревшая функция, вызываемая

Устаревшие функции удалены из библиотеки CRT.

ADL и дружественные функции

Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск, зависящий от FriendFunc аргументов:

Чтобы устранить ошибку, объявите друга в области класса и определите его в области пространства имен:

Источник

‘random’: ошибка не найден идентификатор

Я пытаюсь перенести код, написанный для UNIX, в Visual Studio и получаю следующие ошибки

Код длинный, но я уже включен math.h но я все еще получаю эти ошибки. Возможно, эти функции доступны только для UNIX! Если да, то что я могу сделать?

Вот модифицированный образец моего кода (строки, которые дают мне ошибки);

О, я имею в виду, что не пишите имена функций ВСЕМИ ЗАГЛАВНЫМИ буквами. — Sufian Latif

2 ответы

random -> rand (Не забудьте # include для этого)

И напишите initstate перед основным или сделать предварительное заявление.

Как мне написать initstate перед основным или сделать предварительное заявление? initstate вызывается в другой функции (которая называется моей основной) — Ророноа-Зоро

Для прямого объявления поместите подпись функции в начало кода. — Суфиан Латиф

Извините, если это прозвучало банально. Но у меня нет определения initstate . Разве это не должно быть похоже random ? — Ророноа-Зоро

Тогда как ты звонишь initstate ? — Суфиан Латиф

Используйте функции srand() и rand() от stdlib.h с целью. — Суфиан Латиф

Включите stdlib.h и используйте функцию rand ().

Также функции имеют имена в нижнем регистре cos, log, sqrt.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ visual-studio-2010 random or задайте свой вопрос.

Источник

RRS feed

  • Remove From My Forums
  • Question

  • Hi,

    I want to produce random ‘0’ and ‘1’. I use WindowsXp and VS2005. However, when I used function rand_s(), the compiler cannot recognize it as:
    error C3861: ‘rand_s’: identifier not found

    I just used the example in MSDN about rand_s (http://msdn2.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx).

      What’s problem?
    regards,
    Fangming

Answers

  •  farming wrote:
    Yes, I wrote #define and #include like:

    #define _CRT_RAND_S
    #include <stdlib.h>
    [...]

    
    

    Sometimes the stdlib.h file is already included (directly or indirectly) by system-generated stdafx.h file, therefore your #define and #include do not have effect. You have to move the #define (and maybe #include) to a proper place of stdafx.h and rebuild the solution.


  • You can also do it with rand():

    Code Snippet

    srand((unsigned int)time(NULL));

    for(int i = 0; i < …; ++i)

    {

       int bin_value = rand() % 2;

    }

All replies

  • Did you provide the #define and #include required by the documentation of the function?

  • Yes, I wrote #define and #include like:

    #define _CRT_RAND_S
    #include <stdlib.h>

    Otherwise, could you give me another code?
    Thanks a lot.

    regards,
    Fangming

  • Check your stdlib header for the definition of rand_s, to make sure you’ve got the right (non-corrupt) file.

    Also, which version of VC are you using?

  • You can also do it with rand():

    Code Snippet

    srand((unsigned int)time(NULL));

    for(int i = 0; i < …; ++i)

    {

       int bin_value = rand() % 2;

    }

  •  farming wrote:
    Yes, I wrote #define and #include like:

    #define _CRT_RAND_S
    #include <stdlib.h>
    [...]

    
    

    Sometimes the stdlib.h file is already included (directly or indirectly) by system-generated stdafx.h file, therefore your #define and #include do not have effect. You have to move the #define (and maybe #include) to a proper place of stdafx.h and rebuild the solution.


  •  Viorel. wrote:
    
    

    Sometimes the stdlib.h file is already included (directly or indirectly) by system-generated stdafx.h file, therefore your #define and #include do not have effect. You have to move the #define (and maybe #include) to a proper place of stdafx.h and rebuild the solution.

    Or include it in the project configuration’s C/C++ -> Preprocessor -> Preprocessor Definitions.


  • At this point it’s time to «show us the code», so we can see what else might be wrong.

  • VS9 STANDARD SP1. MFC. In document.cpp I wrote

    #include «stdafx.h»

    #define _CRT_RAND_S//

    #include <stdlib.h>

    rand_s(…)// not active

    —————————

    And point that _CRT_RAND_S using the intellisence, and it show the following popup:

    «#define _CRT_RAND_S__CURSOR__

    Maybe this can help, but I haven’t any chance now for buying new visual studio, so it’s rather big problem, as you can see.

    One more notes:

    1. Definition throught command line options (/D_CRT_RAND_S) — work right.

    2. The suffix __CURSOR__ appended to any structured like the _CRT_RAND_S definition, but I am not tested this properly, so can be in error.

    3. Maybe #ifdef do not eq. #if define(…) in such problematic place?

    4. When MSFT lay out SP2 for visual studio 2008?

     


I’m trying to port a code that was written for UNIX to Visual studio and I’m getting the following errors

random.cpp(29): error C3861: 'initstate': identifier not found
random.cpp(37): error C3861: 'random': identifier not found
random.cpp(49): error C3861: 'random': identifier not found
random.cpp(51): error C3861: 'random': identifier not found
random.cpp(63): error C3861: 'random': identifier not found
random.cpp(78): error C3861: 'SQRT': identifier not found
random.cpp(78): error C3861: 'LOG': identifier not found
random.cpp(78): error C3861: 'COS': identifier not found
random.cpp(87): error C3861: 'ABS': identifier not found

The code is long but the I already included math.h but I’m still getting these errors. It could be that those functions are UNIX-only! If so, what are my options to go about it?

Here’s a modified sample of my code (the lines that are giving me errors);

if( NULL == initstate(2, rngState, 256) )
    do something...

int r = (int)( (rangeEnd - rangeStart) * random() );

double z = SQRT(-2.0 * LOG(x1)) * COS(2.0 * M_PI * x2);

  • Forum
  • General C++ Programming
  • rand_s() issues

rand_s() issues

I am trying to include rand_s() into my source code.

#define _CRT_RAND_S
#include <cstdlib>

I convinced this would work…

BUT IT DIDN’T!!! ARRGH!

1>.main.cpp(23) : error C3861: ‘rand_s’: undeclared identifier

why doesn’t this work?

anybody plz help me! OTL

Hmmm… is there rand_s() function ? From my Linux I only can see int rand(void) and void srand(unsigned int seed) available for use.

Above assume the default provided cstdlib.

Last edited on

there IS a rand_s() in <stdlib.h>, although it is disabled when _CRT_RAND_S is not defined.

Can I know you are on which platform? Linux? Windows? etc etc.

I am currently using Windows 7.

So most likely they do provide rand_s() function. I am referring to Linux cstdlib.h if you read my post correctly.

For your problem, maybe you need to link to some specific libraries (those that have rand_s() functions inside) on top of those default libraries provided in order to be able to access rand_s() function ?

What compiler do you use?

http://cplusplus.com/forum/articles/31613/

Last edited on

This is an example from Visual Studio documentation. Does it wprk ?

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
// crt_rand_s.c
// This program illustrates how to generate random
// integer or floating point numbers in a specified range.

// Remembering to define _CRT_RAND_S prior
// to inclusion statement.
#define _CRT_RAND_S

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int main( void )
{
    int             i;
    unsigned int    number;
    double          max = 100.0;
    errno_t         err;

    // Display 10 random integers in the range [ 1,10 ].
    for( i = 0; i < 10;i++ )
    {
        err = rand_s( &number );
        if (err != 0)
        {
            printf_s("The rand_s function failed!n");
        }
        printf_s( "  %un", (unsigned int) ((double)number /
                       ((double) UINT_MAX + 1 ) * 10.0) + 1);
    }

    printf_s("n");

    // Display 10 random doubles in [0, max).
    for (i = 0; i < 10;i++ )
    {
        err = rand_s( &number );
        if (err != 0)
        {
            printf_s("The rand_s function failed!n");
        }
        printf_s( "  %gn", (double) number / 
                          ((double) UINT_MAX + 1) * max );
    }
}

Of course rand_s does not work in Linux as it uses internally RtlGenRandom API, which is only available in Windows XP and later.

Last edited on

The _s functions in Visual Studio 2005 and beyond are «safe» versions. They are not portable and will only work with Microsoft compilers.

BTW, Microsoft aren’t the only ones (or first ones) to provide «safe» versions of standard C library functions. For example, OpenBSD provides «safe» versions of string functions.

how is rand() «unsafe»? what’s the point of rand_s()?

I didn’t quite see the point either. I never use the «safe» versions of the Microsoft Functions.

I’m generally unsupportive of divergent standards, especially the pointless ones.

See the post here: http://www.devmaster.net/forums/showthread.php?t=12246

Topic archived. No new replies allowed.

Thanks. @antinucleon It outputs the same error.

I may have found where the bug lies. while I tried to comment out all of the function in CreateLayer_ it goes well.

ILayer<xpu>* CreateLayer_(LayerType type,
                          mshadow::Random<xpu> *p_rnd,
                          const LabelInfo *label_info)

template<typename xpu>
ILayer<xpu>* CreateLayer_(LayerType type,
                          mshadow::Random<xpu> *p_rnd,
                          const LabelInfo *label_info) {
        return NULL;
//  if (type >= kPairTestGap) {
//          return new PairTestLayer<xpu>(CreateLayer_(type / kPairTestGap, p_rnd, label_info),
//              CreateLayer_(type % kPairTestGap, p_rnd, label_info));
//   }
//   switch(type) {
//     case kSigmoid: return new ActivationLayer<xpu, op::sigmoid, op::sigmoid_grad>();
//     case kTanh: return new ActivationLayer<xpu, op::tanh, op::tanh_grad>();
//     case kRectifiedLinear: return new ActivationLayer<xpu, op::relu, op::relu_grad>();
//     case kConv: return new CuDNNConvolutionLayer<xpu>(p_rnd);
//     case kBias: return new BiasLayer<xpu>();
//     case kDropout: return new DropoutLayer<xpu>(p_rnd);
//     case kFullConnect: return new FullConnectLayer<xpu>(p_rnd);
//     case kFixConnect: return new FixConnectLayer<xpu>();
//     case kLRN: return new LRNLayer<xpu>();
//     case kFlatten: return new FlattenLayer<xpu>();
//     case kReluMaxPooling: return
//         new PoolingLayer<mshadow::red::maximum, false, xpu, false, op::relu, op::relu_grad>();
//     case kMaxPooling: return new CuDNNPoolingLayer<mshadow::red::maximum, kMaxPooling, xpu>();
//     case kSumPooling: return new PoolingLayer<mshadow::red::sum, kSumPooling, xpu>();
//     case kAvgPooling: return new CuDNNPoolingLayer<mshadow::red::sum, kAvgPooling, xpu>();
//     case kSoftmax: return new SoftmaxLayer<xpu>(label_info);
//     case kConcat: return new ConcatLayer<xpu, 3>();
//     case kChConcat: return new ConcatLayer<xpu, 1>();
//     case kSplit: return new SplitLayer<xpu>();
//     case kXelu: return new XeluLayer<xpu>();
//     case kInsanity: return new InsanityLayer<xpu>(p_rnd);
//     case kInsanityPooling: return new InsanityPoolingLayer<mshadow::red::maximum, kMaxPooling, xpu>(p_rnd);
//     case kPRelu: return new PReluLayer<xpu>(p_rnd);
//     case kBatchNorm: return new BatchNormLayer<xpu>(p_rnd);
//     case kL2Loss: return new L2LossLayer<xpu>(label_info);
//     case kMultiLogistic: return new MultiLogisticLayer<xpu>(label_info);
//     #if CXXNET_USE_CAFFE_ADAPTOR
//     case kCaffe: return new CaffeLayer<xpu>();
//     #endif
//     default: utils::Error("unknown layer type id : "%d"", type); return NULL;
//   }
}

Я новичок в C ++ (используется для кодирования C #) и просто не могу понять, как создать случайное число в среде форм Visual Studio c ++. Это код, который я использую:

int randNumber;
srand(time(NULL));
randNumber = rand();
MessageBox::Show(randNumber.ToString());

Я просто поместил этот код в блок form_load.

Я получаю сообщение об ошибке:

ошибка C3861: «время»: идентификатор не найден

ошибка C3861: ‘rand’: идентификатор не найден

РЕДАКТИРОВАТЬ :

Я включил включения в мой файл Form1.h так:

#pragma once

#include <cstdlib>
#include <ctime>

namespace Srand {

Это похоже на работу, однако случайные числа очень странные.

3100 3130 3146 3169 3192 3208 3231 3250 3270 3286

не кажется случайным вообще, просто случайно больше.

0

Решение

Вы должны включить соответствующие заголовки, такие как

#include <ctime> /* for time */

а также

#include <cstdlib> /* for rand */

Увидеть Вот за rand а также Вот за time,

1

Другие решения

Вам нужно #include <cstdlib> а также #include <ctime>,

0

Поскольку ваши цифры зависят от времени, вы получите очень близкие результаты. Вы можете попытаться рандомизировать свое число, применив некоторое преобразование к time (), например, сначала умножив на очень большое число, а затем применив мод по отношению к некоторому большому простому числу.

0

Понравилась статья? Поделить с друзьями:
  • Error c3861 printf identifier not found
  • Error c3861 min identifier not found
  • Error c3861 gets идентификатор не найден
  • Error c3861 getline идентификатор не найден
  • Error c3861 getch идентификатор не найден