Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
1

Скажите, пожалуйста, как проверить аргумент в функции

06.02.2019, 09:06. Просмотров 274. Ответов 15
Метки нет (Все метки)

Есть простая функция, принимающая целое число, нужно поймать исключение, если передали в качестве параметра не целое число. вот пытался.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo(int x) {
    try
    {
        if (x = !(int)x) {
            throw "erorr";
        }
        else{cout << x  << endl;
        }
    }
    catch (const char *str)
    {
        cout <<str << endl;
    }
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2019, 09:06
Ответы с готовыми решениями:

Скажите пожалуйста как отсортировать массив
задано массив действительных чисел отсортировать массив по убыванию

Добрые люди, скажите пожалуйста как выполняется перегрузка операторов
Помогите((( Я не понимаю, как нужно сделать перегрузку операторов * для умножения числа на вектор....

Скажите, пожалуйста, как правильно реализовать работу методов класса в lua api c++
вот самая простая структура. как вызвать ее конструктор и метод в lua. Подскажите, пожалуйста. ...

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

Класс как аргумент функции
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит,...

15
Verevkin
2450 / 1308 / 323
Регистрация: 12.03.2015
Сообщений: 7,098
06.02.2019, 09:12 2
В данном случае передать можно только целое.
0
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 09:51  [ТС] 3
Verevkin, это функция встроена в lua, нужно проверить x это число int?
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
06.02.2019, 09:54 4
Егор Щербанов, в вашем коде x - это всегда число int.
0
06.02.2019, 09:54
Ygg
1868 / 475 / 190
Регистрация: 10.02.2018
Сообщений: 1,040
06.02.2019, 10:05 5
Насколько помню, в LUA у переменной нет типа, как такового. Можно сперва строку присвоить, потом число. Не знаю, как туда сишный код может быть встроен. Но если он как-то встраивается, то функция в качестве аргумента скорее получала бы какой-нибудь VARIANT, а не int. Дальше нужно было бы смотреть описание используемого типа и как из него получить нужную информацию.
0
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 10:07  [ТС] 6
DrOffset, спасибо большое за Ваш ответ, тогда как поймать исключение. пишу lua plugin для gta vc на основе sdk plugin.

C++
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
#include "include/lua.hpp"
#include"LuaBridge/LuaBridge.h"
#include "common.h" 
#include "plugin.h"
#include "CWorld.h"
#include "extensions\KeyCheck.h"
#include "CMessages.h"
using namespace plugin;
using namespace std;
using namespace luabridge;
bool wait(const char k[]) {
    unsigned int key = (unsigned int)k;
    if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
    else { return false; }
}
CPed *findplayer(lua_State* L)  {
    CPed *player = FindPlayerPed();// получить указатель на игрока.
    CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 500;// дать денег
    return player;// вернуть указатель на игрока.
};
 
void sethealth(CPed *player, int health, lua_State* L) {
    CPed *b = (CPed*)Userdata::get<CPed>(L, 1, false);
    b->m_fHealth = health;// уст здоровье игрока.
};
class Message {//имя класса
public: Message() { Events::gameProcessEvent += [] {//обработчик событий игры
    CPed *player = FindPlayerPed();// найти игрока
    if (!player) return;// проверка найден игрок
    KeyCheck::Update();
    if (KeyCheck::CheckWithDelay('M', 200)) {//если м нажата
    if (!wait("M")) return; {//если м отпущена.
        lua_State* L = luaL_newstate();
        luaL_openlibs(L);
        getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
        .beginClass<CPed>("cped")// имя класса в lua.
        .endClass()// закрыть регистрацию класса. 
        .addFunction("findplayer", &findplayer)// возвращает указатель игрока.
        .addFunction("sethealth", &sethealth);// название функции в lua и c++. уст здоровье.
        luaL_dofile(L, "lualoader\\main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
        lua_close(L);// закрыть состояние
}}};}
} message;
lua
C++
1
2
player= findplayer()-- получить игрока
sethealth(player, 150) -- 150 хп.
вдруг мы передали второй параметр в функцию sethealth, не целое число, а строку. как это поймать
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
06.02.2019, 10:13 7
Lua для внутреннего представления чисел использует тип с плавающей точкой (обычно double):
The number type represents real (double-precision floating-point) numbers. Lua has no integer type, as it does not need it.
Если задача состоит в том, чтобы получить от Lua число и проверить целое оно или нет, то сделать это можно так:
C++
1
2
3
4
5
6
7
8
9
double n = lua_tonumber(L, -1);
if (n == (int)n) 
{
    // n  - целое
} 
else 
{
    // n - не целое
}
Добавлено через 1 минуту
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
не целое число, а строку
Сперва нужно проверить, что там вообще число, а не строка. Это можно сделать функцией lua_isnumber.
1
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 10:14  [ТС] 8
DrOffset, спасибо большое, попробую.
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
06.02.2019, 10:21 9
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
вдруг мы передали второй параметр в функцию sethealth, не целое число, а строку. как это поймать
Эм. Вы же используете luabridge, он и так это ловит, разве нет? Ловит и бросает вам исключение.
0
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 10:26  [ТС] 10
DrOffset, по luabridge мало информации, как поймать это исключение. вот, что известно по luabridge.
0
Вложения
Тип файла: rar LuaBridge.rar (149.7 Кб, 2 просмотров)
Verevkin
2450 / 1308 / 323
Регистрация: 12.03.2015
Сообщений: 7,098
06.02.2019, 10:27 11
В данном случае передать можно только целое.
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
Verevkin, это функция встроена в lua, нужно проверить x это число int?
Чо такое lua?
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
06.02.2019, 10:35 12
Егор Щербанов, так что происходит у вас в коде, если вы передаете строку на стороне lua?

Добавлено через 1 минуту
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
по luabridge мало информации
Вообще, информации более чем достаточно на официальном сайте.
http://vinniefalco.github.io/LuaBridge/Manual.html
В частности см раздел "2.2 - Data, Properties, Functions, and CFunctions"
Если вы хотите сами контролировать все параметры, то должны регистрировать CFunction (addCFunction) и самостоятельно снимать и проверять параметры со стека lua (как раз код, который я выше показывал).
0
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 11:07  [ТС] 13
DrOffset, нечего, а нужно чтобы как в moonloder писала в файл не тот аргумент в функции такой. типа отладка. спасибо, попытаюсь, там просто написано все кратко.

Добавлено через 29 минут
не пойму как сделать cfunction принимающую параметр?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int foo(int x, lua_State* L) {
    cout <<x  << endl;
    return 0;
}
 
int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
        .addCFunction("foo", foo);// название функции в lua и c++.
 
    luaL_dofile(L, "main.lua");
 
    lua_pcall(L, 0, 0, 0);
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
    return 0;
}
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
06.02.2019, 11:11 14
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
не пойму как сделать cfunction принимающую параметр?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int foo(lua_State* L) {
    double x = lua_tonumber(L, 1);  /* get 1st argument */
 
    cout << x << endl;
    return 0; 
}
 
int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
        .addCFunction("foo", foo);// название функции в lua и c++.
 
    luaL_dofile(L, "main.lua");
 
    lua_pcall(L, 0, 0, 0);
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
    return 0;
}
0
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 11:16  [ТС] 15
DrOffset, Всё я понял огромное Спасибо, изучал api lua c++
0
Вложения
Тип файла: rar lua_ap.rar (60.0 Кб, 0 просмотров)
Егор Щербанов
4 / 3 / 1
Регистрация: 19.02.2018
Сообщений: 177
06.02.2019, 12:20  [ТС] 16
все, спасибо всем большое, ошибка ловится и записывается в файл, осталось только текущее время прибавить, а не получается..

C++
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
#include<iostream>
#include<string>
#include<fstream>
#include <time.h>
#include"include/lua.hpp"
#include"LuaBridge/LuaBridge.h"
#include"a.h"
using namespace std;
using namespace luabridge;
int foo(lua_State* L) {
 
    time_t t;
    struct tm *t_m;
    t = time(NULL);
    t_m = localtime(&t);
    int h= t_m->tm_hour;
 
    string s = to_string(h);
    cout <<s  << endl;
    //cout << t_m->tm_hour << ":" << t_m->tm_min << ":" << t_m->tm_sec;
try {
    if (LUA_TNUMBER == lua_type(L, -1)) {// значение число.
        double x = lua_tonumber(L, -1);
        int x2 = (int)x;
        if (x == x2) { cout << x2 << endl; }// int
        else { throw "bad argument in function"; }
    }
    else
    {
        throw "bad argument in function";
    }
 
}
catch (const char* x) {
    string path = "log.txt";
    fstream f1; {f1.open(path, fstream::in | fstream::out | fstream::app);
    f1 << x << "\n"; }
    f1.close();
 
}
    return 0;
}
 
int main() {
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
        .addCFunction("foo", foo);// название функции в lua и c++.
 
    luaL_dofile(L, "main.lua");
 
    lua_pcall(L, 0, 0, 0);
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
    return 0;
}
0
06.02.2019, 12:20
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2019, 12:20

Auto как аргумент функции
Возможно ли объявить параметр функции как auto? void func(auto pt); //...

Как сделать ввод в аргумент(ы) функции?
Не понятно посмотрите код)#include&lt;iostream&gt; #include&lt;time.h&gt; using namespace std; template...

Произвольный объект как аргумент функции
Здравствуйте! Подскажите, пожалуйста, можно ли функции передавать произвольный объект? В Java...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.