Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

Альтернативный вызов функции - C++

15.08.2014, 10:44. Просмотров 2562. Ответов 66
Метки нет (Все метки)

1. Интересует метод вызова функции через указатель(или по другому).
2. Интересует метод взятия кол-ва аргументов функции и их типов, а так же тип возвращяемого значения.

По второму пункту вообще ничего не нашёл, а по первому есть некоторые вопросы.
C++
1
2
3
4
5
6
7
8
9
#include "FTD2XX.h" // библиотека от FTDI
typedef FT_STATUS (*pFT_Open) (int, FT_HANDLE *); // тип данных "функция FT_OPEN"
 
HMODULE hMod = LoadLibrary ("FTD2XX.dll"); // загрузка библиотеки - д. б. не ноль
pFT_Open pOpen = GetProcAddress (hMod, "FT_Open"); // получили адрес функции - также д. б. не ноль
 
FT_STATUS st = pOpen (0, &hDev);    // вызываем функцию
 
FreeLibrary (hMod); // закрыли библиотеку
Нашёл вот такой вот вызов функции через строку названия функции "FT_Open". Меня интересует, если не создавать DLL, то можно ли как то вызвать подобным способом стандартную функцию (например из winuser.h)?

Ещё заинтересовало такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
void check(char *a, char *b, int (*cmp) (const char *, const char *));
int main(void)
{
char s1 [80], s2[80];
int (*p) (const char*, const char*);
p = strcmp; /* получение адреса strcmp() */
gets(s1);
gets (s2);
check(s1, s2, p);
return 0;
}
 
void check (char *a, char *b, int (*cmp) (const char *, const char *))
{
printf("Testing for equality.\n");
if(!(*cmp) (a, b)) printf("Equal");
else printf("Not equal");
}
Однако тут явно указывается кол-во членов и их тип :
C++
1
int (*p) (const char*, const char*);
Что мне не подходит, можно как то это преодолеть? И ещё меня не устраивает что надо явно писать:
C++
1
p = strcmp;
А не строковой (char *) переменной, что дало бы возможность динамики (ну именно это в конечном итоге меня и интересует).

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

Вообще по поводу пункта 2: подумалось, что если реализовать пример1, то нужен будет список функций, который я в принципе могу хранить в txt фале вместе с кол-вом аргументов и возвращяемым значением, хотя это будет тупое копирование строк из .h файлов, к примеру из winuser будут подобия:
C++
1
WINUSERAPI LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM);
От сюда я могу "запарсить" и искомое извлечь для выполнения операции. Не думаю что будет смысл париться над пунктом2, т.к. игра не стоит свеч, значит стаётся открытым вопрос первый.

Добавлено через 29 минут
Узнал что это:
C++
1
typedef FT_STATUS (*pFT_Open) (int, FT_HANDLE *);
являет прототипом функции. В общем вот эту инициализацию прототипа можно обойти? Т.е. подразумеваю что например у меня будет динамический массив с переменными, после парсинга я получу типы, и согласно им - заполню массив. Далее если бы можно было бы реализовать вызов GetProcAddress с сылкой на массив, то хотелось бы чтоб автоматически передавались в аргументы значения массива от [1] и до кол-ва аргументов ( [0] аргумент думаю будет идти как возвращяемое значение функции)... (может как то можно использовать в данном случае переменное кол-во аргументов в функции?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2014, 10:44     Альтернативный вызов функции
Посмотрите здесь:

C++ Вызов функции
C++ Вызов функции
C++ Вызов функции в C++
C++ Вызов функции!
Вызов функции в возврате значения функции C++
C++ Вызов функции
Вызов функции C++ Builder
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
15.08.2014, 21:24  [ТС]     Альтернативный вызов функции #21
Цитата Сообщение от DrOffset Посмотреть сообщение
тем более зачем бацать хидер, когда он уже есть
Видимо имелось в виду что мне придётся делать хедер с указанием на каждую функцию своего прототипа. Но это не вариант, слишком много получится, да и наверно к 1000 функциям одни эти прототипы займут тучу памяти или времени для поиска...
Цитата Сообщение от DrOffset Посмотреть сообщение
... В этом случае главное только, чтобы фактический тип их аргументов не сильно различался с тем, что передано. Естественно никакого контроля не будет
В смысле double и float можно эквивалентно равными считать? (ну я думаю что разница в 7-ом знаке после запятой не сильно скажется на точности, ну я не стремлюсь к такой скурпулёзности, важен сам принцип скорее)
Контроль наверно будет исходя из сравнения аргументов функции и передаваемых типов, тут уж сам накалякаю. =)

