Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> демон под BSD для вычислений 
V
    Опции темы
Larrikin
Дата 2.9.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Соображение такое - сделать программу по модели grep, то есть брать текстовые данные со стандартного входа или файла и отдавать на стандартный выход или файл...

данные - несколько (вряд ли тысячи, скорее десятки, может сотни) строк. Каждая несет один набор, состоящий из чисел, разделенных двоеточием:
целое число со знаком (id)
дробное число со знаком (value)

на выходе в том же формате строки:
целое число со знаком(id1)
целое число со знаком(id2)
символьная строка(action)


Какой пример реализации по такой модели самый удачный и несложный?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 2.9.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  2.9.2007,  13:56 Найти цитируемый пост)
Какой пример реализации по такой модели самый удачный и несложный? 

так тут вообще нет ничего сложного
Код

int main() {
    ssize_t count;
    int size, position = 0;
    char buffer[SIZE];
    while ((count = read(STDIN_FILENO, buffer + position, SIZE - position))) {
        if (count < 0) return errno;
        /* работаем с данными */
        do {
            if (write(STDOUT_FILENO, buffer + position, size) < 0) { /* size может быть != count */
                if (errno == EINTR) continue;
                else return errno;
            }
            break;
        } while (1);
    }
    return 0;
}


Это сообщение отредактировал(а) MAKCim - 2.9.2007, 15:00


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 2.9.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(Larrikin @  2.9.2007,  13:56 Найти цитируемый пост)
данные - несколько (вряд ли тысячи, скорее десятки, может сотни) строк. Каждая несет один набор, состоящий из чисел, разделенных двоеточием:
целое число со знаком (id)
дробное число со знаком (value)

на выходе в том же формате строки:
целое число со знаком(id1)
целое число со знаком(id2)
символьная строка(action)

имхо, можно обойтись и без демона... awk, perl неплохо подойдут для такой задачи. Правда, не понял логику преобразования...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Larrikin
Дата 2.9.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



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

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


взять кусок строки от начала до первого двоеточия, выбрать из него ноль или один знаков минус с последующими не менее одной цифры и только цифры
запомнить это число как id
убедиться, что такого id до сих пор не было в этом наборе данных
если что не так - ругнуться в stderr и попробовать выдрать данные из следующей строки

взять кусок строки от первого двоеточия до второго
попробовать преобразовать его в число в обычной нотации или в научной или шестнадцатиричной и т.д.
запомнить это число как value
если никак не получилось  - ругнуться в stderr и попробовать выдрать данные из следующей строки

добавить набор из id, value в массив данных для дальнейшей работы

обработать следующую строку


PM MAIL WWW ICQ   Вверх
MAKCim
Дата 2.9.2007, 17:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Larrikin @  2.9.2007,  16:55 Найти цитируемый пост)
пример какой-то куцый - на простое чтение и запись, а перед работой с данными нужно проделать дофига всякой работы ведь

ну так проделай эту работу
ты ж сам алгоритм написал
 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Larrikin
Дата 2.9.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



изобрести колесо?
боюсь, квадратное получится...
наверняка уже полно отлаженных есть реализаций - работают же утилиты с файлов /etc/master.password как раз похожий набор строк...

какие реализации считаются самыми удачными/проверенными?
PM MAIL WWW ICQ   Вверх
bsa
Дата 3.9.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Larrikin, смотри в сторону strtok(). Она позволяет разбивать строку разделенную чем-то на подстроки.
PM   Вверх
Larrikin
Дата 10.9.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



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

Если кто может написать эти несколько строк кода интерфейса, чтобы можно было вставить обработку свою по аналогии примера MAKCim - заплачу 70 WMZ с протекцией

примерное ТЗ в этой теме, если надо подробнее - расскажу в ICQ 129916863
PM MAIL WWW ICQ   Вверх
bsa
Дата 10.9.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Попробуй такой код:
Код
while( !feof(stdin) ) {
      int id;
      double value;
      int x = scanf("%i:%f", &id, &value);
      if (x == 2) {
            int id1, id2;
             //here need some processing code
            printf("%i:%i:%f\n", id1, id2, value);
      } else {
             fprintf(stderr, "invalid format\n");
      }
}

