С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
1

Передача параметров в функцию

14.04.2016, 02:42. Показов 1520. Ответов 16

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пишу аналог функции strtok. Начал на с++ и написал код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
char *mstrtok(char * &str1, const char *str2)
{
    char *str3;
    
    if (str1 == NULL)
        return NULL;
    
    while (*str1 != '\0' && *str1 == *str2)
        str1++;
    
    str3 = str1;
 
    while (*str1 != '\0' && *str1 != *str2)
        str1++;
    
    if (*str1 != '\0')
    {       
        str1 = str1++;
        str1[-1] = 0;       
    }
    else
    {
        str1 = NULL;        
    }
 
    return str3;
}
Потом решил, всё это дело переписать на Си, но возникла проблема, вот этот параметр:
C++
1
char * &str1
компилятор Си отказывается принимать, подскажите, пожалуйста, как это дело уладить.
p.s. str1 должна сохранять все изменения которые она претерпела в функции. Приведенный выше код полностью рабочий на C++. То что mstrtok не совсем strtok, на это внимание можете не обращать.
Заранее спасибо за ответы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2016, 02:42
Ответы с готовыми решениями:

Передача параметров в функцию
Потихонечку изучаю Си. Решил написать программку которая должна переводить из dec в hex/bin. ...

Передача параметров в функцию
Здравствуйте, готовлюсь к экзамену по С. Вопрос такой: какие есть способы передачи параметров в...

Передача строк в функцию со сменным количеством параметров
Нужно передать строки в функцию f со сменным количеством параметров, передача должна остановиться...

Передача параметров в функцию
Люди помогите, пожалуйста. Есть такая простая задачка: В одномерном массиве, состоящем из n...

16
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 03:40 2
Цитата Сообщение от Затерянный Посмотреть сообщение
str1 должна сохранять все изменения которые она претерпела в функции.
А что вот это за загадочное "измененеие"

C
1
str1 = str1++;
? Что имеется в виду?

Цитата Сообщение от Затерянный Посмотреть сообщение
Приведенный выше код полностью рабочий на C++.
Пока ваш код содержит перлы, типа вышепроцитированного, "полностью рабочим" он может только казаться.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 03:44  [ТС] 3
это косяк, недоглядел, можно просто str1++ оставить

Добавлено через 1 минуту
тем не менее данный "перл" никак на работе не сказывается.
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 03:55 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от Затерянный Посмотреть сообщение
тем не менее данный "перл" никак на работе не сказывается.
Вам просто повезло.

Это "перл" теоретически вызывает неопределенное поведение, а практически приведет либо к эквиваленту str++, либо к эквиваленту "не менять str вообще". В последнем случае код будет работать неправильно. А какой вариант будет выбран компилятором - зависит от компилятора, его настроек, контекста, погоды на Марсе и т.п.

Что же касается основного вопроса - придется заменить & на * и везде работать с *str1 вместо str1, внимательно следя за приоритетом операций