По поводу питона - это уже бредово, заново изучать целый язык, опять куча синтаксических отличий... не, я хочу с компоновкой данных разобраться и перейти к графике и звуку, заново начинать не разумно.

Цитата Сообщение от DrOffset Посмотреть сообщение
только вид сбоку
Ну не совсем, например я не понял что это за " const mytype* ", это что же я могу свой enum TYPE тоже впихнуть чтоль?
Кстати, а можно в качестве возвращяемого значения поставить void, а потом переопределить согласно возвращяемому значению? Типа чтоб написать:
C++
1
typedef void* (*Make_func) (...);
Добавлено через 9 минут
Цитата Сообщение от Voivoid Посмотреть сообщение
какая тут связь
Связь в 1000 функциях, и к каждой писать прототип - "нет, спасибо, я пойду" =)

Цитата Сообщение от Voivoid Посмотреть сообщение
так, как положено
Не через "кривую ногу", на столько кривую, что меня от такого кода стошнит. (это весьма вероятно, я уже представил себе хидер с 1000 прототипами)

Цитата Сообщение от Voivoid Посмотреть сообщение
какой цели хочешь вообще всем этим достичь?
и
Цитата Сообщение от Програмер_80лвл Посмотреть сообщение
объяснишь что ты пытаешься сделать
ответ в том что я хочу к своей динамической матрице(ссылка в 5 посте) переменных привязать возможность использования функций, но писать стандартно каждую функцию я не хочу, хочу динамики, хотя бы мнимой (как мнимая 3д графика, которая один хрен выводится на плоский монитор) В общем, нужны указатели на функции.

Добавлено через 10 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
решение его вопроса было еще на первой странице
Решение так же есть в STL и векторах, на сколько я понял(хотя я не понимаю их, ну не нравится синтаксис, гадко выглядит), но я их не беру априори, потому что.(надоело повторять)
То что челы чё та там сделали - не решает сути того что я хочу не просто чтоб всё работало, а чтоб это выглядело понятно.(опять повторяюсь)

Цитата Сообщение от Voivoid Посмотреть сообщение
от статической типизации вреда больше чем пользы ( ловить ошибки в compile-time? не, лучше падать в рантайме )
Дело не во "вреде и пользе", а в том что "я на месте не стою, щяс пойду и попляшу" Это я к тому что хочу чтоб программа сама плясала, а я ей только название танца давал бы. Ловить ошибки - с чего это? Если я правильно типы буду указывать и проверять, функции с непонятными типами - пропускать (ну доработаю если надо будет).
Програмер_80лвл
15 / 15 / 1
Регистрация: 17.10.2012
Сообщений: 96
Записей в блоге: 1
15.08.2014, 21:27     Альтернативный вызов функции #22
Цитата Сообщение от Izual Посмотреть сообщение
но писать стандартно каждую функцию я не хочу, хочу динамики, хотя бы мнимой
Вам нужен подход ООП. То есть создать Object и что бы все типы принебригались к нему(то есть как в шарпе, всё наследовано от Obkect)
тогда уже можно использовать неограниченое кол-во параметров(вроде в плюсах есть такая хрень, "..." )
Возможно я не прав, потому что давно плюсы изучал.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
15.08.2014, 21:29     Альтернативный вызов функции #23
Цитата Сообщение от Izual Посмотреть сообщение
Ловить ошибки - с чего это? Если я правильно типы...
В этом 'если' вся суть. Звучит как 'давайте просто не будем делать ошибки, делов-то'. По поводу плясок, кстати получается обратная ситуация. Ты отказываешься от того, чтобы плясал компилятор ( проверяя типы ) и вместо этого хочешь плясать сам ( все указывая руками )
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
15.08.2014, 21:38  [ТС]     Альтернативный вызов функции #24
Voivoid, ты мне предлагаеш для каждой функции писать прототип или что? Ты если не согласен с моим методом - скажи свой, а то звучит как то странно. Но думаю что и ты не согласишся под 1000 функций писать прототипы.(даже если это сделает парсер, то как ни крути сколько же памяти сожрёт этот метод?)

Цитата Сообщение от Програмер_80лвл Посмотреть сообщение
Вам нужен подход ООП
Так я пытаюсь реализовать принципы ООП, но без векторов, STL и классов. А так сказать старыми методами. (вот например ссыль в 5 посте показывает как можно без вектора добиться динамического массива с изменяемыми типами переменных, а ведь таким сейчас ~никто не пользуется, у всех шаблоны, *bored*)
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
15.08.2014, 21:39     Альтернативный вызов функции #25
Цитата Сообщение от Izual Посмотреть сообщение
Ну не совсем, например я не понял что это за " const mytype* ", это что же я могу свой enum TYPE тоже впихнуть чтоль?
Неа. Это основано на том, что mytype * кастится к void*, поэтому и общий каст прототипа функции void(*)(mytype*,mytype*) относительно безопасно можно скастить к void(*)(void*,void*).
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, а можно в качестве возвращаемого значения поставить void, а потом переопределить согласно возвращяемому значению? Типа чтоб написать:
void* - это только указатели. Все что угодно так не вернешь. Тем более как ты узнаешь что там на самом деле лежит? Даже если память выделять динамически и возвращать на нее указатель, то ее же надо как-то освобождать, да и понять что же там на самом деле в общем случае будет невозможно без дополнительной информации.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
15.08.2014, 21:48  [ТС]     Альтернативный вызов функции #26
Цитата Сообщение от DrOffset Посмотреть сообщение
Тем более как ты узнаешь что там на самом деле лежит?
А это нужно? То есть, я то узнаю, я же прочту из файла тип возвращяемого значения и v[o].t установлю в INT, далее запишу значение после выполнения.
Цитата Сообщение от DrOffset Посмотреть сообщение
понять что же там на самом деле
Так же как и в той теме(наверно, хотя с void* я ещё не работал, честно говоря синтасис "char *s" я вообще в первые попробовал, всегда явно указывал на переменную):
C++
1
2
3
4
 if(v[i].t == STR)
            {
                delete[] v[i].d.s;
            }
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
15.08.2014, 21:57     Альтернативный вызов функции #27
Цитата Сообщение от Izual Посмотреть сообщение
А это нужно?
А как ты с ним будешь работать, если не знаешь что это?
Цитата Сообщение от Izual Посмотреть сообщение
Так же как и в той теме(наверно, хотя с void* я ещё не работал, честно говоря синтасис "char *s" я вообще в первые попробовал, всегда явно указывал на переменную):
А если там не массив? То тогда уже надо вызвать delete без []. Уже это ты не отличишь без доп инфы. А если там вообще память не через new выделена была? Например через malloc, тогда уже надо free вызывать. А если runtime, с которым собиралась библиотека другой версии, то тогда нужно будет функцию освобождения из того же runtime использовать, а не из своего. А если там библиотека вообще на другом языке написана? А если там не указатель на самом деле возвращается?
В общем - это тупиковый путь. Все эти "если" ты, имея только void*, не распознаешь.

Добавлено через 4 минуты
Izual, В общем я считаю, что тебе информации тут дали вагон и маленькую тележку. Разбирайся.
По мне, так та библиотека - это лучший выход, если хочешь остаться в рамках С\С++.
Но решать тебе. Короче, удачи.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
15.08.2014, 22:00     Альтернативный вызов функции #28
Цитата Сообщение от Izual Посмотреть сообщение
Voivoid, ты мне предлагаеш для каждой функции писать прототип или что?
Я предлагаю в статически типизированном языке оставаться в рамках системы типов и не пытаться головой пробить стену. Я честно говоря так и не понял что ты хочешь получить ( может я невнимательно читаю конечно, хз ), поэтому что-то конкретно посоветовать не могу.

Цитата Сообщение от Izual Посмотреть сообщение
вот например ссыль в 5 посте показывает как можно без вектора добиться динамического массива с изменяемыми типами переменных, а ведь таким сейчас ~никто не пользуется, у всех шаблоны, *bored*)
Да уж все новое - это хорошо забытое старое
В 80-х все мучились с динамическими массивами и вариантными типами из-за бедности языковых средств. Чтобы уменьшить сложность разработки ( ну и как следствие сократить количество испытываемой программистами боли ) в 90-х придумали шаблоны. В 2014 году читать, про то, что это все не нужно и надо все делать руками это, ну-ну-ну, кхм, весьма странно.

