Помощь - Поиск - Пользователи - Календарь
Полная версия: Ошибка
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
sheka
warning: incompatible implicit declaration of built-in function 'strchr'
то же самое пишет для strlen.
Что бы это значило?

Добавлено через 6 мин.
Как только написал на форум, до меня дошло, что я не подключил #include <strings.h> smile.gif
Теперь очень интересует, почему тогда эти функции работали?
volvo
Цитата
Теперь очень интересует, почему тогда эти функции работали?
Работали? Потому что размер int-а на твоей машине равен размеру const char*. Это не гарантируется в общем случае, как только ты запустишь программу на машине, где sizeof(int) != sizeof(const char*), твой код "работать" перестанет.

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

Client
мой ответ smile.gif (Показать/Скрыть)
volvo
Цитата(Client)
Так?
Что "так"? Насчет размеров - так, но это не дает ответа на вопрос, почему именно int, а не, скажем, void*.
Krjuger
Я немного не понял суть вопроса.Ты спрашивал почему если размер "размер" инта не равен "размеру " указателя чара то работать не будет?

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


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

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

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

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

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

main()
{
return 0;
}

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

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

int main()
{
return 0;
}


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

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

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

Есть существенные отличия между этими двумя языками. Вытекают они из того, что в С++ более строгий контроль типов, чем в чистом С. Вот когда ты доберешься до того, что за отличия, и что такого можно делать в С, но нельзя - в С++, в чем контроль типов С++ строже, чем С-шный - тогда и поймешь, почему я задал именно такой вопрос smile.gif Больше не знаю, как подсказать... Думайте...
Krjuger
Ну принципи тут уже немного исторические различия и конструктивные...
Спойлер (Показать/Скрыть)
sheka
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
И при чем тут твой код?? он как раз на С и на писан,а реч идет о том что на С++ такое не прокатит,Volvo спрашивает почему.А вот стоит тебе заюзать iostream и тебе сразу вывалит ошибку return 0 как минимум.
volvo
Блин. Вопрос снят... Вас устраивает "как есть", значит, пусть будет "как есть", без заголовочных файлов программа работает? Прекрасно. Не заморачивайтесь. Не стОит. Когда программа начнет глючить - и вопрос поймете, и ответ найдете.

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

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

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

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
Ну если не найдеш,то под спойлером Volvo есть ответ,либо почитай мои идеи,принципи если их грамотно сформулировать и выкинуть ненужное,то истина будет в них
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.