IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Ошибка, С
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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

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


Гость






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

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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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


Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Client)
Так?
Что "так"? Насчет размеров - так, но это не дает ответа на вопрос, почему именно int, а не, скажем, void*.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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


А при чем тут разрядность?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

Цитата
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,а не какой то другой тип

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

Без листания книжек, причем вдумчивого, такие вопросы не решаются, если не знаешь изначально.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

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

main()
{
return 0;
}

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


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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

int main()
{
return 0;
}


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

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

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






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

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

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


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Ну принципи тут уже немного исторические различия и конструктивные...
Спойлер (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


И при чем тут твой код?? он как раз на С и на писан,а реч идет о том что на С++ такое не прокатит,Volvo спрашивает почему.А вот стоит тебе заюзать iostream и тебе сразу вывалит ошибку return 0 как минимум.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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

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

Ответ на вопрос - кому интересно (Показать/Скрыть)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


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

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

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


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

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 12:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name