PS: Если что, я тут с хронологией весьма вольно обошелся, но идея должна быть ясна.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
16.08.2014, 15:44  [ТС]     Альтернативный вызов функции #29
Так, выкладываю первые тесты.
Тест первый, просто статически описал загрузку функции MessageBoxA. (хотя мучался долго, пока не дописал "_stdcall" в прототипе функция вызывалась, но на возврате значения вылезала ошибка и прога рушилась) Прикрепил архив, где Test1.exe это он и есть. Тест 1 работает.
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
//Test 1
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include "windows.h"
#include "windowsx.h"
#include <iostream>
#include <string.h>
 
using namespace std;
 
//typedef int(_stdcall *Make_func)(...);
typedef int(_stdcall *Make_func)(HWND, char *, char *, UINT);
 
int _tmain(int argc, _TCHAR* argv[])
{
    char fn[50]="MessageBoxA";
    int res=0;
    HMODULE hMod = LoadLibrary ("user32.dll");
    if(!hMod)
        cout << "Library not loaded" << endl;
    else
    {
        Make_func me = (Make_func)GetProcAddress(hMod,fn);
        if(!me)
            cout << "Function not loaded" << endl;
        else
        {
            res = me(NULL,"hi","message",NULL);
            cout << res << endl;
        }
        FreeLibrary (hMod);
    }
    getch();
    return 0;
}
Далее Тест2:
C++
1
2
typedef int(_stdcall *Make_func)(...);
//typedef int(_stdcall *Make_func)(HWND, char *, char *, UINT);
Просто заменил прототип, остальное всё так же.
Результат выполнения: MessageBox появляется, но как только его закрываеш вылезает ошибка:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Видимо на возврате значения, хоть подобная ошибка вылезала и в первом тесте до тех пор пока я stdcall не дописал. Но в тесте 2 я уже не знаю куда копать. =(
Тест 2.exe так же в архиве.

П.С. Извиняюсь сразу за кучу инклюдов, я обычно не помню какие нужны, так что пихаю все подряд)))
Вложения
Тип файла: rar Test.rar (17.8 Кб, 1 просмотров)
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
16.08.2014, 17:45     Альтернативный вызов функции #30
Цитата Сообщение от Izual Посмотреть сообщение
Но в тесте 2 я уже не знаю куда копать.
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида (причем на моей VS 2012 это происходит только в отладочной сборке).
Вот код:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    DWORD PTR _me$1[ebp]
    add esp, 16                 ; Проблема тут(!)
    cmp esi, esp
    call    __RTC_CheckEsp
    mov DWORD PTR _res$[ebp], eax
При stdcall вызове очистку стека производит вызываемая функция. Однако, как мы видим по коду, VS пытается произвести очистку еще раз, уже в нашем коде. Подробнее тут.
В общем, как я уже говорил, работающий во всех случаях вариант без асма (хотя бы без знания) сделать будет тяжело (или даже невозможно).

Добавлено через 34 минуты
Вот код, который гененирует VS в релизе (я вручную добавил дебажную проверку):
Assembler
1
2
3
4
5
6
7
8
9
    mov esi, esp ; for check
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    eax
    cmp esi, esp  ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp  ;  for check
Этот код не падает. Кстати mingw ведет себя корректно (учитывает stdcall у прототипа с ...), генерирует для твоего примера вот такой код:
Assembler
1
2
3
4
5
6
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET FLAT:LC4
    mov DWORD PTR [esp+4], OFFSET FLAT:LC5
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
Здесь видно, что у него немного иной подход к изменению esp (когда кладем параметры на стек, то esp не меняется, зато потом, после вызова, мы корректируем его на правильное значение один раз).
Я переписал код для VS таким же способом и вставил проверку:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp ; for check
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET ??_C@_07ONPBMBOP@message?$AA@
    mov DWORD PTR [esp+4], OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
    cmp esi, esp ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp ; for check
Все работает отлично.
Не знаю чего тут посоветовать: юзай mingw, если не хочешь связываться с ассемблером
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
17.08.2014, 08:43  [ТС]     Альтернативный вызов функции #31
DrOffset, я нашёл другой выход, хотя он не так красив как тот который я хотел бы использовать (с троеточием), но зато решает проблему.

