Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

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

15.08.2014, 10:44. Показов 6795. Ответов 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] аргумент думаю будет идти как возвращяемое значение функции)... (может как то можно использовать в данном случае переменное кол-во аргументов в функции?)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2014, 10:44
Ответы с готовыми решениями:

Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int...

Вызов функции из другой функции и обратно. Общие переменные функций
Всем привет. Заранее напишу, что я ещё только изучаю программирование В данной программе генирируются числа заполняющие одним...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

66
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
15.08.2014, 21:24  [ТС]
Цитата Сообщение от 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? не, лучше падать в рантайме )
Дело не во "вреде и пользе", а в том что "я на месте не стою, щяс пойду и попляшу" Это я к тому что хочу чтоб программа сама плясала, а я ей только название танца давал бы. Ловить ошибки - с чего это? Если я правильно типы буду указывать и проверять, функции с непонятными типами - пропускать (ну доработаю если надо будет).
0
15 / 15 / 1
Регистрация: 17.10.2012
Сообщений: 98
Записей в блоге: 1
15.08.2014, 21:27
Цитата Сообщение от Izual Посмотреть сообщение
но писать стандартно каждую функцию я не хочу, хочу динамики, хотя бы мнимой
Вам нужен подход ООП. То есть создать Object и что бы все типы принебригались к нему(то есть как в шарпе, всё наследовано от Obkect)
тогда уже можно использовать неограниченое кол-во параметров(вроде в плюсах есть такая хрень, "..." )
Возможно я не прав, потому что давно плюсы изучал.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
15.08.2014, 21:29
Цитата Сообщение от Izual Посмотреть сообщение
Ловить ошибки - с чего это? Если я правильно типы...
В этом 'если' вся суть. Звучит как 'давайте просто не будем делать ошибки, делов-то'. По поводу плясок, кстати получается обратная ситуация. Ты отказываешься от того, чтобы плясал компилятор ( проверяя типы ) и вместо этого хочешь плясать сам ( все указывая руками )
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
15.08.2014, 21:38  [ТС]
Voivoid, ты мне предлагаеш для каждой функции писать прототип или что? Ты если не согласен с моим методом - скажи свой, а то звучит как то странно. Но думаю что и ты не согласишся под 1000 функций писать прототипы.(даже если это сделает парсер, то как ни крути сколько же памяти сожрёт этот метод?)

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

Добавлено через 4 минуты
Izual, В общем я считаю, что тебе информации тут дали вагон и маленькую тележку. Разбирайся.
По мне, так та библиотека - это лучший выход, если хочешь остаться в рамках С\С++.
Но решать тебе. Короче, удачи.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
15.08.2014, 22:00
Лучший ответ Сообщение было отмечено volodin661 как решение

Решение

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

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

PS: Если что, я тут с хронологией весьма вольно обошелся, но идея должна быть ясна.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
16.08.2014, 15:44  [ТС]
Так, выкладываю первые тесты.
Тест первый, просто статически описал загрузку функции 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 Кб, 2 просмотров)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
16.08.2014, 17:45
Цитата Сообщение от 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, если не хочешь связываться с ассемблером
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.08.2014, 08:43  [ТС]
DrOffset, я нашёл другой выход, хотя он не так красив как тот который я хотел бы использовать (с троеточием), но зато решает проблему.

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

Добавлено через 2 минуты
Почитал бы ты литературу, на самом деле. А то, что сейчас - это же чистое шаманство. Хоть бы узнал на что тебе можно рассчитывать, а на что нет.
0
28 / 23 / 12
Регистрация: 25.08.2013
Сообщений: 44
17.08.2014, 16:47
Цитата Сообщение от 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;
}
3
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
17.08.2014, 16:53
StailGot, качественный workaround.
Только вместо void *, для передачи указателя, лучше использовать FARPROC.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.08.2014, 19:59  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не будет работать с целыми больше 32 разрядов на 32 битной архитектуре, не будет работать с числами с плавающей точкой.
Я как нибудь обойдусь 32 разрядами, а по поводу плавающей точки - печаль(не уж то даже float не будет работать с его разрядностью в 4 байта?)
Цитата Сообщение от DrOffset Посмотреть сообщение
Почитал бы ты литературу, на самом деле.
На самом деле уже третий день капаю гугл, но не зная что и где копать - много не выкопаеш.

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

П.С. Как же много всякой ерунды напридумывали, лишь бы людей отвлечь от действительно важных вещей... Вспомнился фильм "Generation П" : "Народу нужна хорошая драка, тогда он про всё забудет, про жену, про квартиру..."
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
17.08.2014, 22:41
Цитата Сообщение от Izual Посмотреть сообщение
template, разве?
Разве. Это часть языка. STL - это библиотека, и она не часть языка.

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

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

Не по теме:

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

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
17.08.2014, 23:50
Цитата Сообщение от Izual Посмотреть сообщение
векторы часть, да. Только условие было делать без них..
Опять ты невнимательно читаешь. Векторы - это не часть языка, это часть стандартной библиотеки, оно же STL, а ключевое слово template - часть.
Формально условие выполнено было
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2014, 23:50

Вызов функции визуал бейсика из функции явы скрипта
Как такое соорудить, есть например две наипростецкие функции: &lt;% function base() h11='123' base = h11 end function %&gt; ...

Вызов функции из другой функции после нажатия на кнопку
Помогите, пожалуйста! Никак не могу понять почему не запускается функция d() Полный код: &lt;script language=&quot;javascript&quot;&gt;...

Вызов массива, сформированной в одной функции с другой функции
Здравствуйте! Есть разрабатываемое решение - состоящее из main.cpp и array.cpp Main - выражает собой меню в консольном режиме по...

Автоматический вызов функции при вызове функции
Доброго времени суток! Есть задача по событие вызова некой функции назовем ее function1(), автоматически должна срабатывать функция...

Не работает без указателя вызов функции в функции
int AmountOfSquares(int **Array) { NumberOfSquares++; for (i = iTempTwo + 1; ((i&lt;(iTemp + SizeOfSquare)) &amp;&amp;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru