Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Параметр - указатель на строку


Автор: mrTeapoт 5.6.2007, 13:04
 Добрый день, господа сионисты.
 У меня ситуация,которую вы, наверное, сочтете тривиальной. Я пытаюсь накарябать утилитку в  чистом С без плюсов. При передаче строки в качестве параметра в функцию

        void MultSlashes( char** Str );
        char ResFileName[512];

        .......
        MultSlashes( (char**)&ResFileName );

эта функция не может прочитать *Str ("Error:expression cannot be evaluated", said QuickWatch). Считает, что строка пустая. Соответственно

        if( NULL!=strchr(*Str, '\\') )

вызывает access violation. К моменту вызова MultSlashes ResFileName точно имеет осмысленное,  не равное "" значение. 
    У меня VC++ 6.0 Enterprise Edition; версия компилятора 12.00.8168. Непатченный.
    Поможите, люди добрые, и да продлит Аллах ваши дни.

Автор: zkv 5.6.2007, 13:38
к моменту вызова
strchr(*Str, '\\') 
нуль-символ в конце строки *Str имеется? 

В остальном вроде все нормально.

Только не вижу, в вашем случае, смысла передавать char**, почему не char*?

Автор: mrTeapoт 5.6.2007, 14:50
 Терминальный нуль имеется, в натуре.
Я пробовал char*, но при этом обработанная в функции строка-параметр по возвращении не менялась. То есть, я понял так, что в случае char* в стек копируется строка, а не адрес? Или не так?

Автор: Fazil6 5.6.2007, 15:29
должно быть так
Код

    void MultSlashes( char* Str );  
    char ResFileName[512];


вызов
Код

 MultSlashes( ResFileName );

Цитата(mrTeapoт @  5.6.2007,  14:50 Найти цитируемый пост)
Я пробовал char*, но при этом обработанная в функции строка-параметр по возвращении не менялась. То есть, я понял так, что в случае char* в стек копируется строка, а не адрес? Или не так?

что ты хочешь сделать конкретно сос воей строкой?

ResFileName объявлен так, что он по определениию не может меняться. Меняться могут только элементы этого массива, а начало его (адрес первого элемента связанный с именем ResFileName ) нельзя изменить. При вызове MultSlashes( ResFileName ); создается локальная переменная типа char* и инициализируется адресом нулевого элемента. Строка в стек не копируется

Автор: mrTeapoт 6.6.2007, 08:07
 Да, прошу пардону. char* работает.  Я ошибся при отладке.
Я понимаю, что ResFileName можно изменять только поэлементно. Функция писала в него, используя strcpy. Любопытно, однако, было бы узнать, что это было (в смысле с char** ). Ну да ладно. Всем спасибо.

ЗЫ: Админу удачи с новым серваком.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)