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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как ПРАВИЛЬНО передать аргумент функции 
V
    Опции темы
RAMe0
  Дата 18.12.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здрасте. 
(Прошу сильно не ругаться, если обсуждалось, просто времени нет поднимать старую инфу)

Вот такая проблемма:

Есть у меня код, и не хочет этот код работать правильно! Уж как я его только не уговаривал!?!? Не хочет и всё.

Значится так:
Код


/////////////////
//main.cpp
/////////////////

...
...
//Значится есть у меня такая переменная DrvName. Опишу, что тварится в дебугере
// -> - перед входом в функцию
// <- - после выхода из неё

    C_FFList FListLeft;

    LPSTR DrvName="";                              // DrvName=""
    FListLeft.GetDriveFromCombo(&DrvName);    // -> DrvName=""
                                                   // <- DrvName="E:\\"
    FListLeft.AddItemsFromDir(DrvName);             // -> DrvName="E:\\"
                                                   // см. дальше code.cpp
...
...

 Значит приходит DrvName в функцию
Код

////////////////////
// code.cpp
///////////////////

...
...

BOOL C_FFList::AddItemsFromDir(LPSTR Dir)                    // -> DrvName="E:\"    
{
    IShellFolder*    pRootFolder    = GetRootFolder(Dir);    // -> DrvName="ММММММММММММММММММММММММ?БA" !!!!!!!
...
}
...
...



А теперь, уважаемые знатоки, вопрос: ПОЧЕМУ ТАК????????

P.S. Пробовал передавать в AddItemsFromDir() указатель, ситуация ни чем не изменилась.

P.S.S. Сам я с шарпа пришел. Прошу строго не судить.
PM MAIL ICQ   Вверх
Romikgy
Дата 19.12.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



потому что 
Цитата(RAMe0 @  18.12.2006,  22:59 Найти цитируемый пост)
LPSTR

это указатель на char , хотя может быть и немного другое,
а для размещения строки символов, надо память зарезервировать!
Цитата(RAMe0 @  18.12.2006,  22:59 Найти цитируемый пост)
Сам я с шарпа пришел

Дык почитай книги по Си да С++, имхо шарп отличается от этих языков,
так что курим мат часть, а потом пишем( дружеский совет!)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Xenon
Дата 19.12.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Romikgy, Это const char* вроде


--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 19.12.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Xenon, типа я не в курсе, 
вопрос в другом , под него что память выделять не надо?

Добавлено @ 10:31 
Цитата(Xenon @  19.12.2006,  00:08 Найти цитируемый пост)
const

чет я это пропустил smile
воть из хедерного файла
Код

typedef char CHAR;
typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR;

так что Xenon, ты немного не прав smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
RAMe0
Дата 19.12.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

это указатель на char , хотя может быть и немного другое,
а для размещения строки символов, надо память зарезервировать!


Тогда напрашивается вопрос: почему для пенрвой ф-ции не надо ни чего резервировать, а для втораой надо?? Ведь первая то функция обрабатывает все как надо.

Цитата

Дык почитай книги по Си да С++, имхо шарп отличается от этих языков,
так что курим мат часть, а потом пишем( дружеский совет!)


Я ж говорю, времени не осталось почти   smile  Мне в универ надо написать аналог тотал командира!!! Весь вывод сделан, осталось тока элементы связать меж собой и обработчики сообщений доделать.

Это сообщение отредактировал(а) RAMe0 - 19.12.2006, 12:33
PM MAIL ICQ   Вверх
Romikgy
Дата 19.12.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(RAMe0 @  18.12.2006,  22:59 Найти цитируемый пост)
C_FFList

что есть это?
раз уж 
Цитата(RAMe0 @  19.12.2006,  11:29 Найти цитируемый пост)
почему для пенрвой ф-ции не надо ни чего резервировать, а для втораой надо??




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Xenon
Дата 19.12.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Romikgy, слажал smile


--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 19.12.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Xenon @  19.12.2006,  19:12 Найти цитируемый пост)
Romikgy, слажал

хто я ? smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Xenon
Дата 19.12.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Romikgy, 
Цитата
хто я ?

Ты Romikgy  smile 
Я слажался, я smile 


--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 19.12.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Xenon @  19.12.2006,  20:07 Найти цитируемый пост)
Ты Romikgy

да я Romikgy !!!!
smile

Цитата(Xenon @  19.12.2006,  20:07 Найти цитируемый пост)
Я слажался, я

все терь понял , ждем автора темы...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
RAMe0
  Дата 20.12.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

 ждем автора темы...

А вот и я. Спасибо за внимание, но я нашел ответ. Проблемма заключалась в моей неграмотности. Просто я делал так:
Код

VOID C_FFList::GetDriveFromCombo(LPSTR * str)
{
    INT res=(INT)SendMessage(hCombo,CB_GETCURSEL,0,0);
    if(res==CB_ERR)
        *str = "CB_ERR";
    CHAR buf[4];
    buf[3]='\0';
    SendMessage(hCombo, CB_GETLBTEXT, res, (LPARAM) buf);
    *str=buf;
}



Знающие люди сказали, что в этом случае в стр теперь не указатель на переменную, которая пришла, а указатель на buf!!!  А я то думал, что если сделать так *str=buf, то сменится не указатель, а данные лежащие в указаной области smile 

А надо было так :
Код

VOID C_FFList::GetDriveFromCombo(LPSTR str)
{
    INT res=(INT)SendMessage(hCombo,CB_GETCURSEL,0,0);
    if(res==CB_ERR)
        str = "CB_ERR";
    CHAR buf[4];
    buf[3]='\0';
    SendMessage(hCombo, CB_GETLBTEXT, res, (LPARAM) buf);
    memcpy(str, buf, 4);
}



C_FFList - мой класс (какбы контрол), для работы с лист-вью+сомба+заголовочек листа (как в командире)
PM MAIL ICQ   Вверх
Romikgy
Дата 20.12.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



все равно не вижу где идет выделение памяти под 
Цитата(RAMe0 @  20.12.2006,  00:25 Найти цитируемый пост)
str

мож и проканало , но в будущем имхо возможны глюки
Цитата(RAMe0 @  20.12.2006,  00:25 Найти цитируемый пост)
VOID C_FFList::GetDriveFromCombo(LPSTR * str)
{
    INT res=(INT)SendMessage(hCombo,CB_GETCURSEL,0,0);
    if(res==CB_ERR)
        *str = "CB_ERR";
    CHAR buf[4];
    buf[3]='\0';
    SendMessage(hCombo, CB_GETLBTEXT, res, (LPARAM) buf);
    *str=buf;
}

а здесь не работало , ибо переменая буф локальная и после выхода из ф_ции она уходит на лево


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Daevaorn
Дата 20.12.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



RAMe0, это называется, если у вас не хватает квалификации в работе с С-строками, то юзайте уже наконец std::string!!! smile
PM MAIL WWW   Вверх
RAMe0
Дата 21.12.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

все равно не вижу где идет выделение памяти под 

Это я написать забыл  smile
Вот так это было
Код

    char DrvNameC[1000] ="";
    LPSTR DrvName = (LPSTR)DrvNameC;



Цитата

RAMe0, это называется, если у вас не хватает квалификации в работе с С-строками, то юзайте уже наконец std::string!!! 

Так как же эту квалификацию получить то, если стринги юзать?? Лучше уж пока учусь помучаюсь ;)
PM MAIL 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.1042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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