C++/Cli и массивы
какой-нибудь memset/ аналог паскалевского fillchar
А что ты, собственно, подразумевал под инициализацией? Если "внешний массив" содержит указатели (на "внутренние" массивы или на любые другие объекты - не важно то для этих указателей инициализация - это в лучшем случае зануление, конструкторы для обектов, адресуемых указателями, автоматически вызывться не будут. Если же "внутренние" массивы - это собственно экземпляры класса array, то для них инициализация по умолчанию - это создание пустых массивов. Просто в твоем сообщении неясно, что означают крышечки "^"
так
Array::Copy(arr, qwer, arr.Length);
, не проинициализировав перед этим qwer, то компиилятор выдаст ошибку (что-то в духе nullReference а если проинициализирую - все будет ОК. Поэтому и возник вопрос.
Крышечки из Managed C++, как и gcnew, как я понял.
сам класс Array - где его описание?
я сначала тоже написал что-то, а потом посмотрел, что managed и стер пост от греха подальше. =)
сам класс Array - где его описание?В MSDN.
используй multidimensional array, они будут инициализироваться сразу.
array<double,3>^ arr = gcnew array<double,3>(10, 10, 3);
arr[5, 5, 1] = 5;
И ведь через 1 год он будет "профессионалом с годом опыта".
Совет чуваку: сделай что-то, чтобы не вызывать такую реакцию. Хотя бы тем, что не пиши на этом убогом микрософтовском языке. Есть ты не смог изучить нормальные плюсы, стоит подумать о смене профессии. Пока молодой...
Ну и как бы пойми, что изучать С++ с Микрософта — это путь явно не лучший.
Ха! А как по-твоему тогда сделать трёхмерный вектор на STL C++?
Убивать надо тех, кто использует трёхмерные векторы.
предложи замену
Для чего нужно использовать трёхмерные векторы? С какой целью?
Трёхмерные уровни в пошаговых играх например.
какой ужос, ради одной такой задачи можно с лёгкостью написать свою собственную обёртку над vector<vector<vector<double> > >, чтобы превратить её в настоящий трёхмерный массив. К тому же, мне кажется, что и это неправильный подход
хмм. если уж делаешь велосипед, то делай его правильно.
обертку надо делать не поверх 3-х мерного jagged-массива, а поверх одномерного массива, чтобы память единным куском выделялась.
Ну и как бы пойми, что изучать С++ с Микрософта — это путь явно не лучший.если уж ты живешь в прошлом веке, то там живи, что на других наезжаешь?
MC++ по сравнению с родными C++ намного более удобный и разумный язык.
и если уж хочется выучить C++, то лучше сначала выучить именно MC++
век мекрософта как раз проходит. щас вроде в моде кроссплатформенность всякая. =)
C++/CLI is a set of extensions to ISO C++ that provides an extremely complete "binding" of C++ to Microsoft's CLI (Common Language Infrastructure). It has been standardized by ECMA (ECMA-372). I am happy that it makes every feature of the CLI easily accessible from C++ and happy that C++/CLI is a far better language than its predecessor "Managed C++". However, I am less happy that C++/CLI achieves its goals by essentially augmenting C++ with a separate language feature for each feature of CLI (interfaces, properties, generics, pointers, inheritance, enumerations, and much, much more). This will be a major source of confusion (whatever anyone does or says). The wealth of new language facilities in C++/CLI compared to ISO Standard C++ tempts programmers to write non-portable code that (often invisibly) become intimately tied to Microsoft Windows.
век мекрософта как раз проходит. щас вроде в моде кроссплатформенность всякая. =)но уж C++ это точно не язык кроссплатформенности.
зы
если кроссплатформенность будет не только в моде, но и действительно будет необходима для решения реальных задач - значит микрософт будет кроссплатформенным.
я уже сообщал, что считаю использование трёхмерных массивов неправильным подходом?
ты не сказал, что использовать вместо них при решение задач содержащих 3-х мерное пространство
> для решения реальных задач - значит микрософт будет кроссплатформенным.
что значит "кроссплатформенность необходима для решения реальных задач"?
если нужно написать охуенный медиаплеер — это реальная задача, для которой необходима кроссплатформенность?
если нужно написать охуенный медиаплеер — это реальная задача, для которой необходима кроссплатформенность?вот ты хочешь написать охуенный кроссплатформенный медиаплеер?
я нет. и думаю ты тоже нет. и почти все в этом форуме тоже не хотят писать охуенный медиаплеер.
поэтому это слабо похоже на реальную задачу.
зы
кстати C++ слабо помогает при написании кроссплатформенных охуенных медиаплееров
который будет использоваться внутри одной компании, и который никому не покажут,
но есть же и другие виды "реальных задач".
я просто не знаю, неужели настолько проще писать на этом непонятном CLI, когда есть обычный ISO C++.
или вообще C, который все знают.
кстати C++ слабо помогает при написании кроссплатформенных охуенных медиаплееровС++ хотя бы не мешает. в отличие от CLI.
CLI переносится на любую платформу намного проще, чем C++.
единственная разница, что C++ уже лет 40, и для многих платформ C++ уже перенесли, а CLI - нет.
почему ты считаешь, что есть "непонятный CLI" и есть "понятный C++"?
потому что ты пару лет назад выучил С++, но не учил Cli?
cli довольно логичный язык, и довольно успешно продолжает концепции заложенные страуструпом в C++.
например, я ни разу ни одной книжки/ни доки по CLI ни разу в глаза не видел, но при этом могу на нем довольно уверенно писать
но не факт, что это так. я не знаток CLI.
и возвращаясь к вопросу об изучении программирования вообще.
ты же видишь, к каким вопросам приводит вот такое вот изучение.
"почему у меня не инициализируется трехмерный массив?
пешу <array<array<blablabla<double>>> = microsoft_special_instruction(my_mega_pool) и нифига!
что делать, подскажите?"
имхо это жесть.
вообще, не читал, конечно, но если можно перенести под что угодно без участия микрософта, то я перестаю исходить говном. =)
кстати вопросы "как мне проинициализировать std::vector" не менее редко появляются - даже в данном форуме.
зачем тебе microsoft? CLI - это ecma стандарт, бери да переводи, кто тебе мешает?
дык, тогда вроде полно фреймворков всяких. Poco там какой-то есть, Boost тот же, может еще какие-то, я не фанат. =)
> кстати вопросы как мне проинициализировать std::vector не менее редко появляются - даже в данном форуме.
ну да, просто на них ответы уже 40 лет прописаны (меньше, ага, не суть).
а в мсдне, судя по отзывам знакомых developers(tm много противоречивой информации, неадекватных ссылок и вообще говна.
а с чего ты взял, что автор не пишет обёртку вокруг сабжа?
ну вот и славно. не буду изобретать велосипед в виде трехмерного вектора.
буду изобретать звездолет в виде реализации CLI.
тогда понадобится больше операций, чтобы достучаться до конкретного элемента
C# развивается сейчас гораздо быстрее C++. Будущий стандарт последнего местами идёт по уже протоптанной дорожке.
тогда понадобится больше операций, чтобы достучаться до конкретного элементаа по памяти типа мгновенно ходить можно?
все быстрые реализации матриц, выделяют память куском и это правильно.
вот я же говорю: изучение технологий(tm) приводит к пиздецовым результатам.
Умножения быстрее косвенных переходов?
да пусть развивается, мне похуй.
на современных процах - точно быстрее.
MC++ по сравнению с родными C++ намного более удобный и разумный язык.Ужасное и грубое поделие с убогим синтаксисом. Причём, абсолютно бессмысленное и незижнеспособное. Если нужен этот самый "managed" - надо сразу писать на C#. Все managed фишки в С++ сами по себе смысла не имеют - либо они managed, либо родные. Например, конвертация указателей в managed код и обратно возможна только с помощью вызова дополнительных методов.
либо они managed, либо родныеЕсли говорить точнее, то выучив managed C++ получим стиль кодирования как на C#/Java, который совершенно неприменим для кодирования на C++.
Если говорить точнее, то выучив managed C++ получим стиль кодирования как на C#/Java, который совершенно неприменим для кодирования на C++.что в этом плохого?
что в этом плохого?То, что нельзя сказать твоими словами:
если уж хочется выучить C++, то лучше сначала выучить именно MC++
Смысла учить MC++ нет, потому что лучше сразу учить C#. Я же написал, что стиль кодирования различается радикально, в случае MC++ ты не можешь научиться использовать все преимущества обычного C++. Да и сам язык просто притянут за уши, C# гораздо удобнее.
Короче, имхо, вы оба правы.
Это всё равно не отменяет того, что MC++ лучше выучить, чем C++Как раз отменяет. Вместо MC++ надо сразу учить C#. Учить всё в одном не надо. Чего только стоит механизм контроля ресурсов: для managed классов придётся писать try/finally конструкции, в то время как для обычных C++ классов придётся использовать деструкторы. Дальнейший спор можно свести только к тому, что лучше учить C#/Java вместо С++, что опять же полный бред.
Чего только стоит механизм контроля ресурсов: для managed классов придётся писать try/finally конструкции, в то время как для обычных C++ классов придётся использовать деструкторызачем писать через try/finally?
весь смысл C++/CLI, что даже для managed классов подерживается освобождение через деструктор.
весь смысл C++/CLI, что даже для managed классов подерживается освобождение через деструкторНичего там на самом деле не поддерживается. Тебе придётся везде пихать врапперы. Смысла в этом нет, как я уже сказал, лучше сразу учить C#. Потому что ты предалгаешь уже какую-то третью схему, где тебе руками придётся контролировать gc.
еще раз спрашиваю кто тебе сказал такую дурость?
managed-класс можно как выделить на стеке (если не требуется передача его по gc-ссылке и он сам умрет при выходе из блока
StreamWriter writer("q.txt");
writer.WriteLine("f");
либо можно заюзать смарт-поинтер auto_gcroot<StreamWriter^> и опять же все само умрет при выходе из блока
auto_gcroot<StreamWriter^> writer = gcnew StreamWriter("q.txt");
writer->WriteLine("f");
зачем какие-то try/finally мне совсем не понятно.
еще раз спрашиваю кто тебе сказал такую дурость?Любой хэлп по MC++. Везде пишется try/finally конструкция. Что, кстати, правильно. Если надо, приведу пример, почему правильно. Всё остальное что ты написал, я прекрасно понимаю и не спорю. Но, например подход с выделением класса на стеке, может привести к проблемам, если объект превратить в ссылку и оставить её где-нибудь. Опять же, эту проблему лучше решать через try/gcnew/finally. Приходим к тому, что лучше писать сразу на C#/Java.
это нельзя сделать даже теоретически
> Опять же, эту проблему лучше решать через try/gcnew/finally
чем это лучше, чем smartpoint?
> Приходим к тому, что лучше писать сразу на C#/Java
в целом, согласен.
но C++/CLI более низкоуровневый язык, чем C#/Java. соответственно на C++/Cli можно сделать какие-то вещи, которые нельзя сделать на C#/Java.
Я думал, что unsafe C# вполне позволяет делать многие вещи, которые делаются на MC++... Впрочем, никогда этим не пользовался.
Ну вот у меня как-то получаетсяприведи код
Основной упор я делаю на то, что стили кодирования с и без GC кардинально различаются, и не стоит их перемешивать.что есть gc, что нет gc - стиль кодирования один и тот же.
т.к. ресурсы никуда не девается, и эти ресурсы все равно надо явно освобождать, а gc позволяет лишь память не считать ресурсом.
приведи кодЯ давно этим не занимался. Ну что-то типа этого:
ref class test { };
class test_holder
{
public:
test_holder(test^ ptest) : m_ptest(ptest) { }
gcroot<test^> m_ptest;
};
....
test stack;
pholder = new test_holder(%stack);
писать managed код без gc на C++/CLI можно, а на C# нельзя.
зы
ты кстати уверен, что ты не путаешь MC++ с C++/CLI?
что есть gc, что нет gc - стиль кодирования один и тот же.Ну здесь я с тобой не согласен. Обоснования уже много раз приводил. С GC кодирование будет опираться на try/finally, что, кстати, чаще ведёт к ошибкам. Без GC кодирование будет опираться на деструкторы. Конечно, это не единственная разница, просто самая очевидная.
т.к. ресурсы никуда не девается, и эти ресурсы все равно надо явно освобождать, а gc позволяет лишь память не считать ресурсом
ты кстати уверен, что ты не путаешь MC++ с C++/CLI?Не уверен.
С GC кодирование будет опираться на try/finally, что, кстати, чаще ведёт к ошибкам.еще раз спрашиваю, почему в C# - обходятся без try/finally, а C++ должен использовать try/finally?
ps
ты кстати помнишь то, что auto_gcroot - автоматом вызывает Dispose при выходе из блока?
и что вот такое объявление:
ref class X
{
public: ~X{}
};
на самом деле неявно реализует Dispose
идею понял, но у меня не получилось так сразу написать код, который бы выводил некорректный результат.
еще раз спрашиваю, почему в C# - обходятся без try/finally, а C++ должен использовать try/finallyВообще-то в C# без этого не обходятся. Если, конечно, не считать using великим достижением в этой области.
ты кстати помнишь то, что auto_gcroot - автоматом вызывает Dispose при выходе из блока
Помню. Но это не значит, что я не могу запихать хранимую там ссылку куда-то ещё. Например, вызвать метод, исходного кода которого у меня нет. Если бы мы программировали на C#/Java, то можно было бы об этом вообще не думать. Здесь же приходится следить за CG объектами практически так же, как следим за обычными C++ указателями. В таком случае, отпадает необходимость в GC.
Кроме того, мы-таки дошли до того, что на всё нужны врапперы, как я и написал выше.
идею понял, но у меня не получилось так сразу написать код, который бы выводил некорректный результатЯ могу тебе этот код дописать до некорректного результата. До использования disposed объекта - вообще влёгкую, ты и сам это можешь сделать.
Дальше легко довести этот код до гремучей смеси, которая на чём-нибудь шлёпнется...
До использования disposed объекта - вообще влёгкую, ты и сам это можешь сделать.это можно сделать и в C#, и ничего в этом особо страшного нет.
меня больше интересовало, можно ли сделать, чтобы был проезд по памяти или нет.
Вообще-то в C# без этого не обходятся. Если, конечно, не считать using великим достижением в этой областине вижу разницы между using-ами в C# и деструкторами в C++.
и то и другое - позволяет сделать скобочное автоматическое освобождение ресурсов
> Кроме того, мы-таки дошли до того, что на всё нужны врапперы, как я и написал выше
smartpointer и wrapper - это одно и тоже в твоем понимании?
это можно сделать и в C#, и ничего в этом особо страшного нет.Это в C# нет, а в смеси с сырой памятью C++ можно получить всё, что угодно. В моём примере сырой C++ код рассчитывает на то, что объектом занимается GC, откуда возникает ошибка. До сих пор не вижу ничего хорошего в MC++, чтобы рекомендовать его вместо C++...
меня больше интересовало, можно ли сделать, чтобы был проезд по памяти или нет.
не вижу разницы между using-ами в C# и деструкторами в C++.Деструкторы удобнее, хотя бы тем, что их нельзя забыть. А вот using или try/finally - влёгкую.
и то и другое - позволяет сделать скобочное автоматическое освобождение ресурсов
smartpointer и wrapper - это одно и тоже в твоем понимании?Ты пойми, в C# я напишу просто A a = new A а в MC++ мы уже дошли до необходимости либо заворачиваться во врапперы, либо использовать всё тот же try/finally. Причём мы так же дошли до того, что смесь двух подходов ведёт к проблемам.
не фига не понял.
если в C# - ты пишешь A a = new A;, то в C++/CLI ты тоже пишешь просто A^ a = gcnew A; - и никаких wrapper-ов.
если же ты пишешь в C#: using (A a = new A то в C++/Cli - ты пишешь auto_gcroot<A^> a = gcnew A и опять никаких wrapper-ов.
причем проблемы(поведение) будут одни и те же: что в C# если забыть using, что в C++/Cli - если забыть auto_gcroot
Деструкторы удобнее, хотя бы тем, что их нельзя забытьэто справедливо только если объект выделяется на стеке, если же объект выделяется в heap-е, то деструктор все также легко забыть вызвать
---
Поэтому silverlight кроссплатформенный и век микрософта никуда не проходит.
если же ты пишешь в C#: using (A a = new A то в C++/Cli - ты пишешь auto_gcroot<A^> a = gcnew A и опять никаких wrapper-овЯ называю это враппингом. Просто в C# ты пишешь try/finally/using и это нормально для этого языка, в C++ ты всё время учишься работать с деструкторами. В MC++ ты пишешь какую-то смесь: то ты сам контролируешь GC, то используешь классический C++ стиль, то опираешься полностью на GC. Фактически, ты предлагаешь каким-то образом обучить человека сразу двум стилям кодирования. После этого он не сможет нормально писать ни на C#, ни на C++. Опять же, правил, которые надо соблюдать, для MC++ будет гораздо больше, чем отдельно для C# или C++, выше уже приведены примеры. Так и не понял, чем же лучше учить MC++ вместо C++
Как бы кому-то дано от Бога писать, кому-то яйца (тьфу, указатели) мешают. Всё нормально, профессия новая, через лет 20 всё устаканится.
Кто-то будет писать сложные вещи, кто-то — формы в сишарпе кодить. Есть же сейчас те, кто проектируют новые процессоры, а есть те, кто виндовсы по помам ходять инсталлировать. Через 20 лет разница будет ещё более заметной.
Просто в C# ты пишешь try/finally/using и это нормально для этого языка, в C++ ты всё время учишься работать с деструкторами.с таким же успехом можно сказать, что в C++ учишься работать с явной обработкой ошибкой - if(ошибка) то файл.закрыть и т.д.
причем аргументы будут теми же самыми: в половине книжек и исходников именно так делается работа, и нет никаких деструкторов.
что ты привезался к try/finally - это неправильный стиль программирования, зачем на нем фиксироваться?
такой же неправильный, как в C++ явно освобождать ресурсы без заворачивания в конструктор/деструктор.
> Фактически, ты предлагаешь каким-то образом обучить человека сразу двум стилям кодирования
правильный стиль один - ресурс должен освобождаться автоматом
про gc вообще думать не надо, т.к. еще раз повторяю, что gc лишь позволяет считать память не ресурсом.
писать на C++/Cli лучше тем, что не надо заморачиваться со всякими простыми объектами: коллекции, строки и т.д. - т.к. они опять же перестают быть ресурсами.
C++/Cli - managed, соответственно в большей степени устраняются ошибки, связанные с проездом по памяти, что очень важно при обучении.
с таким же успехом можно сказать, что в C++ учишься работать с явной обработкой ошибкой - if(ошибка) то файл.закрыть и т.д.Разве ты сам не видишь разницу между using/IDisposable и деструкторами? Для меня это разный стиль кодирования. И я не считаю, что try/finally это неправильный стиль. Для C# он как раз может быть правильным, иногда просто быстрее написать try/finally, чем дописывать объект, который не поддерживает IDisposable. Кроме того, помимо освобождения ресурсов есть такая вещь, как поддержка целостности состояния какого-нибудь объекта. Я говорю о чём-то вроде void f { this.someVar = true; try { } finally { this.someVar = false; } }
причем аргументы будут теми же самыми: в половине книжек и исходников именно так делается работа, и нет никаких деструкторов.
писать на C++/Cli лучше тем, что не надо заморачиваться со всякими простыми объектами: коллекции, строки и т.д. - т.к. они опять же перестают быть ресурсами.
C++/Cli - managed, соответственно в большей степени устраняются ошибки, связанные с проездом по памяти, что очень важно при обучении
Если ты используешь managed классы, то, как уже ни раз говорилось в этой ветке, смысла писать именно на MC++ нет. Я делаю упор на то, что managed и unsafe код в MC++ отличаются как стилем кодирования, так и наличием большого количества подводных камней. И если уж говорить о преимуществах managed кода, то C# в этом случае будет более правильным выбором, т.к. на MC++ человек как следует не освоит ни того, ни другого.
Для C# он как раз может быть правильным, иногда просто быстрее написать try/finally, чем дописывать объект, который не поддерживает IDisposable. Кроме того, помимо освобождения ресурсов есть такая вещь, как поддержка целостности состояния какого-нибудь объекта. Я говорю о чём-то вроде void f { this.someVar = true; try { } finally { this.someVar = false; } }в C++ надо будет как-то писать по другому? без try/catch?
в C++ надо будет как-то писать по другому? без try/catch?Конечно. Ты ведь не можешь из любой функции выходить через throw, а finally нету.
сколько ты знаешь функций, которые гарантированно не кидают исключений?
сколько ты знаешь функций, которые гарантированно не кидают исключений?А кто сказал, что я не буду кидать исключений? Я буду их кидать, и у меня всё будет работать правильно. Но мы уже ушли от темы.
Поэтому silverlight кроссплатформенный и век микрософта никуда не проходит.ссылка в тему
Оставить комментарий
Retor
Почему при объявлении многомерного массива его значения не инициализируются?Как его проинициализировать, кроме как обойти в цикле все его элементы? Методом Initialize что-то не выходит.