С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
#1

Программа на С++ и CLR - C++

23.09.2010, 21:38. Просмотров 2378. Ответов 14
Метки нет (Все метки)

Проблема в следующем.
1) не знаю куда опубликовать конкретно эту тему, ибо тут пересечение двух разных веток. Поэтому опишу в главном. Модеры, если посчитаете нужным - перенесите.

2) Попросил у преподавателя задачку посложнее того уровня, что мы проходим сейчас. Видимо он решил меня поставить на место и спросив знаю ли я CLR и получив отрицательный ответ, дал эту задачку. Но я решил ее сделать. Единственное что. Задание звучит приблизительно так. Нужна функция на обычном С++, которая вызывает функцию с CLR, а функция с CLR должна вызывать обычную функцию. То есть всего две функции, но в разном формате.

Теперь вопрос. Я не прошу ни примеров, ни кодов, с CLR как-нибудь разберусь. Вопрос лишь в одном. Как это можно совместить? Создавать два проекта разных и один из них делать через DLL, и экспортировать DLL во второй проект или же можно как-то измудриться и сделать один проект и с тем и с другим. Буду благодарен за советы по поводу того как это сделать. Заранее спасибо

Вроде бы что-то сделал. Вроде бы даже по заданию... Подскажите, покатит ли и что стоит изменить, если нужно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//CLR_test.cpp
 
using namespace System;
 
void fooclr()
{
   extern void cfunc();
   static Int16 i=0;
   while(i++<2)
   {
      String^Str="Call func fooclr()";
      Console::WriteLine(Str);
      cfunc();
   }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//CLR_test_cpp.cpp
 
#include <string>
#include <iostream>
 
void cfunc()
{
   extern void fooclr();
   static int i=0;
   while(i++<2)
   {
      std::string Str="Call func cfunc()";
      std::cout<<Str<<'\n';
      fooclr();
   }
}
 
int main()
{
   cfunc();
   return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2010, 21:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа на С++ и CLR (C++):

c++/clr в c# - Visual C++
Уважаемые форумчане и знатоки одного из древнейших языков программирования, молю вас о помощи. Торговый терминал работает только лишь с...

Проблемы с параметра /clr ? - Visual C++
Studio имеется несколько известных проблем, возникающих при компиляции проектов библиотек с использованием параметра /clr: Код может...

clr,mfc,windows forms - Visual C++
на чем лучше всего создавать оконный проект в MSVS2010? и как его собрать в 1 exe исполняемый файл ? и чтобы этот 1 exe можно было...

В чём писать, в MFC или CLR? - Visual C++
В CLR всё более или менее понятно, но приложения написанные в CLR не запускаются на компьютерах в котрых не установлена Visual Studio,...

Считывание чисел из TextBox и запись в массив (CLR) - Visual C++
в боксе хранится строка вида: 10101000101010010001010. Как можно считать эти числа в массив int? Если это делать в лоб, в массиве хранится...

Visual studio CLR приложение не работает на другом компьютере - Visual C++
Дело вот в чем , создал я программу которая питается от таблицы acces , и вот в чем проблема , При попытке запустить программу(exe в папке...

14
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.09.2010, 22:13 #2
Lavroff, сюдя по данному заданию dll тут не причем. Нужно
Цитата Сообщение от Lavroff Посмотреть сообщение
как-то измудриться и сделать один проект и с тем и с другим.
Для этого создай один проект с поддержкой CLR.
В данном проекте напиши три функции: две не использующие приблуды CLR, вроде управляемых классов, а одну с использованием CLR (как приведенная тобою со String). Из первой вызови третью, из третьей вторую. Это практически у тебя и сделано.
Думаю, как то так.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.09.2010, 22:22  [ТС] #3
CyBOSSeR, Ограничения я правильно поставил? А то выходило переполнение стека, потому как функции вызывались бесконечно.

То есть. Одну с clr как у меня, две С++, то есть одна обычная и main? Из main вызывать с clr, из clr C++, из C++ clr, или можно оставить так как есть?
0
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
23.09.2010, 22:30 #4
Только вот fooclr сложно назвать clr-функцией - она не вложена в управляемый класс
2
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.09.2010, 22:36  [ТС] #5
HIMen, Да. Но в ней синтаксис управляемого С++.
0
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
23.09.2010, 22:41 #6
Lavroff, и что? Ты же не можешь вызвать ее, например из c# без platform invoke.
Она такая же как и int main(){}. Компилятор может вообще inline сделать
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
23.09.2010, 22:42 #7
Думаю как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
void Print(wchar_t ch) {
  std::wcout << ch;
}
 
ref class cliClass {
public:
  static void PrintTestString() {
    using namespace System;
 
    String^ str = "This is the test string";
 
    for (Int32 i = 0; i < str->Length; ++i)
      Print(str[i]);
  }
};
 
int main() {
  cliClass::PrintTestString();
 
  return 0;
}
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.09.2010, 22:44  [ТС] #8
HIMen, Дык у меня и не было цели написать функцию которая пойдет на всех платформах поддерживающих .NET. Но спасибо за замечание, посмотрю.


CyBOSSeR, Интересно. Спасибо
0
alex_x_x
23.09.2010, 23:01
  #9

Не по теме:

это тот преподователь, на которого гнали, что он stl не знает?

0
ForEveR
23.09.2010, 23:02  [ТС]
  #10

Не по теме:

alex_x_x, Я бы не сказал, что я на него гнал. Я только спросил в тот раз как мне быть. Но да, именно он

0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.09.2010, 22:38  [ТС] #11
Ммм. И снова я тут.
Проблема:

CliTest.h
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
#pragma once
 
using namespace System;
 
extern void Print(wchar_t);
 
ref class CliTest
{
public:
    void foo();
    void PrintIt();
private:
    String^ Str;
};
 
void CliTest::foo()
{
    String^Strc=Console::ReadLine();
    Str=Strc;
    PrintIt();
}
 
void CliTest::PrintIt()
{
    Int32 i=0;
    for each(wchar_t p in Str)
    {
        Print(Str[i]);
        ++i;
    }
    Console::WriteLine();
}


CPPTest.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "CLITest.h"
 
#include <iostream>
 
void Print(wchar_t p)
{
    std::wcout<<p;
}
 
int main()
{
    CliTest Ob;
    Ob.foo();
    return 0;
}


И как быть - хз. Так то оно конечно работает. Но мне нужно обязательно два CPP файла. В одном CLI в другом чистые плюсы. Включать C++ файл это нехорошо. С хедером конечно прекрасно, но нужны именно исходные файлы. Кто может подсказать, как лучше сделать?) Класс внешним я так понимаю сделать невозможно
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.09.2010, 22:43 #12
Цитата Сообщение от Lavroff Посмотреть сообщение
Класс внешним я так понимаю сделать невозможно
Правильно понимаешь.
Lavroff, мне кажеться, что ты явно что-то попутал про только 2 исходных файла. Исходные файлы не предназначаны для описания классов.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.09.2010, 22:46  [ТС] #13
CyBOSSeR, Два исходных. По этому я про DLL и завел разговор в самом начале темы... Только через DLL получается?
Кстати. Если только с функциями - то работает. С классами - нет.
А про классы он ничего не говорил абсолютно. Просто про две функции, которые вызывают друг друга. Одна CLI, вторая C++
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.09.2010, 22:55 #14
Lavroff, dll - это слишком маловероятно, даже не стоит думать.
Хм... Исходя из того, что ты его правильно понял про отсутсвие заголовочных файлов, то напрашивается только одно - CLI функцией является свободная функция, содержащая обращения к управляемым классам.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.09.2010, 23:28  [ТС] #15
CyBOSSeR, То есть. Приблизительно то, что было у меня с самого начала?

Добавлено через 24 минуты
Хотелось бы все же узнать. Хотя проверю завтра в любом случае. Результат проверки напишу)
0
28.09.2010, 23:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2010, 23:28
Привет! Вот еще темы с ответами:

fatal error C1190: managed targeted code requires '#using <mscorlib.dll>' and '/clr' option - Visual C++
fatal error C1190: managed targeted code requires '#using &lt;mscorlib.dll&gt;' and '/clr' option что делать???

Создать win form, используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 нет - Visual C++
есть необходимость создать win form используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 не обнаружено ... :(

1>cl : Command line error D8016 : '/MTd' and '/clr' command-line options are incompatible - Visual C++
Не работает прога на других компах, на которых не установлена visual studio. Приложение Windows Form, попытался сделать dll static, но...

Events кнопки свернуть в clr - C++ WinAPI
Доброго времени суток. Подскажите как сделать так, чтобы окно сворачивалось в трей. используя notifyIcon1-&gt;Visible = true; я могу его...


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

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

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