PM   Вверх
Larrikin
Дата 10.9.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Цитата(bsa @  10.9.2007,  17:56 Найти цитируемый пост)

      int id;
      double value;
      int x = scanf("%i:%f", &id, &value);

выглядит красиво, а насколько он устойчив к входным данным и всегда ли сможет принять, например, такие?

-1: (подразумевается пара -1 и 0)
- 1: 0 (подразумевается пара -1 и 0)
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111:1 (корректно игнорить строку)
12: - 0.12123123 (пробелы после двоеточия, знака и перед переводом строки, подразумевается 12 и -0.12123123 )

и еще один момент - для обработки данных нужен массив, то есть одновременно нужны и первое и третье значения и т.п.
размер массива не обязательно делать бесконечно возмножной размерности (память жалко на ошибки тратить), можно ограничить, например 1000 элементов (по-хорошему задавать бы это опциями при старте, но я там поглядел реализации и погрустнел - это еще пару месяцев фтыкать)

Это сообщение отредактировал(а) Larrikin - 10.9.2007, 19:20
PM MAIL WWW ICQ   Вверх
bsa
Дата 10.9.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Ты возьми и попробуй. Если тебе нужен исполнитель - в другой раздел.
PM   Вверх
Larrikin
Дата 11.9.2007, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



вот что получилось и даже компилируется gcc ncalc.c -o ncalc:
Код

#include <stdio.h>

// Сколько строк данных мы готовы переварить
// TODO: сделать опцией командной строки
#define MAX_DATALINE 100

int main (void){

// counter
        int i;

// теоретически приходящие данные должны содержать целое и дробное число
        struct dataline{
                long int id;
                long double value;
        };

// в этот массив будем сохранять приходящие данные для обработки
        struct dataline n[MAX_DATALINE + 1];

// в позиции 0 массива будет храниться номер последнего заюзанного элемента
// он же количество строк данных в массиве
        n[0].id = 0;

// часть дальнейшего кода дал bsa, я не очень уверен, что понимаю его смысл

// по логике тут из входящего потока должны извлекаться данные в массив
// TODO: данные в каждой строке потока разделяются пока только двоеточием

        while(!feof(stdin) || n[0].id < MAX_DATALINE){
                long int id;
                long double value;
                int x = scanf("%li:%lf", &id, &value);
                if (x == 2){
                        ++n[0].id;
                        n[n[0].id].id = id;
                        n[n[0].id].value = value;

//bsa                   int id1, id2;
//bsa here need some processing code
//bsa                   printf("%i:%i:%f\n", id1, id2, value);
                }else{
                        fprintf(stderr, "invalid format\n");
                }
        }

//processing here wirh arraj n

// output
        for ( i = 1; i <= n[0].id; ++i){
                printf("%li:%lf\n", n[i].id, n[i].value);
        }

        return 0;
}



сделал такой файлик data
> cat data
-1:20
0:0
1:21

выполняю
./ncalc < data

получаю в консоле бесконечный цикл:

invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
invalid format
^C
>

непонятно...
похоже, не отрабатывает !feof(stdin), но что это и как должно отрабатываться я в своих книжках не нашел, в инете только готовые примеры использования, на вид такие же...
PM MAIL WWW ICQ   Вверх
Larrikin
Дата 11.9.2007, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



еще одна странность - если поставить #define MAX_DATALINE 2, то на тех же данных вывод получается такой:

> ./ncalc < data
invalid format
-1:20.000000
0:0.000000
1:21.000000
>

очень непонятно, почему три строки обработал, а не две...
PM MAIL WWW ICQ   Вверх
Larrikin
Дата 11.9.2007, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



ну конечно, условие неверное, вот так работает ожидаемо:

Код

   while(!feof(stdin) && n[0].id < MAX_DATALINE){

PM MAIL WWW ICQ   Вверх
Larrikin
Дата 12.9.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



не могу найти инфу, может ли функция возвращать массив?
или, например, указатель на масссив?

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

PM MAIL WWW ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.