Как загнать String в char*
От: dosik Россия www.dosik.ru
Дата: 10.03.05 16:32
Оценка:
Пробую писать свою первую прогу на С++ в 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. — Хитрик Денис
Re: Как загнать String в char*
От: ScorpZ Украина  
Дата: 10.03.05 17:36
Оценка:
Здравствуйте, dosik, Вы писали:

D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск. Пишу следующее:


D>
D>if (fldChange->ShowDialog() == DialogResult::OK)
D>{
D>    char* filepath = new char[fldChange->SelectedPath->Length];

D>    ...

D>    fldChange->SelectedPath->CopyTo(0,filepath,0,fldChange->SelectedPath->Length);

D>    ...

D>    delete filepath;
D>}
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++ , на РСДН.
Re[2]: Как загнать String в char*
От: dosik Россия www.dosik.ru
Дата: 10.03.05 18:01
Оценка:
Здравствуйте, ScorpZ, Вы писали:

SZ>В двух словах — если переежаешь с Дэльфи на C++ .NET . То делать это можно в два этапа — сначала учишь типы данных С++ , а потом учишь те типы данных , которые придумало мелкософт для — manage C++ (это на самом деле то расширение С++ , которое юзается в .NET платформе и всех либах) . По этому поводу советую статейку — Управляемый C++ , на РСДН.


ОК. Статейку я почитаю, а что с этим то барохлом делать. Или это остается в качестве задания для закрепления пройденного материала?
Re: Как загнать String в char*
От: Mikka77  
Дата: 10.03.05 18:21
Оценка: -1
Здравствуйте, 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 — платформу.
"Количество времени, необходимое для решения задачи, не зависит от того, было это время использовано для решение данной задачи или нет." ©Mikka77
Re[2]: Как загнать String в char*
От: GarryIV  
Дата: 10.03.05 18:38
Оценка:
Hello, Mikka77!

M> Мой совет :

M> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет.
M> В противном случае лучше пиши на с#, т.к. эффект тот же что и от С++7,
M> но гемороя намного меньше. Вообще пока я убедился только в том, что
M> VC++7 полезен при портировании старых C++ проектов под .Net -
M> платформу.

Боже какой бред... Учи матчасть и не давай таких "дельных" советов.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[3]: Как загнать String в char*
От: Mikka77  
Дата: 10.03.05 18:50
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Hello, Mikka77!


M>> Мой совет :

M>> Если изучаешь с++, лучше пиши в VStudio6 — много проще будет.
M>> В противном случае лучше пиши на с#, т.к. эффект тот же что и от С++7,
M>> но гемороя намного меньше. Вообще пока я убедился только в том, что
M>> VC++7 полезен при портировании старых C++ проектов под .Net -
M>> платформу.

GIV>Боже какой бред... Учи матчасть и не давай таких "дельных" советов.


Ну, так нечестно. аргументированно, плиз
"Количество времени, необходимое для решения задачи, не зависит от того, было это время использовано для решение данной задачи или нет." ©Mikka77
Re[4]: Как загнать String в char*
От: GarryIV  
Дата: 10.03.05 19:01
Оценка:
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 код.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re: Как загнать String в char*
От: Centaur Россия  
Дата: 10.03.05 19:08
Оценка:
Здравствуйте, dosik, Вы писали:

D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.


Раз пишешь под .NET, то и для поиска файлов используй .NET’ные классы System.IO.DirectoryInfo и System.IO.FileInfo. Тем более что стандартный C++ не предоставляет средств для чтения каталогов, так что в любом случае придётся стороннюю библиотеку юзать.
Re[5]: Как загнать String в char*
От: Mikka77  
Дата: 10.03.05 20:40
Оценка:
Здравствуйте, 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# все-таки проще. ну или бейсик
"Количество времени, необходимое для решения задачи, не зависит от того, было это время использовано для решение данной задачи или нет." ©Mikka77
Re: Как загнать String в char*
От: dosik Россия www.dosik.ru
Дата: 10.03.05 21:33
Оценка:
Я весьма благодарен всем за дельные советы и за целую конференцию, которая прошла по поводу сравнения 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 как я понимаю. Так все же:

Как загнать String в char* ???
Re[2]: Как загнать String в char*
От: MAPCUAHUH  
Дата: 11.03.05 08:51
Оценка:
Здравствуйте, 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*


string s="abcdefg";
char* buf=new char[256];
for(int i=0;i<s.GetLength();i++){
buf[i]=str.GetAt(i);
}
buf[i]='\0';


только с названиями могу ошибится не работал в с++ 7 с этим типом
Re[3]: Как загнать String в char*
От: dosik Россия www.dosik.ru
Дата: 11.03.05 09:33
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>САМЫЙ ТУПОЙ СПОСОБ:


MAP>for перебираешь все символы строке и запихиваешь в char*



MAP>
MAP>string s="abcdefg";
MAP>char* buf=new char[256];
MAP>for(int i=0;i<s.GetLength();i++){
MAP>buf[i]=str.GetAt(i);
MAP>}
MAP>buf[i]='\0';
MAP>


MAP>только с названиями могу ошибится не работал в с++ 7 с этим типом


