Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LPTSTR, Совместимость с char 
:(
    Опции темы
Ка
  Дата 9.7.2002, 13:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть фрагмент кода:
char Disks[NUM_DISKS];
///..
SearchInDir((LPTSTR)Disks);
}

void SearchInDir(LPTSTR Dir)
{
struct _finddata_t c_file;
   long hFile;
DWORD fAttrib;
char* rslt;
   /* Find first .c file in current directory */
rslt=(char*)malloc(3);
rslt=(char *)Dir[0];//это не правильно
strcat(rslt,":\\*");
как мне получить первую букву Dirв переменную rslt?
  Вверх
Fantasist
Дата 9.7.2002, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



А как насчет

*rslt=*Dir

или

rslt[0]=Dir[0]


--------------------
Волны гасят ветер...
PM MAIL   Вверх
не получается
Дата 9.7.2002, 14:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











не получается:
illegal indirection
  Вверх
TwoK
Дата 9.7.2002, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



Цитата
rslt=(char*)malloc(3);
rslt = (char*)......


Ты тут выделяешь 3 байта памяти, а затем хочешь присвоить значению этого указателя символ.

Код

rslt = (char) malloc(3);
memcpy(rslt,&Dir[0],1);

или

Код

rslt = (char) malloc(3);
rslt[0] = Dir[0];


или

Код

rslt = &Dir[0];



Вот.


--------------------
Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше...
PM MAIL   Вверх
Alex101
Дата 10.7.2002, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(Guest @ 09.7.2002, 14:24)
rslt=(char*)malloc(3);

А может написать так:
rslt=(char)malloc(3); ?


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
TwoK
Дата 10.7.2002, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



Не, стоп. malloc() возвращает (void*). То есть указатель "никакого" типа на начало выделенного куска памяти. Соответственно, его (указатель) надо преобразовать к виду "указатель типа char", то есть (char*).


--------------------
Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше...
PM MAIL   Вверх
Fantasist
Дата 10.7.2002, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Так вообще нельзя, негоже преобразовывать указатель к chаr, а уж если на то пошло, то красивее было бы так:

 rlts=new char[3];

Цитата
не получается:
illegal indirection


На какую это строчку такая штука вываливается?
LPTSTR - это LongPointerToString, то есть 32-битный указатель.  То есть обычно это просто псевдоним char*. Ну в крайнем случае, сделай так:

rlts[0]=((char*)Dir)[0]

или объяви rlts как LPTSTR.

Хотя это уже извращение, и мне кажется что дело в другом.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
TwoK
Дата 10.7.2002, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



Цитата
негоже преобразовывать указатель к chаr


Ты имел в виду (к char) или (к char*)?


--------------------
Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше...
PM MAIL   Вверх
Fantasist
Дата 10.7.2002, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Я имел ввиду вот эту строчку:
rslt=(char)malloc(3);


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Alex101
Дата 10.7.2002, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(Fantasist @ 10.7.2002, 15:10)
Я имел ввиду вот эту строчку:
rslt=(char)malloc(3);

Ну да, то есть new


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Unregistered
Дата 21.7.2003, 17:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











[/U][U][I][/I][/B][B][QUOTE][CODE]



  Вверх
shedon
Дата 22.7.2003, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Код

char* rslt = new char[strlen(Dir)];
rslt[0] = Dir[0];

Так нельзя ?


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
RAN
Дата 22.7.2003, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Мона, только чтоб strlen вернёт длину без нулевого байта, а без него строку использовать нельзя в стандартных функциях, то есть у тебя rslt на один символ короче Dir. И ещё если тебе нужен только первый символ, то и выделяй два байта (под символ и ноль).

Код

char* rslt = new char[2];
rslt[0] = Dir[0];
rslt[1] = 0;

PM MAIL ICQ   Вверх
shedon
Дата 22.7.2003, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



RAN, всё верно!
Не знал, что strlen возвращает без нуля.
А нафиг вообще надо было использовать маллоки и аллоки. Я ими вообще не когда не пользовался.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
HexoGenus
  Дата 22.7.2003, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Ну вы блин даете!!!!
Разве функция strcat умеет выделять дополнительную память?
куда вы влепите
c - 1байт
:\* - 3байта
0 -1байт
итого 5байт?
когда выделяешь память лучше выделить больше чем меньше smile.gif
поэтому при работе с файлами удобно использовать MAX_PATH
теперь по поводу malloc : сколько форумов смотрел везде рекомендуют использовать new... и не говорите мне что это одно и то же smile.gif
сейчас не значит навсегда....

Стоило привести не только проблему частную но и описать более полно функцию которую нужно написать и возможно кто-нибудь представил бы готовое решение smile.gif (очень уж функция кажется знакомой)

Что бы не разбираться с тем куском мусора который лежит в теле функции, привожу пример более простой: подстановка из строки конкретной буквы по ее номеру (от 1 и выше)



Код

char * SearchInDir(LPTSTR,int);
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Disks[]="abcde";
///..
char *Text=SearchInDir((LPTSTR)Disks,2);
ShowMessage(Text);
}
//---------------------------------------------------------------------------
char * SearchInDir(LPTSTR Dir,int i)
{
 char* rslt;
 rslt=(char *)malloc(MAX_PATH);
 rslt[0]=Dir[i-1];
 rslt[1]=0;
 strcat(rslt,":\\*");
 return rslt;
}


Кстати к автору вопроса : Если задачу уже решил хоть намекни, а то может мы тут зря заморачиваемся?

Это сообщение отредактировал(а) HexoGenus - 22.7.2003, 12:55
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.