nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 21 Oct 2018 23:10



Reply to topic  [ 28 posts ]  Go to page 1, 2  Next
Перегруженные функции в C++ 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos объясни популярно про Перегруженные функции в C++?

Раньше я сам разбирался в этом вопросе, а сейчас что-то из головы выветрилось...
Какая-то там "заподляна" с возвратом что-ли была...

_________________
iLavr


25 Feb 2015 15:24
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
Post 
Имеется ввиду вот это?

https://ru.wikipedia.org/wiki/%D0%9F%D0 ... 0%B8%D0%B9

Просто разные функции с одним и тем же именем - в Сях это невозможно, а в Плюсах - это одна из основных фич...

_________________
:eugeek: https://twitter.com/Shaos1973


25 Feb 2015 15:52
Profile WWW
Junior
User avatar

Joined: 03 Feb 2016 06:00
Posts: 1
Reply with quote
Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.

_________________
Ведущий поставщик программных обеспечений - http://ru.intechcore.com/


03 Feb 2016 06:06
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Напишу сюда, чтобы не открывать новую тему...

Решил я перекомпилировать исходники Pom1 - Apple-1 emulator чтобы избыавиться от вызова
MSVCRT100.DLL (я так уже делал с z80.dll), но случилась непонятная мне трабла... :-?

Pom1 - Apple-1 emulator использует SDL.dll, а значит у меня есть заголовочный
файл SDL.h и куча других заголовочных файлов типа SDL_Хххх.h , где объявлены
все функции SDL.dll.

При компиляции VC зачем-то "декорирует" имена этих функций префиксом "_", а потом сам же их
и не находит... :osad:
Quote:
Linking...
main.obj : error LNK2001: unresolved external symbol _SDL_ShowCursor
keyboard.obj : error LNK2001: unresolved external symbol _SDL_ShowCursor
main.obj : error LNK2001: unresolved external symbol _SDL_EnableUNICODE
main.obj : error LNK2001: unresolved external symbol _SDL_EnableKeyRepeat
main.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
keyboard.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
options.obj : error LNK2001: unresolved external symbol _SDL_SetVideoMode
main.obj : error LNK2001: unresolved external symbol _SDL_WM_SetCaption
main.obj : error LNK2001: unresolved external symbol _SDL_Quit
main.obj : error LNK2001: unresolved external symbol _SDL_Init
keyboard.obj : error LNK2001: unresolved external symbol _SDL_PollEvent
options.obj : error LNK2001: unresolved external symbol _SDL_PollEvent
m6502.obj : error LNK2001: unresolved external symbol _SDL_CreateThread
m6502.obj : error LNK2001: unresolved external symbol _SDL_GetTicks
screen.obj : error LNK2001: unresolved external symbol _SDL_GetTicks
m6502.obj : error LNK2001: unresolved external symbol _SDL_Delay
screen.obj : error LNK2001: unresolved external symbol _SDL_Delay
m6502.obj : error LNK2001: unresolved external symbol _SDL_WaitThread
screen.obj : error LNK2001: unresolved external symbol _SDL_UpdateRect
options.obj : error LNK2001: unresolved external symbol _SDL_UpdateRect
screen.obj : error LNK2001: unresolved external symbol _SDL_FillRect
options.obj : error LNK2001: unresolved external symbol _SDL_FillRect
screen.obj : error LNK2001: unresolved external symbol _SDL_MapRGB
screen.obj : error LNK2001: unresolved external symbol _SDL_GetVideoSurface
options.obj : error LNK2001: unresolved external symbol _SDL_GetVideoSurface
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/POM1.exe : fatal error LNK1120: 17 unresolved externals
Error executing link.exe.


Я так подозреваю, что проблема похожа на обсуждаемую вот здесь:
http://forum.developing.ru/archive/index.php/t-10541.html

Но вот побороть это пока никак не смог... :-?

_________________
iLavr


22 Aug 2017 19:13
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
С-компилятор компилирует в _name, а C++ компилятор в какие-то свои более запутанные крокозябры

если надо чтобы компилятор C++ скомпилировал в _name, то надо чтобы в H-файле у объявлений функций стоял модификатор "C"

P.S. в данном конкретном случае скорее всего либа стыковочная не прилинкована, которая потом будет цеплять SDL.dll

_________________
:eugeek: https://twitter.com/Shaos1973


04 Nov 2017 18:05
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Напишу здесь, чтобы не открывать лишний топик... Вопрос к Shaos-у.

Я тут читаю исходник эмулятора БК-0010, и что-то меня один момент смущает.
Ощущение, что автор дважды "перебдел"...

В модуле Covox.cpp :
Code:
void CCovox::SetWord (int addr, WORD value)
{
  ASSERT (addr == 0177714);

  if (addr == 0177714)
  {
    SetSample (value);
  }
}


Если я правильно понимаю:
Quote:
Функция assert оценивает выражение, которое передается ей в качестве аргумента,
через параметр expression.
Если аргумент-выражение этого макроса в функциональной форме равно нулю
(т.е. выражение ложно), сообщение записывается на стандартное устройство
вывода ошибок и вызывается функция abort, работа программы прекращается.

Т.е. если addr не равен 0177714 то дальше ничего не случится.
Но дальше у автора снова:
Code:
 if (addr == 0177714)
  {
    SetSample (value);
  }
Как-то это странно, но может я чего не понимаю в тонкостях С++ ?

_________________
iLavr


13 Jan 2018 08:13
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
Всё просто - ассерт скомпилируется только в дебаге:)
А в релизной сборке его быть недолжно

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2018 09:54
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos, у меня что-то Визуал Студия 5.0 ругается на вот такую сточку:
Code:
AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, "Menu");

говорит: что UINT_PTR нигде не объявлен... :o что несколько странно...
Я посмотрел - все так делают: C++ - Creating a submenu

Но с другой стороны сделал поиск на слово UINT_PTR в папке DevStudio - оно не находится... :-?


P.S. Что-то мне кажется, UINT_PTR - не для Визуал Студии 5.0... 8)
Code:
UINT_PTR   
Беззнаковый INT_PTR. Этот тип объявлен в Basetsd.h  как показано ниже:
#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;
http://vsokovikov.narod.ru/New_MSDN_API/Refer_API/type_date_windows.htm

У меня и файла Basetsd.h нет в DevStudio... :lol:
Заменил вот так, и оно без ошибок проехало...
Code:
AppendMenu(hMenubar, MF_POPUP, (UINT)hMenu, "Menu");

_________________
iLavr


18 Jan 2018 15:44
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
видимо он сильно позже появился

я помнится на пятой студии ещё на моей старой российской работе программировал - значит это было оооооооочень давно :)

_________________
:eugeek: https://twitter.com/Shaos1973


18 Jan 2018 21:35
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos, еще проблемка есть, может знаешь как решить:

Я создаю вот это окно "Digital Display" в процессе ATTACH DLL-ки.

Image

Его HWND hwnd объявлена внутри как глобальная, и понятно, что когда окно создано,
то hwnd его внутри известно.

Но когда я вызываю экспортируемую из DLL-ки функцию:
Code:
extern "C" VOID __declspec(dllexport) disp(INT arg) 
{
...
}

То в этой функции hwnd уже неизвестна.

Я помню, что Венда каждому процессу, обращающемуся к DLL, создает новую память.
Вот как бы значение hwnd не терять при этом?

_________________
iLavr


19 Jan 2018 03:09
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
передай аргументом

_________________
:eugeek: https://twitter.com/Shaos1973


19 Jan 2018 09:40
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
передай аргументом

А некому передать этот аргумент.
В вызывающей эту функцию программе
Code:
extern "C" VOID __declspec(dllexport) disp(INT arg) 
{
...
}
Этот вызов как раз прохачен и может сделать только:
Code:
call disp; display.dll
передавая через стек только свой аргумент (INT arg) .
Поставил пока hMwnd = FindWindow(...), что выглядит как-то натянуто...
Искать hwnd собственного окна... :o

_________________
iLavr


19 Jan 2018 12:20
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
ну тогда можно через реестр передать или на худой конец через файл

_________________
:eugeek: https://twitter.com/Shaos1973


19 Jan 2018 19:54
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
ну тогда можно через реестр передать или на худой конец через файл

Да ты чо? :o Мне кажется FindWindow(...) лишний тормоз, хотя по сравнению
с записью файл он шустр... а запись в реестр - тоже запись в файл.

Это же происходит при каждой выдаче байта в порт! :o

Есть какие-то специальные области памяти для межпотокового общения.
Давно читал я и не понял и забыл. Думал, может, ты помнишь... :roll:

_________________
iLavr


19 Jan 2018 21:07
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17028
Location: Colorado
Reply with quote
так тебе только адрес передать через файл, а потом все через этот адрес перекидывать

_________________
:eugeek: https://twitter.com/Shaos1973


19 Jan 2018 22:25
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 28 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.