C++
1
typedef int(_stdcall *Make_func)(void *,void *,void *,void *);
Естественно, придётся от 0 до 10 прототипов сделать(соответствующих кол-ву аргументов), и возвращяемое значение так же привести к void* (что я попробую чуть позже).
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
17.08.2014, 15:36     Альтернативный вызов функции #32
Цитата Сообщение от Izual Посмотреть сообщение
я нашёл другой выход
Не будет работать с целыми больше 32 разрядов на 32 битной архитектуре, не будет работать с числами с плавающей точкой.
В общем в каких-то случаях работать будет, но это точно не самое корректное решение. Имей это в виду.

Добавлено через 2 минуты
Почитал бы ты литературу, на самом деле. А то, что сейчас - это же чистое шаманство. Хоть бы узнал на что тебе можно рассчитывать, а на что нет.
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
17.08.2014, 16:47     Альтернативный вызов функции #33
Цитата Сообщение от DrOffset Посмотреть сообщение
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида
Так и должно быть.
The called function cleans the stack, unlike CDECL. This means that STDCALL doesn't allow variable-length argument lists.
Подробнее тут и еще тут.

Альтернативный вариант:
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
#include <windows.h>
#include <windowsx.h>
#include <iostream>
 
using namespace std;
 
//typedef int( _stdcall *Make_func )( HWND, char *, char *, UINT );
 
//typedef int( _stdcall *Make_func )( ... ); // _stdcall не может иметь переменное число аргументов.
                                             // [url]http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL[/url]
 
template<typename ...Args>
auto get_type( Args ... ) -> int( _stdcall *)( Args... ); // а вот так может.
 
int main()
{
  char fn[] = "MessageBoxA";
  int res = 0;
  HMODULE hMod = LoadLibraryA ( "user32.dll" );
  if ( !hMod )
    cout << "Library not loaded" << endl;
  else
  {
    void * me = GetProcAddress( hMod, fn );
    if ( !me )
      cout << "Function not loaded" << endl;
    else
    {
      using func_type = decltype( get_type((HWND)NULL, "hi", "message", (UINT)NULL) ); // выведем тип функции по ее аргументам
      res = ( (func_type)me ) ( (HWND)NULL, "hi", "message", (UINT)NULL );
 
      cout << res << endl;
    }
    FreeLibrary ( hMod );
  }
  return 0;
}
Добавлено через 12 минут
Упрощенный вариант
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
#include <windows.h>
#include <windowsx.h>
#include <iostream>
 
using namespace std;
 
//typedef int( _stdcall *Make_func )( ... ); // _stdcall не может иметь переменное число аргументов.
                                             // [url]http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL[/url]
 
// а вот так может.
template<typename ...Args>
int call( void * fun, Args ... args)
{
 using func_type = int( _stdcall *)( Args... ); // выведем тип функции по ее аргументам
 return ( (func_type)fun ) ( args... );
}
 
 
int main()
{
  char fn[] = "MessageBoxA";
  int res = 0;
  HMODULE hMod = LoadLibraryA ( "user32.dll" );
  if ( !hMod )
    cout << "Library not loaded" << endl;
  else
  {
    void * me = GetProcAddress( hMod, fn );
    if ( !me )
      cout << "Function not loaded" << endl;
    else
    {
      res = call(me, (HWND)NULL, "hi", "message", (UINT)NULL );
      cout << res << endl;
    }
    FreeLibrary ( hMod );
  }
  return 0;
}
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
17.08.2014, 16:53     Альтернативный вызов функции #34
StailGot, качественный workaround.
Только вместо void *, для передачи указателя, лучше использовать FARPROC.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
17.08.2014, 19:59  [ТС]     Альтернативный вызов функции #35
Цитата Сообщение от DrOffset Посмотреть сообщение
Не будет работать с целыми больше 32 разрядов на 32 битной архитектуре, не будет работать с числами с плавающей точкой.
Я как нибудь обойдусь 32 разрядами, а по поводу плавающей точки - печаль(не уж то даже float не будет работать с его разрядностью в 4 байта?)
Цитата Сообщение от DrOffset Посмотреть сообщение
Почитал бы ты литературу, на самом деле.
На самом деле уже третий день капаю гугл, но не зная что и где копать - много не выкопаеш.

StailGot, то что вы показали это не вариант для меня, я сразу сказал что векторы и STL не предлогать.
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
17.08.2014, 20:20     Альтернативный вызов функции #36
Цитата Сообщение от Izual Посмотреть сообщение
я сразу сказал что векторы и STL не предлогать.
Это не вектор и не STL ) Это текущий стандарт С++11, используются только базовые возможности, которые часть языка.
Цитата Сообщение от Izual Посмотреть сообщение
На самом деле уже третий день капаю гугл, но не зная что и где копать - много не выкопаеш.
Да я не про гугл, а про книжки, того же Рихтера или Руссиновича. И по ассемблеру что-нибудь.
В интернете вообще вся толковая информация на английском, ища на русском много не накопаешь. Вот ссылку хотя бы изучи, которуя я уже давал, про calling convetions.
Цитата Сообщение от Izual Посмотреть сообщение
не уж то даже float не будет работать с его разрядностью в 4 байта?
А это уже вопрос твоего понимания что такое целое число и что такое число с плавающей точкой и как они передаются на стек и снимаются со стека.
Assembler
1
movsd   QWORD PTR [esp], xmm0
Для справки, QWORD - это 8 байт, хотя в С++ коде, из которого я вынул эту инструкцию, передавал float.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
17.08.2014, 21:03  [ТС]     Альтернативный вызов функции #37
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не вектор и не STL
template, разве?..
Цитата Сообщение от DrOffset Посмотреть сообщение
стандарт С++11
Блин, реально *bored*, мне эти нынешние стандарты по барабану, сколько раз сказать это чтоб уже поняли, что я смотрю не на стандарты, а на простоту понимания. Программирование и так то достаточно сложное, а то что сейчас выводится в стандарты только лишь опускает нас в бездну(сутками чтоли изучать всё появляющиеся стандарты?), а в конце результат - "у нас времени не было", как скажут многие на многие не сделанные вещи, время на которые сожрало изучение догматики.(а стандарты это и есть догматика)
Цитата Сообщение от DrOffset Посмотреть сообщение
вся толковая информация на английском
Ну так я переводчиком, тока один хрен слишком много непонятных моментов между строк, потому результат стремится к нулю)
Цитата Сообщение от DrOffset Посмотреть сообщение
А это уже вопрос твоего понимания
Нет, мы смотрим фактически на <= 32 бита(т.е. 4 байта).

П.С. Как же много всякой ерунды напридумывали, лишь бы людей отвлечь от действительно важных вещей... Вспомнился фильм "Generation П" : "Народу нужна хорошая драка, тогда он про всё забудет, про жену, про квартиру..."
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
17.08.2014, 22:41     Альтернативный вызов функции #38
Цитата Сообщение от Izual Посмотреть сообщение
template, разве?
Разве. Это часть языка. STL - это библиотека, и она не часть языка.

Цитата Сообщение от Izual Посмотреть сообщение
Ну так я переводчиком, тока один хрен слишком много непонятных моментов между строк, потому результат стремится к нулю)
Английский учи Переводчик там тебе напереводит пожалуй.

Учись, все равно как-то семью кормить потом придется
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
17.08.2014, 23:30  [ТС]     Альтернативный вызов функции #39
Цитата Сообщение от DrOffset Посмотреть сообщение
часть языка.
векторы часть, да. Только условие было делать без них..

Не по теме:

есть разные пути, не только "оседлые"
Омммм..

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2014, 23:50     Альтернативный вызов функции
Еще ссылки по теме:

Вызов функции в параметре другой функции C++
Функции в Assembler, вызов функции в C++ C++ Builder
C++ Вызов функции внутри другой функции с передачей локальной переменной по ссылке
C++ Вызов функции
вызов функции из под функции C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6854 / 4065 / 927
Регистрация: 30.01.2014
Сообщений: 6,862
17.08.2014, 23:50     Альтернативный вызов функции #40
Цитата Сообщение от Izual Посмотреть сообщение
векторы часть, да. Только условие было делать без них..
Опять ты невнимательно читаешь. Векторы - это не часть языка, это часть стандартной библиотеки, оно же STL, а ключевое слово template - часть.
Формально условие выполнено было
Yandex
Объявления
17.08.2014, 23:50     Альтернативный вызов функции
Ответ Создать тему
Опции темы

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