Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Ошибка

Автор: sheka 7.07.2010 19:35

warning: incompatible implicit declaration of built-in function 'strchr'
то же самое пишет для strlen.
Что бы это значило?

Добавлено через 6 мин.
Как только написал на форум, до меня дошло, что я не подключил #include <strings.h> smile.gif
Теперь очень интересует, почему тогда эти функции работали?

Автор: volvo 7.07.2010 20:41

Цитата
Теперь очень интересует, почему тогда эти функции работали?
Работали? Потому что размер int-а на твоей машине равен размеру const char*. Это не гарантируется в общем случае, как только ты запустишь программу на машине, где sizeof(int) != sizeof(const char*), твой код "работать" перестанет.

А теперь - вопрос на засыпку: почему sizeof(const char*) вроде бы понятно, да? Все-таки, первый параметр strchr (да и strlen - тоже) как раз такого типа. Попробуй подумать и объяснить, почему sizeof(int)... smile.gif


Автор: Client 7.07.2010 22:26

мой ответ smile.gif (Показать/Скрыть)

Автор: volvo 7.07.2010 23:10

Цитата(Client)
Так?
Что "так"? Насчет размеров - так, но это не дает ответа на вопрос, почему именно int, а не, скажем, void*.

Автор: Krjuger 8.07.2010 23:04

Я немного не понял суть вопроса.Ты спрашивал почему если размер "размер" инта не равен "размеру " указателя чара то работать не будет?

Цитата
Могут быть разного типа на процессорах не 32 разрядных


А при чем тут разрядность?

Автор: volvo 8.07.2010 23:18

Я спрашивал, почему оно может перестать работать, как только размер const char * будет отличаться от размера int. И уточнил, что основная суть вопроса - почему здесь появился именно int, а не какой-то другой тип... Ребята, надо знать инструмент, которым пользуетесь, что ж такое? Это ж настолько просто...

Автор: Krjuger 8.07.2010 23:30

Ну я ленивый книжки щас листать, а гугл все знает....В общем,то к чему я пришел.

Цитата
const char * strchr ( const char * str, int character );
Parameters
str
C string.
character
Character to be located. It is passed as its int promotion, but it is internally converted back to char.


Если бы их размены не совпадали, то при конвертации могут возникнуть проблемы....

Тут кстати и обьясняется почему именно int,а не какой то другой тип

Автор: volvo 9.07.2010 0:48

Ничего тут не объясняется. Это первая попавшаяся цитата, подходящая под то, на чем я акцентировал внимание. В таком случае, strcpy имеет ту же проблему. В чем она? Int-ов в параметрах нет...

Без листания книжек, причем вдумчивого, такие вопросы не решаются, если не знаешь изначально.

Автор: Krjuger 9.07.2010 1:29

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

Возможно я что то не правильно понял,так что Volvo,если что не пинай меня сильно ногами.

Автор: volvo 9.07.2010 1:40

Цитата
Мне кажется,что это вполне достаточно для обяснения причины ошибки.
no1.gif Это тебе только кажется. На самом деле причина - в другом smile.gif Еще раз: Читаем внимательно заголовок темы, и смотрим, какой язык указан...

Подсказка №1: Почему в чистом С разрешено

main()
{
return 0;
}

, в то время, как С++ выдает серьезное предупреждение при компиляции такого кода? smile.gif

Автор: Krjuger 9.07.2010 2:34

Да выдает.причем забавное.Типа С++ не поддерживает дефолтовый инт.

зато обьявленный уже пашет ....


int main()
{
return 0;
}


Я думаю это дополняет ту ересь, что я до этого загонял.Хотя при чем тут sizeof... я понять не могу,так что давай еще подсказки..... smile.gif Я тугой.

Хотя если учесть что результат получается в инт, который никак не обьявляется,и при этом с++ на дефолтный ругается,то истина где то близко.

Автор: volvo 9.07.2010 16:23

Ну я даже не знаю, как еще подсказать, чтобы не сказать ответ сразу. А ответ давать не хочется, кто-то ж должен додуматься (только в HIDE догадки заключайте)...

Ну, допустим, так: попробуй подумать, а почему исходный код, собственно, не компилируется С++? В чем его (С++ в смысле) проблема? Почему "plain C" компилирует, а С++ - нет?