Нет, ну это уже совсем как-то нелепо. Оно пока так и работает, но вот хотелось бы классику увидеть!!!
Re: Как загнать String в char*
От: nilovs  
Дата: 13.12.07 16:42
Оценка:
перебирать все символы строке и запихивать в char* нельзя — они юникодные
я использую следующий код:
__gc class Utils
{
public:
 static System::Text::Encoding* encoding=System::Text::Encoding::GetEncoding(1251);
 static char* ToChars(System::String* str)
 {
  if(str==0 || str->Length==0)
   return "";
  char bytes __gc[] = encoding->GetBytes(str);
  char __pin *p = &bytes[0];
  return p;
 }
};

а используются полученные строки через __pin указатели
void set_Text(String* value)
{
 char __pin *text=Utils::ToChars(value);
 //...
}

delete не надо вызывать, т.к. само подчистится сборщиком мусора.
__pin указатель нужен для того, чтобы строка не удалялась, пока мы не выйдем из функции.
Re: Как загнать String в char*
От: Ziaw Россия  
Дата: 14.12.07 06:55
Оценка:
Здравствуйте, dosik, Вы писали:

D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск.


Оффтопик, но я бы не рекомедовал начинать изучение С++ с использования менеджед типов.
Если нужно именно изучение — используйте стандартные типы и библиотеки С++, все эти gc__, , будут вам только мешать непрозрачностью логики. Если нужен результат — используйте C#, синтаксис не очень отличается от С++, понимание придет быстрее.

Если всетаки нужна именно платформа .нет в с++, пользуйтесь только менеджед типами, пока не разберетесь с CLR.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[3]: Как загнать String в char*
От: _Morpheus_  
Дата: 14.12.07 18:07
Оценка:
Здравствуйте, dosik, Вы писали:

D>Здравствуйте, ScorpZ, Вы писали:


SZ>>В двух словах — если переежаешь с Дэльфи на C++ .NET . То делать это можно в два этапа — сначала учишь типы данных С++ , а потом учишь те типы данных , которые придумало мелкософт для — manage C++ (это на самом деле то расширение С++ , которое юзается в .NET платформе и всех либах) . По этому поводу советую статейку — Управляемый C++ , на РСДН.


D>ОК. Статейку я почитаю, а что с этим то барохлом делать. Или это остается в качестве задания для закрепления пройденного материала?


тебе какой char* нужен, юникодный или обычный? если юникодный, то в цикле проходишься по всем символам строки и складываешь их в выходной буфер. Если обычный, то смотри Encoding — выбираешь нужную кодировку и конвертишь в byte[]
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[6]: Как загнать String в char*
От: _Morpheus_  
Дата: 14.12.07 18:10
Оценка:
Здравствуйте, Mikka77, Вы писали:

M>Так он же вроде winforms использует и managed типы — а в этом случае на c# по-любому приятнее писать.

M>Тут вопрос в том, что ему нужнее — если именно с++ — то да, я наверное не прав; а вот если dosik'у нужно средство создания win-приложения под .Net платформу с использованием framework — то c# все-таки проще. ну или бейсик

да нет, я свои старые c++ проекты отребилдил под VS2005 и они нормально работают на машинах без фреймворка
Минус в том что там в библиотеках многие структуры/классы/функции deprecated
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re: Как загнать String в char*
От: TS_Rus Россия http://gendix.ru
Дата: 14.12.07 18:27
Оценка:
Здравствуйте, dosik, Вы писали:

D>Пробую писать свою первую прогу на С++ в MVS.NET. Всю жизнь до этого программил на Delphi. Сразу столкнулся с такой проблемой: надо загнать путь, выбранный с помощью диалога выбора окна из String в строку char* для того, чтоб в дальнейшем можно было организовать поиск. Пишу следующее:


D>
D>if (fldChange->ShowDialog() == DialogResult::OK)
D>{
D>    char* filepath = new char[fldChange->SelectedPath->Length];

D>    ...

D>    fldChange->SelectedPath->CopyTo(0,filepath,0,fldChange->SelectedPath->Length);

D>    ...

D>    delete filepath;
D>}
D>


D>Выскакивет ошибка:

D>error C2664: 'System::String::CopyTo' : cannot convert parameter 2 from 'char *' to '__wchar_t __gc[]'

D>Наверняка есть люди, которые знают в чем проблема и могут направить на путь истинный. Нужно преобразовывать именно в char*, т.к. _findfirst работает только с ней. И вообще, может есть ссылка на ресурсы в инете (желательно русскоязычные) такие момененты описанны. Не хочется больше такие глупые вопросы задавать (((.


Преобразовать как — уже ответили, но вообще тебе не нужно работать с char * в данной задаче.

Вот первый файл (разумеется, ещё надо проверить, что он есть — иначе Exception)
if (fldChange->ShowDialog() == DialogResult::OK)
{
    System::IO::FileInfo * firstFile = System::IO::Directory::GetFiles(fldChange->SelectedPath)[0];
}
Задай вопрос и получи ответ в реальном времени по ICQ/Skype &c. Регистрация в темах: «Программирование», «Интернет», «Компьютеры»: [a]http://asklive.ru/ThemeSubscribeForm.aspx?attachGroups=963-962-961">[a]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.