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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос, char * и const char * как аргумент ф-ции 
:(
    Опции темы
BioMaX
Дата 28.8.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток, уже выделялся глупыми вопросами, вот очередной:

Есть вот такой warning, чем он страшен, и как его предотвратить, это не мой кусок кода а дернутый из Quake 3, как можно предположить он должен работать верно. Искал литературу по этому поводу, и читал форум, скажу безуспешно.

src/cvar.c: In function ‘Cvar_FindVar’:
warning: passing argument 1 of ‘Q_stricmp’ discards qualifiers from pointer target type
note: expected ‘char *’ but argument is of type ‘const char *’


Код

int Q_stricmp (char *s1, char *s2)
{
  return Q_strncasecmp (s1, s2, 99999);
}

static cvar_t *Cvar_FindVar(const char *var_name)
{
  cvar_t  *var;
  long hash;

  hash = generateHashValue(var_name);

  for (var=hashTable[hash]; var; var=var->hashNext){
    if (!Q_stricmp(var_name, var->name)){
      return var;
    }
  }
  return NULL;
}

PM MAIL   Вверх
borisbn
Дата 28.8.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



хммм. странно. должен быть не warning, а error.
какой компилятор, какая версия и какие опции компиляции ?

а суть вот в чём: ф-ция Cvar_FindVar гарантирует тому, кто её вызовет, что данные, расположенные по указателю var_name не будут изменяться (const char *var_name). Ф-ция же Q_stricmp наоборот говорит, что данные, расположенные по указателю s1, могут быть изменены (char *s1).
Соответственно, при вызове из ф-ции Cvar_FindVar ф-ции Q_stricmp, и передаче ей констового указателя компилятор видит "нарушение гарантии", и, ИМХО, должен выдавать ошибку

вот http://liveworkspace.org/code/018e2af93d85...6586d1a84983ae0


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 29.8.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(BioMaX @  28.8.2011,  23:03 Найти цитируемый пост)
int Q_stricmp (char *s1, char *s2)
{
  return Q_strncasecmp (s1, s2, 99999);
}

Эту ф-ю объявите так:
Код

int Q_stricmp (const char *s1, const char *s2)


А вообще:
Q_strncasecmp (s1, s2, 99999); <- Ацкий кот. имхо.  smile 
PM MAIL   Вверх
spyswamp
Дата 29.8.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



borisbn, а с чего ты решил, что id Tech 3 написан на C++? По твоей же ссылке переключи на C, и все в ажуре. Двигло у них на C, а скрипты на C++ и персональном скриптовом языке.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
borisbn
Дата 30.8.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



spyswamp, а, да. не разглядел
Цитата(BioMaX @  28.8.2011,  23:03 Найти цитируемый пост)
src/cvar.c: In function ‘Cvar_FindVar’:


Тогда, если код ф-ции Q_stricmp можно изменять, то лучше воспользоваться советом volatile
Если можно изменять только код ф-ции Cvar_FindVar, то можно сделать так
Код

...
    if (!Q_stricmp((char*)var_name, var->name)){
...

Если же ничего менять нельзя, то на данный кусок кода этот warning можно выключить


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
BioMaX
Дата 7.9.2011, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу прощения за столь долгую пропажу, да движок id tech 3 написан на С, и странно но http://liveworkspace.org/code/7ebb23f4e809...0dd282d5d717b66 не выдает никаких ворнингов.

Компилятор gcc , а если точней то (4:4.4.3-1ubuntu1)

Я так понимаю дело в компиляторе, и как избежать этот ворнинг ?

Это сообщение отредактировал(а) BioMaX - 7.9.2011, 05:30
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(BioMaX @  7.9.2011,  05:29 Найти цитируемый пост)
странно но http://liveworkspace.org/code/7ebb23f4e809...0dd282d5d717b66 не выдает никаких ворнингов.

выдает: http://liveworkspace.org/code/41ea421b6fdb...bcbd9f6befcfdc6
просто если это варнинг, а бинарник все равно собрался, то LWS игнорирует варнинги. другое дело, что это Си.
в с++ это уже не варнинг, а ошибка: http://liveworkspace.org/code/ecc6c8c30def...5bc4533b3ef3843

Добавлено @ 05:44
Цитата(BioMaX @  7.9.2011,  05:29 Найти цитируемый пост)
как избежать этот ворнинг ?

не делать таких ошибок ;)

Это сообщение отредактировал(а) boostcoder - 7.9.2011, 05:45
PM WWW   Вверх
borisbn
Дата 7.9.2011, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(BioMaX @  7.9.2011,  05:29 Найти цитируемый пост)
как избежать этот ворнинг ?


Цитата(borisbn @  30.8.2011,  11:48 Найти цитируемый пост)

Тогда, если код ф-ции Q_stricmp можно изменять, то лучше воспользоваться советом volatile
Если можно изменять только код ф-ции Cvar_FindVar, то можно сделать так
Код

...
    if (!Q_stricmp((char*)var_name, var->name)){
...

Если же ничего менять нельзя, то на данный кусок кода этот warning можно выключить



Это сообщение отредактировал(а) borisbn - 7.9.2011, 08:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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