Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170

Как адаптировать функцию под inline

01.03.2017, 19:31. Показов 1482. Ответов 13

Студворк — интернет-сервис помощи студентам
Дана функция:
C++
1
2
3
4
5
bool Str(ifstream &f, const char *s)
{
    char buff[12];
    return !(f.get(buff, 12)&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n'));
}
- верно работает

попытался переписать:
C++
1
2
3
4
inline bool not_equal(ifstream &f, string s, string text = "")
{
    return getline(f,text,'>')&&text.compare(s)&&getline(f,text);
}
и никак не могу сообразить, почему она неверно срабатывает

Кликните здесь для просмотра всего текста
могу предоставить полный код, если это требуется
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2017, 19:31
Ответы с готовыми решениями:

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она подошла под inline ? Как...

Адаптировать функцию под node
Доброго времени суток. Есть некий js скрипт на сайте...

Как адаптировать под 32-ух битную систему
Приветствую! Создал программу, но она запускается только на 64 битной ОС. Пи попытке запустить на 32, выдает ошибку. Не подскажете как...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
01.03.2017, 19:53
А отрицание где?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
01.03.2017, 20:03
Цитата Сообщение от eXPonent Посмотреть сообщение
неверно срабатывает
Так а как насчет очевидного различия? В первой версии безусловно читается 12 символов (или до конца строки). Во второй версии читается сколько угодно до символа '>'.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
01.03.2017, 20:24  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а как насчет очевидного различия? В первой версии безусловно читается 12 символов (или до конца строки). Во второй версии читается сколько угодно до символа '>'.
так потому что в первом случае подается строка ровно 12 символов
а во втором неизвестно сколько символов
ведь нельзя же узнать длину
C++
1
const char *s
Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
А отрицание где?
Str == (!not_equal)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.03.2017, 20:27
Цитата Сообщение от eXPonent Посмотреть сообщение
ведь нельзя же узнать длину
C++
1
const char *s
Очень даже можно: strlen(s).
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
01.03.2017, 21:11  [ТС]
Написал функцию:
C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char *buff;
    return !(f.get(buff, strlen(s))&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n'));
}
выскочила ошибка:
Миниатюры
Как адаптировать функцию под inline  
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
01.03.2017, 21:12  [ТС]
Написал функцию так:
C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char buff[strlen(s)];
    return !(f.get(buff, strlen(s))&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n'));
}
выскочила ошибка:Ошибка 1 error C2057: требуется константное выражение c:\users\1\desktop\colonization\coloniza tion\colonization.cpp 12 1 Colonization
Ошибка 2 error C2466: невозможно выделить память для массива постоянного нулевого размера c:\users\1\desktop\colonization\coloniza tion\colonization.cpp 12 1 Colonization
Ошибка 3 error C2133: buff: неизвестный размер c:\users\1\desktop\colonization\coloniza tion\colonization.cpp 12 1 Colonization
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
01.03.2017, 21:18
Лучший ответ Сообщение было отмечено eXPonent как решение

Решение

C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char *buff = new char[strlen(s) + 1];
    return !(f.get(buff, strlen(s))&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n'));
}
1
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.03.2017, 08:37  [ТС]
А почему strlen(s) + 1 ?
никак не могу догнать

Добавлено через 11 часов 7 минут
немного подредактировав функцию, заработала верно...
C++
1
2
3
4
5
inline bool not_equal(ifstream &f, const char *s)
{
    char *buff = new char[strlen(s) + 1];
    return f.get(buff, strlen(s) + 1)&&strcmp(buff,s)&&f.ignore(LLONG_MAX,'\n');
}
вопрос, насколько будет разумно использовать inline
о можно её записать в виде одной строчки, как это сделано в похожей:
Цитата Сообщение от eXPonent Посмотреть сообщение
inline bool not_equal(ifstream &f, string s, string text = "") { return getline(f,text,'>')&&text.compare(s)&&ge tline(f,text); }
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
02.03.2017, 09:09
+1, потому как в конце строки обычно нулевой байт имеется.
strlen(s) как раз его и ищет, считая количество символов до него.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.03.2017, 09:58  [ТС]
тогда почему сработала функция:
C++
1
f.get(buff, strlen(s) + 1)
верно, а
C++
1
f.get(buff, strlen(s))
нет
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
03.03.2017, 08:04
eXPonent, в каком смысле "сработало" и "нет"
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
03.03.2017, 12:03  [ТС]
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
eXPonent, в каком смысле "сработало" и "нет"
при обработке текстовых файлов результат аналогичен исходному коду -
значит сработало
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
03.03.2017, 16:28
Лучший ответ Сообщение было отмечено eXPonent как решение

Решение

Цитата Сообщение от eXPonent Посмотреть сообщение
немного подредактировав функцию, заработала верно...
Мой недосмотр, на вторую строку кода я и не смотрел, только на это:
Цитата Сообщение от eXPonent Посмотреть сообщение
Ошибка 1 error C2057: требуется константное выражение
Цитата Сообщение от eXPonent Посмотреть сообщение
тогда почему сработала функция:
C++
1
f.get(buff, strlen(s) + 1)
верно, а
C++
1
f.get(buff, strlen(s))
нет
Потому, что get() читает на единицу меньше, чем указано во втором параметре, добавляя, на оставшееся место, '\0'. strlen() выдаёт количество символов в строке без '\0', поэтому, если указать get() читать strlen(s), то будет прочитано на единицу мешьше символов, чем содержится в s (без '\0'), а вместо последнего символа будет поставлен '\0'.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2017, 16:28
Помогаю со студенческими работами здесь

Как адаптировать под retina на Windows 7?
Всем привет! Не понимаю каким образом я могу адаптировать под retina на Windows 7. Не нашёл каких-либо приложений, расширений браузеров и...

Как адаптировать js код под php
Здравствуйте я новичок в php и у меня возник вопрос Как перенести функций из js в php У меня есть страничка с radio в которой должна...

Как адаптировать шаблон под Joomla
Здраствуйте. Помогите пожалуйста разобраться, скачал бесплатный шаблон Start-Up от MonsterTemplate, внутри весь набор файлов и папок,...

Как адаптировать страничку под разные устройства?
Я создал страничку HTML, и естественно она отображается на всех устройствах по разному, как правильно будет адаптировать её?

Как адаптировать DLE под разные видеохостинги?
Всем привет. Может ли кто объяснить как адаптировать движок DLE к различным видеохостингов? В моем случаи интересует конкретно видео с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru