Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск. Пишу следующее:
if (fldChange->ShowDialog() == DialogResult::OK)
{
char* filepath = new char[fldChange->SelectedPath->Length];
...
fldChange->SelectedPath->CopyTo(0,filepath,0,fldChange->SelectedPath->Length);
...
delete filepath;
}
Выскакивет ошибка:
error C2664: 'System::String::CopyTo' : cannot convert parameter 2 from 'char *' to '__wchar_t __gc[]'
Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.
10.03.05 23:56: Перенесено модератором из 'C/C++' в .Net. — Хитрик Денис
Здравствуйте, dosik, Вы писали:
D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск. Пишу следующее:
D>
D>Выскакивет ошибка: D>error C2664: 'System::String::CopyTo' : cannot convert parameter 2 from 'char *' to '__wchar_t __gc[]'
D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.
В двух словах — если переежаешь с Дэльфи на C++ .NET . То делать это можно в два этапа — сначала учишь типы данных С++ , а потом учишь те типы данных , которые придумало мелкософт для — manage C++ (это на самом деле то расширение С++ , которое юзается в .NET платформе и всех либах) . По этому поводу советую статейку — Управляемый C++ , на РСДН.
Здравствуйте, ScorpZ, Вы писали:
SZ>В двух словах — если переежаешь с Дэльфи на C++ .NET . То делать это можно в два этапа — сначала учишь типы данных С++ , а потом учишь те типы данных , которые придумало мелкософт для — manage C++ (это на самом деле то расширение С++ , которое юзается в .NET платформе и всех либах) . По этому поводу советую статейку — Управляемый C++ , на РСДН.
ОК. Статейку я почитаю, а что с этим то барохлом делать. Или это остается в качестве задания для закрепления пройденного материала?
Здравствуйте, dosik, Вы писали:
D>Пробую писать свою первую прогу на С++ в MVS.NET.D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.
Тут все дело в том, что VC++7 — это не есть "стандартный" с++, это штука зовется managed c++ и грубо говоря (мягко выражаясь является одним из языков .Net-платформы. То есть там используются net-совместимые типы данных (__gc типы)
в функции CopyTo() 2-ой параметр — это не тип char из "обычного" с++, (в managed c++ такие типы объявляются как __nogc)
это тип __wchar_t __gc[];
__wchar_t означает, что его размер равен 2 байтам, а не одному (как у char, который ты пытаешься подставить)
Мой совет :
Если изучаешь с++, лучше пиши в VStudio6 — много проще будет.
В противном случае лучше пиши на с#, т.к. эффект тот же что и от С++7, но гемороя намного меньше.
Вообще пока я убедился только в том, что VC++7 полезен при портировании старых C++ проектов под .Net — платформу.
Hello, Mikka77!
M> Мой совет : M> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет. M> В противном случае лучше пиши на с#, т.к. эффект тот же что и от С++7, M> но гемороя намного меньше. Вообще пока я убедился только в том, что M> VC++7 полезен при портировании старых C++ проектов под .Net - M> платформу.
Боже какой бред... Учи матчасть и не давай таких "дельных" советов.
Здравствуйте, GarryIV, Вы писали:
GIV>Hello, Mikka77!
M>> Мой совет : M>> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет. M>> В противном случае лучше пиши на с#, т.к. эффект тот же что и от С++7, M>> но гемороя намного меньше. Вообще пока я убедился только в том, что M>> VC++7 полезен при портировании старых C++ проектов под .Net - M>> платформу.
GIV>Боже какой бред... Учи матчасть и не давай таких "дельных" советов.
Hello, Mikka77!
M> Здравствуйте, GarryIV, Вы писали:
GIV>> Hello, Mikka77!
M>>> Мой совет : M>>> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет. M>>> В противном случае лучше пиши на с#, т.к. эффект тот же что и от M>>> С++7, но гемороя намного меньше. Вообще пока я убедился только в том, M>>> что VC++7 полезен при портировании старых C++ проектов под .Net M>>> — платформу.
GIV>> Боже какой бред... Учи матчасть и не давай таких "дельных" советов.
M> Ну, так нечестно. аргументированно, плиз
7.1 лучший компилятор от Microsoft в плане соответствия стандарту С++. Шестерке до него далеко.
Что касается managed extensions то никто их использовать не заставляет. То есть VС++ 7.1 это не один из NET языков. Он замечательно позволяет создавать native код.
Здравствуйте, dosik, Вы писали:
D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.
Раз пишешь под .NET, то и для поиска файлов используй .NET’ные классы System.IO.DirectoryInfo и System.IO.FileInfo. Тем более что стандартный C++ не предоставляет средств для чтения каталогов, так что в любом случае придётся стороннюю библиотеку юзать.
Здравствуйте, GarryIV, Вы писали:
GIV>Hello, Mikka77!
M>> Здравствуйте, GarryIV, Вы писали:
GIV>>> Hello, Mikka77!
M>>>> Мой совет : M>>>> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет. M>>>> В противном случае лучше пиши на с#, т.к. эффект тот же что и от M>>>> С++7, но гемороя намного меньше. Вообще пока я убедился только в том, M>>>> что VC++7 полезен при портировании старых C++ проектов под .Net M>>>> — платформу.
GIV>>> Боже какой бред... Учи матчасть и не давай таких "дельных" советов.
M>> Ну, так нечестно. аргументированно, плиз
GIV>7.1 лучший компилятор от Microsoft в плане соответствия стандарту С++. Шестерке до него далеко. GIV>Что касается managed extensions то никто их использовать не заставляет. То есть VС++ 7.1 это не один из NET языков. Он замечательно позволяет создавать native код.
Так он же вроде winforms использует и managed типы — а в этом случае на c# по-любому приятнее писать.
Тут вопрос в том, что ему нужнее — если именно с++ — то да, я наверное не прав; а вот если dosik'у нужно средство создания win-приложения под .Net платформу с использованием framework — то c# все-таки проще. ну или бейсик
Я весьма благодарен всем за дельные советы и за целую конференцию, которая прошла по поводу сравнения C# и C++. Но вот только на вопрос мой так и не ответили. Привожу пример из MSDN:
int main()
{
// Embed an array of characters in a string
String* strSource = S"changed";
Char destination[] = { 'T', 'h', 'e', ' ', 'i', 'n', 'i', 't', 'i', 'a', 'l', ' ',
'a', 'r', 'r', 'a', 'y' };
// Print the char array
Console::WriteLine(destination);
// Embed the source string in the destination string
strSource->CopyTo (0, destination, 4, strSource->Length);
// Print the resulting array
Console::WriteLine(destination);
strSource = S"A different string";
// Embed only a section of the source string in the destination
strSource->CopyTo (2, destination, 3, 9);
// Print the resulting array
Console::WriteLine(destination);
}
Однако сия гадость тоже не компилится. ПОЧЕМУ???
А по поводу применения других функций для поиска, это не совсем то, что мне надо. _findfirst в интерпритации Delphi прекрасно справлялась со своими обязанностями, и в C++ по моему тоже должна. Это ведь API как я понимаю. Так все же:
Здравствуйте, dosik, Вы писали:
D>Я весьма благодарен всем за дельные советы и за целую конференцию, которая прошла по поводу сравнения C# и C++. Но вот только на вопрос мой так и не ответили. Привожу пример из MSDN:
D>
D>int main()
D>{
D> // Embed an array of characters in a string
D> String* strSource = S"changed";
D> Char destination[] = { 'T', 'h', 'e', ' ', 'i', 'n', 'i', 't', 'i', 'a', 'l', ' ',
D> 'a', 'r', 'r', 'a', 'y' };
D> // Print the char array
D> Console::WriteLine(destination);
D> // Embed the source string in the destination string
D> strSource->CopyTo (0, destination, 4, strSource->Length);
D> // Print the resulting array
D> Console::WriteLine(destination);
D> strSource = S"A different string";
D> // Embed only a section of the source string in the destination
D> strSource->CopyTo (2, destination, 3, 9);
D> // Print the resulting array
D> Console::WriteLine(destination);
D>}
D>
D>Однако сия гадость тоже не компилится. ПОЧЕМУ???
D>А по поводу применения других функций для поиска, это не совсем то, что мне надо. _findfirst в интерпритации Delphi прекрасно справлялась со своими обязанностями, и в C++ по моему тоже должна. Это ведь API как я понимаю. Так все же:
D>Как загнать String в char* ???
САМЫЙ ТУПОЙ СПОСОБ:
for перебираешь все символы строке и запихиваешь в char*
delete не надо вызывать, т.к. само подчистится сборщиком мусора.
__pin указатель нужен для того, чтобы строка не удалялась, пока мы не выйдем из функции.
Здравствуйте, dosik, Вы писали:
D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск.
Оффтопик, но я бы не рекомедовал начинать изучение С++ с использования менеджед типов.
Если нужно именно изучение — используйте стандартные типы и библиотеки С++, все эти gc__, , будут вам только мешать непрозрачностью логики. Если нужен результат — используйте C#, синтаксис не очень отличается от С++, понимание придет быстрее.
Если всетаки нужна именно платформа .нет в с++, пользуйтесь только менеджед типами, пока не разберетесь с CLR.
Здравствуйте, dosik, Вы писали:
D>Здравствуйте, ScorpZ, Вы писали:
SZ>>В двух словах — если переежаешь с Дэльфи на C++ .NET . То делать это можно в два этапа — сначала учишь типы данных С++ , а потом учишь те типы данных , которые придумало мелкософт для — manage C++ (это на самом деле то расширение С++ , которое юзается в .NET платформе и всех либах) . По этому поводу советую статейку — Управляемый C++ , на РСДН.
D>ОК. Статейку я почитаю, а что с этим то барохлом делать. Или это остается в качестве задания для закрепления пройденного материала?
тебе какой char* нужен, юникодный или обычный? если юникодный, то в цикле проходишься по всем символам строки и складываешь их в выходной буфер. Если обычный, то смотри Encoding — выбираешь нужную кодировку и конвертишь в byte[]
Здравствуйте, Mikka77, Вы писали:
M>Так он же вроде winforms использует и managed типы — а в этом случае на c# по-любому приятнее писать. M>Тут вопрос в том, что ему нужнее — если именно с++ — то да, я наверное не прав; а вот если dosik'у нужно средство создания win-приложения под .Net платформу с использованием framework — то c# все-таки проще. ну или бейсик
да нет, я свои старые c++ проекты отребилдил под VS2005 и они нормально работают на машинах без фреймворка
Минус в том что там в библиотеках многие структуры/классы/функции deprecated
Здравствуйте, dosik, Вы писали:
D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск. Пишу следующее:
D>
D>Выскакивет ошибка: D>error C2664: 'System::String::CopyTo' : cannot convert parameter 2 from 'char *' to '__wchar_t __gc[]'
D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.
Преобразовать как — уже ответили, но вообще тебе не нужно работать с char * в данной задаче.
Вот первый файл (разумеется, ещё надо проверить, что он есть — иначе Exception)