Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > правильный вызов функции


Автор: gutalin93 1.7.2013, 18:05
здравствуйте, подскажите пожалуйста как правильно из обработчика кнопки ( находится в Form1.h) вызвать код из основного .срр файла (допустим функцию main)? среда microsoft visual c++ 2010

когда пишу просто 

Код

public: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {main();
                          new_func();
                          }


пишет что  new_func: идентификатор не найден

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

Автор: akizelokro 1.7.2013, 22:42
Я не знаю, можно ли вообще вызвать в managed- или смешанном С++ коде функцию main. предполагаю, что нет (я вообще не особо лихой специалист).
Но суть стиля программирования в С++ заключается в том, что в include файлах (.h,.hpp) ты пишешь объявления функций и классов, а определения функций уже в c++ файлах.
Функцию ты можешь вызвать только тогда, когда она есть у тебя в поле видимости (хотя бы объявление функции предшевствует её использованию). И тут тебя не обрадую. Функция main это особая функция, которую я не видел, чтобы где-то в традиционном C++ объявляли в .hpp файле.

ДА и заказчик, скорее всего, хотел тебе намекнуть, чтобы ты в .hpp оставил объявления функций и классов, а реализацию перенес в .cpp файл.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51d19ade6ccc192c43000002#findElement_E7045_51d1db936ccc1972740000bb_0

Автор: EgoBrain 2.7.2013, 07:31
Цитата(akizelokro @  1.7.2013,  22:42 Найти цитируемый пост)
Функция main это особая функция, которую я не видел, чтобы где-то в традиционном C++ объявляли в .hpp файле.

Может он в качестве входной точки указал другую функцию и написал еще main для обфускации..

Цитата(gutalin93 @  1.7.2013,  18:05 Найти цитируемый пост)
сейчас весь код у меня написан в обработчике кнопки в файле Form1.h

Как тебе и сказали, реализация должна быть в cpp файле.

Автор: dzaraev 2.7.2013, 09:25
Цитата(gutalin93 @  1.7.2013,  18:05 Найти цитируемый пост)
здравствуйте, подскажите пожалуйста как правильно из обработчика кнопки ( находится в Form1.h) вызвать код из основного .срр файла...
...сейчас весь код у меня написан в обработчике кнопки в файле Form1.h, это заказчика бесит) 

Как уже упомянули - реализующий код пишется в .cpp, в .h соответственно - код объявляющий. Советую сделать - как просит заказчик, не показывайте свою некомпетентность.

Цитата(gutalin93 @  1.7.2013,  18:05 Найти цитируемый пост)
пишет что  new_func: идентификатор не найден

Значит компилятор, обрабатывая ваш .h файл не нашел - где объявлен метод new_func. Необходимо подключить к сборке с формой сборку в которой объявлен new_func и в файле с формой подключить соответствующий неймспейс (using ) или .h файл (#include)

Функцию Main, кстати можно спокойно вызвать:
Main.cpp
Код


#include "stdafx.h"
#include "FooHeader.h"
using namespace System;

int main(array<System::String ^> ^args)
{
    if (args.Length == 0)
    {
        callMain();
    }
    else
    {
        Console::WriteLine(args[0]);
        Console::ReadKey();
    }
    return 0;
}

void callMain()
{
    array<String ^> ^args = gcnew array<String^>{"Hello World!"};
    main(args);    
}


FooHeader.h
Код

void callMain();


Фишка Main функции в том, что её вызов помещается в PE заголовок (для .NET сборок соответственно в CLR заголовок), чтобы обозначить точку входа для модуля. В остальном - обычная функция.

Автор: gutalin93 3.7.2013, 14:22
спасибо большое, действительно ничего сложного теперь обращаюсь и к main и к др функциям,
как-то так:
сначала объявление, потом вызов

Код

array <System::Byte>^ onClick(char address_h, char address_l);
..............
onClick(0x09,0xFA);


непонятно правда зачем ^ нужен
 

Автор: dzaraev 3.7.2013, 15:57
Насколько знаю, символ ^ - идентифицирует  reference тип CLR.
Если же используется value-тип, то ^ не ставится. 
Например, в обозначении типа 
Код

array <System::Byte>^ 

тип http://msdn.microsoft.com/en-us/library/system.array.aspx - ссылочный (reference-type) CLR тип, поэтому справа от него ставится "^",
а тип http://msdn.microsoft.com/en-us/library/system.byte.aspx - это значимый тип (value-type), поэтому рядом с ним "^" не указывается.



Автор: gutalin93 4.7.2013, 12:33
спасибо, последний вопрос...честно говоря до сих пор к некоторым вещам си++ не могу привыкнуть, например пришел мне массив типа unsigned char, даже элементарно не получается один символ в переменную unsigned char записать, не говоря уже о приведении типов, не понятно почему....
пробовал по этой статье
http://cppstudio.com/spravochnik/sintaksis-yazyka-s-spravochnaya-informaciya/privedenie-tipov-dannyx/

Автор: gambit 4.7.2013, 14:42
Модератор: Пожалуйста, один топик - один вопрос.

Автор: dzaraev 5.7.2013, 08:16
gutalin93, На счет чистого С++ я затрудняюсь ответить, потому, что не понимаю в чем конкретно проблема.
Судя по предыдущим постам, вы всёже пишете на C++\CLI (это другой язык, не эквивалентный C++).
И, тем не менее, мне не понятен вопрос. На всякий случай - вот пример копирования из нативного массива unsigned char* в массив элементов эквивалентного CLR типа - System::Byte: http://stackoverflow.com/a/6541406
Еще, тоже на всякий пожарный - таблица соответствия нативных типов - типам CLR: http://msdn.microsoft.com/ru-ru/library/0wf2yk2k.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)