Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
1

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

23.09.2010, 21:38. Просмотров 3919. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2010, 21:38
Ответы с готовыми решениями:

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

Проблемы с параметра /clr ?
Studio имеется несколько известных проблем, возникающих при компиляции проектов библиотек с...

CLR
Подскажите где можно почитать про написание CLR проектов. Желательно как можно подробнее. До этого...

Отличие CLR от Win32
Всем доброго времени суток. Подскажите пожалуйста чем отличается консольное приложение CLR от...

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

То есть. Одну с clr как у меня, две С++, то есть одна обычная и main? Из main вызывать с clr, из clr C++, из C++ clr, или можно оставить так как есть?
0
4306 / 1474 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
23.09.2010, 22:30 4
Только вот fooclr сложно назвать clr-функцией - она не вложена в управляемый класс
2
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
23.09.2010, 22:36  [ТС] 5
HIMen, Да. Но в ней синтаксис управляемого С++.
0
4306 / 1474 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
23.09.2010, 22:41 6
Lavroff, и что? Ты же не можешь вызвать ее, например из c# без platform invoke.
Она такая же как и int main(){}. Компилятор может вообще inline сделать
1
Эксперт С++
2329 / 1702 / 148
Регистрация: 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
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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
Эксперт С++
2329 / 1702 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.09.2010, 22:43 12
Цитата Сообщение от Lavroff Посмотреть сообщение
Класс внешним я так понимаю сделать невозможно
Правильно понимаешь.
Lavroff, мне кажеться, что ты явно что-то попутал про только 2 исходных файла. Исходные файлы не предназначаны для описания классов.
1
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
28.09.2010, 22:46  [ТС] 13
CyBOSSeR, Два исходных. По этому я про DLL и завел разговор в самом начале темы... Только через DLL получается?
Кстати. Если только с функциями - то работает. С классами - нет.
А про классы он ничего не говорил абсолютно. Просто про две функции, которые вызывают друг друга. Одна CLI, вторая C++
0
Эксперт С++
2329 / 1702 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.09.2010, 22:55 14
Lavroff, dll - это слишком маловероятно, даже не стоит думать.
Хм... Исходя из того, что ты его правильно понял про отсутсвие заголовочных файлов, то напрашивается только одно - CLI функцией является свободная функция, содержащая обращения к управляемым классам.
1
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
28.09.2010, 23:28  [ТС] 15
CyBOSSeR, То есть. Приблизительно то, что было у меня с самого начала?

Добавлено через 24 минуты
Хотелось бы все же узнать. Хотя проверю завтра в любом случае. Результат проверки напишу)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2010, 23:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Триггеры CLR
Всем доброго времени суток. По...

Хитрости CLR.
Здравствуйте! Есть 2 вопроса-проблемы. 1) Есть сборка, в ней объект. Объект и сборка...

CLR.Window
При использовании Window, появляется такое сообщение: &quot;Функция CRT.Window не реализована&quot;. В поиске...

Ошибка CLR
CLR не удалось перейти из COM-контекста 0x1a1c98 в COM-контекст 0x1a1e08 за 60 секунд. Наиболее...


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

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

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