Есть существенные отличия между этими двумя языками. Вытекают они из того, что в С++ более строгий контроль типов, чем в чистом С. Вот когда ты доберешься до того, что за отличия, и что такого можно делать в С, но нельзя - в С++, в чем контроль типов С++ строже, чем С-шный - тогда и поймешь, почему я задал именно такой вопрос smile.gif Больше не знаю, как подсказать... Думайте...

Автор: Krjuger 9.07.2010 22:57

Ну принципи тут уже немного исторические различия и конструктивные...

Спойлер (Показать/Скрыть)

Автор: sheka 10.07.2010 1:54

volvo, уже перечитал книжечку, интернет перерыл. И понял, что я наверное действительно не понял вопрос. Вот пример использования этих функций:

#include <stdio.h>
#include <conio.h>
//#include <strings.h>

main() {
char s[256] = {0};
printf("Vvedi stroku : \n");
gets(s);
if (strchr(s,'.')){
printf("est. Dlina = %i", strlen(s));
}
else{
printf("netu. Dlina = %i", strlen(s));
}
return 0;
}
Перефразируйте, пожалуйста, свой вопрос как "для меня", потому что что-то я тугой.. wacko.gif

Автор: Krjuger 10.07.2010 3:34

И при чем тут твой код?? он как раз на С и на писан,а реч идет о том что на С++ такое не прокатит,Volvo спрашивает почему.А вот стоит тебе заюзать iostream и тебе сразу вывалит ошибку return 0 как минимум.

Автор: volvo 10.07.2010 3:44

Блин. Вопрос снят... Вас устраивает "как есть", значит, пусть будет "как есть", без заголовочных файлов программа работает? Прекрасно. Не заморачивайтесь. Не стОит. Когда программа начнет глючить - и вопрос поймете, и ответ найдете.

Который раз понимаю, что вопросы "а почему так происходит" на форумах лучше не поднимать - это просто напросто никого не интересует, и разбираться никто не хочет. Работает и ладно, а вопросов наводящих никто не понимает, оказывается.

Ответ на вопрос - кому интересно (Показать/Скрыть)

Автор: Krjuger 10.07.2010 3:56

Ну а разве мои рассуждения не были верны?Да, я написал намного корявее и возможно запутаннее,но вроде как про все это говорил,и на мсдн ссылался в том пране что в С++ убрали такую возможность как обращаться к дефолтному инту. и то что его тоже надо описывать.Ведь помимо всего ты спросил отличия,вот я от них и пошел.Насчет вопросво" а почему" ,а ты посомтри сколько челвоек вообще откликнулись на вопрос....Меня заинтересовало,я попробовал найти ответ,ну не получилось,но поиск это тоже хорошо.Более того скажу мой преподаватель вообще абстрактно дал обьяснение,что наводит на мысль, что он сам не знал ответа.

Автор: sheka 10.07.2010 4:20

Цитата
Блин. Вопрос снят... Вас устраивает "как есть", значит, пусть будет "как есть", без заголовочных файлов программа работает? Прекрасно. Не заморачивайтесь. Не стОит. Когда программа начнет глючить - и вопрос поймете, и ответ найдете.

Который раз понимаю, что вопросы "а почему так происходит" на форумах лучше не поднимать - это просто напросто никого не интересует, и разбираться никто не хочет. Работает и ладно, а вопросов наводящих никто не понимает, оказывается.

volvo, именно потому, что меня не устраивает - поэтому и спрашиваю. Как минимум меня и Krjugerа это интересует. К сожалению, я действительно не понял вопрос.
Цитата
почему sizeof(const char*) вроде бы понятно, да? Все-таки, первый параметр strchr (да и strlen - тоже) как раз такого типа. Попробуй подумать и объяснить, почему sizeof(int)...
Что означает "почему sizeof(const char*)" ?
Цитата
почему оно (одно из выражений strlen или strchr?) может перестать работать, как только размер const char * будет отличаться от размера int. И уточнил, что основная суть вопроса - почему здесь(т.е. почему функция strlen возвращает int?) появился именно int, а не какой-то другой тип


Krjuger, а с вот этим
Цитата
main()
{
return 0;
}
я встречался и я все таки найду на это ответ.

Автор: Krjuger 10.07.2010 14:59

Ну если не найдеш,то под спойлером Volvo есть ответ,либо почитай мои идеи,принципи если их грамотно сформулировать и выкинуть ненужное,то истина будет в них