C
1
2
3
4
5
6
7
8
9
10
11
12
char *mstrtok(char **str1, const char *str2)
{
    char *str3;
    
    if (*str1 == NULL)
        return NULL;
    
    while (**str1 != '\0' && **str1 == *str2)
        (*str1)++;
    
    str3 = *str1;
    ...
1
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:00  [ТС] 5
Не хочу показаться хамом, но мы по моему зря раздуваем тему. Я задал конкретный вопрос, и хотел бы получить на него ответ. То к чему вы цепляетесь, никак не относится к моему вопросу.
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:01 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что же касается основного вопроса - придется заменить & на * и везде работать с *str1 вместо str1,
... а при вызове такой mstrtok надо будет теперь явно передавать указатель на первый аргумент при помощи оператора &.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:03  [ТС] 7
Ну через двойной указатель понятно, а через один никак вывернуться нельзя? В библиотечной функции реализовано через один.
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:08 8
Цитата Сообщение от Затерянный Посмотреть сообщение
Ну через двойной указатель понятно, а через один никак вывернуться нельзя?
Нельзя.

Цитата Сообщение от Затерянный Посмотреть сообщение
В библиотечной функции реализовано через один.
Ну так вы же сами сказали: "То что mstrtok не совсем strtok, на это внимание можете не обращать." Это и есть одно из принципиальных отличий вашей функции от библиотечной: библиотечная функция сохраняет свой статус в некоей статической переменной (это кстати, плохо), а вы хотите сохранять и возвращать его через параметр (это намного лучше). Ничего не попишешь тогда - придется делать параметр "возвращаемым", а это требует дополнительной *.

То есть вывернуться-то конечно можно по-разному, но тогда придется отказываться от выбранного вами подхода. А это, боюсь, будет вами квалифицировано, как "никак не относящееся к вашему конкретному вопросу".
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:16  [ТС] 9
имелось ввиду, что библиотечная функция позволяет использовать целую строку разделителей, а моя только один

Добавлено через 6 минут
вот я тут чуток переписал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
char *mstrtok(char * str1, const char *str2)
{
    char *str3;
    static char *str4;
    
    if (str4 != 0)
        str1 = str4;
    if (str1 == 0)
        return 0;
    
    while (*str1 != '\0' && *str1 == *str2)
        str1++;
    
    str3 = str1;
 
    while (*str1 != '\0' && *str1 != *str2)
        str1++;
    
    if (*str1 != '\0')
    {       
        str1++;
        str1[-1] = 0;
        str4 = str1;        
    }
    else
    {
        str4 = 0;
        str1 = 0;       
    }
 
    return str3;
}
но теперь вопрос, как мне вернуть нулевой указатель, когда вся строка будет разобрана?
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:17 10
Цитата Сообщение от Затерянный Посмотреть сообщение
библиотечная функция позволяет использовать целую строку разделителей, а моя только один
Ваши отличия от strtok заключались не только в этом а еще и в том, что вы пытались хранить состояние парсера в передаваемом извне параметре.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:19  [ТС] 11
Всё давайте забудем про разделители. Нужно реализовать с одним указателем!
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:20 12
Цитата Сообщение от Затерянный Посмотреть сообщение
вот я тут чуток переписал:
Теперь получилось больше похоже на strtok (в плане хранения состояния парсера) со всеми вытекающими из этого проблемами.

Правда теперь возникает [посторонний] вопрос: зачем вы все это делаете? Ваша первая версия была лучше strtok в том плане, что была потенциально реентерабельной. Это оправдывало ее существование. А теперь вы получили аналог strtok со всеми его проблемами. Зачем он такой нужен?
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:25  [ТС] 13
По моему тут одна проблема, как остановить выполнение когда вся строка разобрана!?
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:35 14
Цитата Сообщение от Затерянный Посмотреть сообщение
как остановить выполнение когда вся строка разобрана!?
В смысле? Применить тот же подход, что и в strtok - когда вся строка разобрана возвращать null pointer.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:41  [ТС] 15
В том-то и проблема, что когда я разобрал строку у меня str1 и str4 должны быть NULL, но когда я вновь вызываю функцию оказывается, что str4 = NULL, а str = первому слову в строке.
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1798
Регистрация: 18.10.2014
Сообщений: 16,901
14.04.2016, 04:47 16
Цитата Сообщение от Затерянный Посмотреть сообщение
у меня str1 и str4 должны быть NULL
Ну так теперь про str1 в этой роли можно забыть - str1 больше не сохраняет состояние между вызовами. Что вы извне передаете в качестве str1, то и передается. (Это уж вам виднее, что вы там передаете. Мне отсюда не видно.)

Так что состояние парсера вам теперь придется контролировать через str4 и только через str4.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 84
14.04.2016, 04:51  [ТС] 17
А, всё понятно, нужно передать NULL в функцию.
0
14.04.2016, 04:51
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2016, 04:51
Помогаю со студенческими работами здесь

Передача параметров в функцию
Помогите решить ещё одну проблему) Пароль в хэшированном виде хранится в HashData. И пока выводится...

Передача параметров в функцию
при вызове одной и той же функции несколько раз нужно менять одну переменную на другую, как это...

Передача параметров в функцию
Здравствуйте! Возникли проблемы при написании простой, казалось бы, функции: function value =...

Передача параметров в функцию
Вызываю функцию: Main() { func(a,b); } func(int a1, int a2) { //внутри меняется значения...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru