2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
 
 
Сообщение26.11.2005, 03:43 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
LynxGAV писал(а):
экзекьют

исполнять, выполнять. "Некоторые так и говорят - 'Не обнажай меч в корчме'".

LynxGAV писал(а):
Поэтому если ими не пользуемся, то в С все однаково. ?

Вы все понимаете правильно. Только я вот Ваш вопрос понять не могу :( . В C все по барабану. В C++ можно написать свой ++ так, что будет больно об этом вспоминать. Лучше этого не делать (не не писать свой ++, это-то иногда вполне оправданно, а не писать "плохой" ++), но иногда приходиться пользоваться чужой библиотекой. Поэтому лучше избегать дурных привычек.

LynxGAV писал(а):
Это как по модулю три переписать.

Тоже не понял. Видимо намек на переключение в две колонки?

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:06 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Решил после нескольких дней моральных мучений выложить свой вариант данной проги.

У меня вышло 3 файла:

stars.h:
Код:
#ifndef _STARS_DATA_BASE
#define _STARS_DATA_BASE

//Загружает список из файла, заполняет структуру sarray.
extern int LoadStarList(const char *filename, char separator);
//Очищает память.
extern void ClearStarList(void);
//Сортировка элементов по параметрам, номер пр-ра начинается с 0.
//если increscent != 0, то сортировка в нарастающем порядке, иначе - в убывающем.
extern void SortStarList(int paramnum, int increscent, int cnv);
//Получить параметр звезды. Возвращает NULL, если номера превышают количество.
extern char *GetStarParam(int starnum, int paramnum);
//Установить значение пр-ра. возвращает 0 в случае ошибки.
extern int SetStarParam(int starnum, int paramnum, char *paramval);
//Добавить звезду в список (Просто выделяет память под новые данные).
//Возвращает 0 в случае ошибки:
extern int AddStar(void);
//Сохраняет список звезд:
extern int SaveStarList(const char *filename, char separator);

extern int GetStarCount(void);
extern int GetParamCount(void);

#endif

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:10 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Я решил код каждого файла в разные посты засунуть, что бы не получилось одного слишком большого (поста)
Вот код второго файла (stars.c):

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <string.h>
#include <errno.h>

#define MAXSTRLEN 80

typedef struct
{
    char param[MAXSTRLEN];
} TStarParam;

typedef struct
{
    int nstars; //число звезд.
    int nparam;// кол-во параметров.
    TStarParam **star;
    TStarParam *baseptr;
} TStarArray;

//Загружает список из файла, заполняет структуру sarray.
int LoadStarList(const char *filename, char separator);
//Очищает память.
void ClearStarList(void);
//Сортировка элементов по параметрам, номер пр-ра начинается с 0.
//если increscent != 0, то сортировка в нарастающем порядке, иначе - в убывающем.
void SortStarList(int paramnum, int increscent, int cnv);
//Получить параметр звезды. Возвращает NULL, если номера превышают количество.
char *GetStarParam(int starnum, int paramnum);
//Установить значение пр-ра. возвращает 0 в случае ошибки.
int SetStarParam(int starnum, int paramnum, char *paramval);
//Добавить звезду в список (Просто выделяет память под новые данные).
//Возвращает 0 в случае ошибки:
int AddStar(void);
//Сохраняет список звезд:
int SaveStarList(const char *filename, char separator);

int GetStarCount(void);
int GetParamCount(void);

static TStarArray sarray;
static int sortparamnum;//Номер пр-ра, по которому будем сортировать.
static int order;//Порядок сортировки (1- по возрастанию, 0 - по убыванию)
static int convert;//если !=0, то строки преобразовывать в числа и сравнивать как числа.
//Функция сравнения двух элементов:
static int Compare(const void *a, const void *b);

//--------------------------------------------------------------------------
int LoadStarList(const char *filename, char separator)
{
    char *tmp1, *tmp2, *ptr;
    FILE *fid;
    int i,j, len;

    if(!(fid = fopen(filename, "rt")))
        return errno;//Ошибка при попытке открыть файл.
    len = filelength(fileno(fid))+1;//+1 - на всяк. случай, если в конце файла нет символа "перенос строки"
    ptr = (char *)malloc(len);
    fread(ptr, 1, len, fid);
    fclose(fid);
/////
    *(ptr + len-1) = '\0';
//Подсчитываем число параметров:
    sarray.nparam = 0;
    for(tmp1 = ptr; *tmp1 != '\n'; tmp1++)
        if(*tmp1 == separator)
            sarray.nparam++;
    if(*(tmp1-1) != separator)
        sarray.nparam++;
    sarray.nstars = 0;
//Подсчитываем количество прочитанных строк:
    for(tmp1 = ptr; *tmp1; tmp1++)
        if( *tmp1 == '\n')
        {
            sarray.nstars++;
            *tmp1 = '\0';
        }
    if(*(tmp1-1))
        sarray.nstars++;
//Выделяем память для массива строк:
//1) для массива указателей на указатели строк:
    sarray.star = (TStarParam **)malloc(sarray.nstars*sizeof(TStarParam *));
//2) Для массива указателей на строки:
    sarray.baseptr = (TStarParam *)malloc(sarray.nstars*sarray.nparam*sizeof(TStarParam));
//Инициализируем массивы указателей:
    for(i = 0; i < sarray.nstars; i++)
        sarray.star[i] = sarray.baseptr + i*sarray.nparam;
//Копируем строки из временого буфера в структуры:
    tmp1 = ptr;
    for(i = 0; i < sarray.nstars; i++)
    {
        len = strlen(tmp1)+1;
    //Удаляем разделители:
        for(tmp2 = tmp1; *tmp2; tmp2++)
            if(*tmp2 == separator)
                *tmp2 = '\0';
    //Копируем строки:
        for(j=0, tmp2=tmp1; j < sarray.nparam; j++)
        {
            strcpy(sarray.star[i][j].param, tmp2);
            tmp2 += strlen(tmp2)+1;
        }
        tmp1 += len;
    }
//Освобождаем временный буфер:
    free(ptr);
    return 0;
}
//--------------------------------------------------------------------------
void ClearStarList(void)
{
    free(sarray.star);
    free(sarray.baseptr);
}
//--------------------------------------------------------------------------
void SortStarList(int paramnum, int increscent, int cnv)
{
    if(paramnum >= sarray.nparam)
        return;
    sortparamnum = paramnum;
    order = increscent;
    convert = cnv;
    qsort(sarray.star, sarray.nstars, sizeof(TStarParam *), Compare);
}
//--------------------------------------------------------------------------
//Функция сравнения двух элементов:
static int Compare(const void *a, const void *b)
{
    const TStarParam **ptr1 = (const TStarParam **)a,
                     **ptr2 = (const TStarParam **)b;
    int res;
    if(!convert)
        res = strcmp((*ptr1)[sortparamnum].param, (*ptr2)[sortparamnum].param);
    else
    {double a = atof((*ptr1)[sortparamnum].param) - atof((*ptr2)[sortparamnum].param);
        if(!a)
            res = 0;
        else
            res = a > 0 ? 1 : -1;
    }
    return order ? res : -res;
}
//--------------------------------------------------------------------------
//Получить параметр звезды. Возвращает NULL, если номера превышают количество.
char *GetStarParam(int starnum, int paramnum)
{
    return sarray.star[starnum][paramnum].param;
}
//--------------------------------------------------------------------------
//Установить значение пр-ра. возвращает 0 в случае ошибки.
int SetStarParam(int starnum, int paramnum, char *paramval)
{
    int L = strlen(paramval);
    if( L > MAXSTRLEN-1)
        paramval[MAXSTRLEN] = '\0';
    if(L)
        strcpy(sarray.star[starnum][paramnum].param, paramval);
    else
    {
        sarray.star[starnum][paramnum].param[0] = '?';
        sarray.star[starnum][paramnum].param[1] = '\0';
    }
    return 1;
}
//--------------------------------------------------------------------------
//Добавить звезду в список (Просто выделяет память под новые данные).
//Возвращает 0 в случае ошибки:
int AddStar(void)
{
    TStarParam **tmp1, *tmp2;
    int i;
//Перераспределяем память:
    if(!(tmp1 = (TStarParam **)realloc(sarray.star, (sarray.nstars+1)*sizeof(TStarParam *))))
        return 0;
    sarray.star = tmp1;
    if(!(tmp2 = (TStarParam *)realloc(sarray.baseptr, sarray.nparam*(sarray.nstars+1)*sizeof(TStarParam))))
    {
        free(tmp1);
        free(sarray.baseptr);
        return 0;
    }
    sarray.baseptr = tmp2;
    sarray.nstars++;    
//Инициализируем массивы указателей:
    for(i = 0; i < sarray.nstars; i++)
        sarray.star[i] = sarray.baseptr + i*sarray.nparam;
    return 1;
}
//--------------------------------------------------------------------------
//Сохраняет список звезд:
int SaveStarList(const char *filename, char separator)
{
    FILE *fid;
    int i,j;
    if(!(fid = fopen(filename, "wt")))
        return errno;
    for(i = 0; i < sarray.nstars; i++)
    {
        for(j = 0; j < sarray.nparam; j++)
            fprintf(fid, "%s%c", sarray.star[i][j].param, separator);
        fprintf(fid, "\n");
    }
    fclose(fid);
    return 0;
}
//--------------------------------------------------------------------------
int GetStarCount(void)
{
    return sarray.nstars;
}
//--------------------------------------------------------------------------
int GetParamCount(void)
{
    return sarray.nparam;
}

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:18 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вот последний файл (main.c):

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <string.h>
#include "stars.h"

const char *MainMenuHeader[7] = {"Show contents of the table...1\0",
                                 "Add a star...................2\0",
                                 "Correct data of a star.......3\0",
                                 "Order by mass................4\0",
                                 "Order by name................5\0",
                                 "Order by constellation.......6\0",
                                 "Quit.........................x\0"};
const char *SubMenuHeader[4] = { "The name ...........1\0",
                                 "The mass ...........2\0",
                                 "The class ..........3\0",
                                 "The constellation...4\0" };
const char *Prompts[4] = { "Name of star: \0",
                           "Mass of star: \0",
                           "Class: \0",
                           "Constellation: \0" };

char *Keys = "123456x\0";

#define PAR_NAME 0
#define PAR_MASS 1
#define PAR_CLASS 2
#define PAR_CONST 3

void ShowMenu(const char **headers, int N);
int MainMenu(void);//возвр. 0 при аварийном завершении.
void ShowFileContents(void);
int StarAddition(void);//возвр. 0 при аварийном завершении.
void MenuCorrect(int starnum);
void CorrectData(void);

//------------------------------------------------------------------------------
int main(int n, char **args)
{
    if(n < 2)
    {
        puts("Usage: stars <filename>");
        return -1;
    }
    LoadStarList(args[1], ';');
    if(MainMenu())
        SaveStarList(args[1], ';');
    return 0;
}
//------------------------------------------------------------------------------
void ShowMenu(const char **headers, int N)
{
    int i;
    for(i=0; i < N; i++)
        puts(headers[i]);        
}
//------------------------------------------------------------------------------
int MainMenu(void)
{    
    ShowMenu(MainMenuHeader, 7);
    while(1)
    {
        char c = getch();
        if(!strchr(Keys, c))
            continue;
        putch(c);
        putch('\n');putch('\r');
        switch(c)
        {
            case '1':
                ShowFileContents();
            break;
            case '2':
                if(!StarAddition())//Добавление звезды в базу данных.
                   return 0;//Аварийный выход.
            break;
            case '3':
                CorrectData();//Редактировать пр-ры звезды.
            break;
            case '4':
                SortStarList(PAR_MASS, 0, 1);//Сортировка по массе (как число) в порядке ее убывания.
            break;
            case '5':
                SortStarList(PAR_NAME, 1, 0);//Сортировка по имени (как строка)в алф. порядке.
            break;
            case '6':
                SortStarList(PAR_CONST, 1, 0);//Сортировка по созвездию (как строка) в алф. порядке.
            break;
            case 'x':
                return 1; //Выход.
        }
        ShowMenu(MainMenuHeader, 7);
    }
}
//------------------------------------------------------------------------------
#define SCREENLINES 24
void ShowFileContents(void)
{
   
    int i, N;
   
    N = GetStarCount();
    for(i=0; i < N; i++)
    {
        printf("%i) --- %s ---\n  %s  Msun Class: %s  Constellation: %s\n",
         i, GetStarParam(i, 0),  GetStarParam(i, 1), GetStarParam(i, 2), GetStarParam(i, 3));
        if( !((i+1) % (SCREENLINES/2)) )
        {
            printf("Press any key to continue.\0");
            getch();
            printf("\n");
        }        
    }
}
//------------------------------------------------------------------------------
int StarAddition(void)
{
    int N = GetStarCount(),
        m = GetParamCount(), j;
       
    char str[80];
    if (!AddStar())
    {
        puts("Can't add star - not enough memory.");
        return 0;
    }
    for(j = 0; j < m; j++)
    {
        puts(Prompts[j]);
        gets(str);
        SetStarParam(N, j, str);
    }
    return 1;
}
//------------------------------------------------------------------------------
void CorrectData(void)
{
    int N = GetStarCount(),
        m = GetParamCount(), starnum;
    char str[80];
    ShowFileContents();
    while(1)
    {
        printf("What's the star's number you want to edit? \0"); starnum = atoi(gets(str));
        if(starnum < N)
            break;
        printf(" The star's number must be from 0 to %i\n", N-1);
    }
    printf("%i) --- %s ---\n  %s  Msun Class: %s  Constellation: %s\n",
         starnum, GetStarParam(starnum, 0),  GetStarParam(starnum, 1), GetStarParam(starnum, 2), GetStarParam(starnum, 3));
    MenuCorrect(starnum);
}
//------------------------------------------------------------------------------
void MenuCorrect(int starnum)
{
    char c, str[80];
    unsigned parnum;
   
    puts("Want to correct:");
    ShowMenu(SubMenuHeader, 4);
    while(1)
    {
        c = getch();
        if((parnum = strchr(Keys, c)-Keys) < 4)
            break;
    }
    putch(c);
    putch('\n');putch('\r');
    puts(Prompts[parnum]);
    gets(str);
    SetStarParam(starnum, parnum, str);
}



С нетерпением жду, когда меня начнут пинать ногами! :) Кстати, в предыдущем файле есть ошибка: функция GetStarParam недоделана - не проверяется, выходят значения индексов за допустимый диапазон или нет. Только что заметил, но исправлять не стал - пусть уж будет, как есть.

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:26 
Заслуженный участник


28/10/05
1368
Уряяя!
Надеюсь, незванный гость заглянет в гости и все пояснит...:D
Крайне интересно.

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:31 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
to LynxGAV:
Те места, что Вам не понятны - это скорее всего там, где код не соответствует комментарию (т.е. я хотел это сделать, но второпях забыл.. :) )

Мож, я тоже в своем коде смогу что-нить объяснить... :)

 Профиль  
                  
 
 
Сообщение01.12.2005, 21:45 
Заслуженный участник


28/10/05
1368
Aлександр!
Я....редиска.
Всё равно, кто объясняет. Даже по праву положено тому, кто является автором.
Но для меня разбираться в чужих программах важко. При первой же возможности буду пытаться.

 Профиль  
                  
 
 
Сообщение01.12.2005, 22:10 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Sanyok писал(а):
С нетерпением жду, когда меня начнут пинать ногами! :)

Как говорил мой сенсей, "в ногах правды нет... Правду чуствуешь животом [по которому бьют ногами]". Так что пинать не буду, но растяжка не помешает.

За тридцать секунд - только одно наблюдение. В
char* menu[3] = {"option\0", "option2\0", "option3\0"};
два неудачных момента. Во-первых, лучше не указывать длину массива. Компилятор определит ее автоматически. То есть писать просто:
char* menu[] = {"option\0", "option2\0", "option3\0"};
Если же нужна длина массива, ее можно определить при помощи макро dim() (см предыдущиее сообщения - сводится к sizeof(menu)/sizeof(menu[0])). Причиной являетя то, что если длина массива не указана, легче убирать/добавлять строки.

Во-вторых, скрипач \0 не нужен. \0 автоматически включается в каждую литеральную строку. Посему, избавляемся от них:
char* menu[] = {"option", "option2", "option3"};

Добавлю еще, что важно различать два описания:
char* menu[] = {"option", "option2", "option3"};
и
char menu[][20] = {"option", "option2", "option3"};
Первое - это массив укзателей на строки. Второе - массив массивов (двумерный массив) литер. Во втором случае длина важна исключительно, ибо включать место на \0 должна. По языка стандарту, все, что не заполнено инициализацией, нулями заполняется, и посему коли строки длины 10, смело отводим по крайней мере 11.

 Профиль  
                  
 
 
Сообщение01.12.2005, 22:16 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Что касается количества строк в массиве - согласен, размер указывать пожалуй, не стоит. Что касается нуля в конце - пара символов пальцы не оторвет, и поэтому я их всегда приписываю (и на всяк. случай, и для себя).

 Профиль  
                  
 
 
Сообщение01.12.2005, 22:42 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Sanyok писал(а):
Что касается нуля в конце - пара символов пальцы не оторвет, и поэтому я их всегда приписываю (и на всяк. случай, и для себя).

Моветон, однако. И код пачкает (читателю еще догадаться надо, что этот лишний нуль нигде в коде не используется. А у него, читателя, и без подобных штучек голова пухнет), и мертвый код / данные порождает. Между прочим, я видел (буржуинский) стандарт, прямо запрещающий мертвый код в mission-critical applications.

Главный вопрос - а что, собственно, Вы хотите этим нулем сказать (читателю и компилятору)? Что эта строка кончается нулем? - так не на Пасквиле позорном пишем. Итак все знают. Или я что-то не ловлю?

 Профиль  
                  
 
 
Сообщение01.12.2005, 22:57 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Я не знаю! Не знал, точнее. А вот то, что ноль в конце может лишний код породить - это что-то новенькое... Но даже если и так, то, наверное, не больше одного байта.... Не бог весть что... Или здесь я не прав?

Может, окромя нулей в конце строки еще что-нибудь подметите? Мне было бы очень полезно, честно говорю. Первый раз свой код выношу на открытое обсуждение..

 Профиль  
                  
 
 
Сообщение02.12.2005, 05:30 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Sanyok писал(а):
А вот то, что ноль в конце может лишний код породить - это что-то новенькое... Но даже если и так, то, наверное, не больше одного байта.... Не бог весть что... Или здесь я не прав?

"У малых причин бывают большие последствия. Так, отгрызение заусенца причинило одному моему знакомому рак". Ответ состоит из двух частей. Первая, Вы правы, порождается лишний байт на строку. Нормальная строка "abc" представляется в памяти как
Код:
61 62 63 00
, "abc\0" же как
Код:
61 62 63 00 00
. И опять-таки, Вы правы, не Бог весть что. Но (вторая):
1) Вы не встречали записи группы строк char* options = "option1\0option2\0option3\0";? Я встречал. Такая группа передается как один параметр, а признаком ее конца служит не нуль, а два нуля (pardon my French). И, не в программе новичка, а в Windowz API (тут, правда, есть сомнения, действительно ли программисты MS не новички. Существуют достаточно сурьезные аргументы в пользу сией гипотезы). И как прикажете догадываться, не это ли Вы имели в виду?
2) Мои вопросы "что Вы пытаетесь этим сказать" были не риторическими, не ироническими и не саркастическими. Это было приглашение задуматься, осмыслить логику и цель своих действий. Ибо поняв собственную мотивацию можно либо согласиться с возражением (и тогда легко и логично поменять стиль), либо сказать себе - "да, я выслушал аргументы 'против', но мои аргументы 'за' перевешивают для меня вред, по крайней мере, в подобной ситуации". Такая интроспекция полезна для всех. Ответ "почему бы и нет" ничего не добавляет к дискурсии (негативный аргумент), ответ "потому что <...>" (позитивный аргумент) заставил бы задуматься меня - в чем я не прав, и взвесить для себя важность Вашей мотивации. То есть, послужил бы мне на пользу, а я - жадный!

Sanyok писал(а):
Может, окромя нулей в конце строки еще что-нибудь подметите?

Можно пару вопросов? Вы явно изменили структуру программы (изменили к лучшему, несомненно). Какие цели Вы ставили? Какие были у Вас приоритеты и мотивировка? Что Вы считаете, будет меняться в будущем, а что останется таким, как было?

Готовая программа - это ответ на вопрос "что". Ответ на вопрос "почему" всегда поучительнее.

P.S. Я тоже помещу версию программы. Лучше, наверное, чуть позже, чтобы не смешивать версии при обсуждении. Так, наверное, честнее - и у всех будет возможность потоптать меня...

 Профиль  
                  
 
 
Сообщение02.12.2005, 08:49 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
незванный гость писал(а):
:evil:
2) Мои вопросы "что Вы пытаетесь этим сказать" были не риторическими, не ироническими и не саркастическими. Это было приглашение задуматься, осмыслить логику и цель своих действий. Ибо поняв собственную мотивацию можно либо согласиться с возражением (и тогда легко и логично поменять стиль), либо сказать себе - "да, я выслушал аргументы 'против', но мои аргументы 'за' перевешивают для меня вред, по крайней мере, в подобной ситуации". Такая интроспекция полезна для всех. Ответ "почему бы и нет" ничего не добавляет к дискурсии (негативный аргумент), ответ "потому что <...>" (позитивный аргумент) заставил бы задуматься меня - в чем я не прав, и взвесить для себя важность Вашей мотивации. То есть, послужил бы мне на пользу, а я - жадный!


Я понял... Просто я со строками часто путаюсь... В-общем, ноль в конце я ставлю исключительно для того, что бы не забывать о том, что строки должны нулем заканчиваться. Это уже в привычку превратилось. Не знаю... Хотел бы ответить более точно (может, и есть другой ответ, но это зарыто у меня в подсознании). Почему-то мне их хочется ставить в конце строки перед кавычками (но не в каком-то другом месте).

незванный гость писал(а):
Sanyok писал(а):
Может, окромя нулей в конце строки еще что-нибудь подметите?

Можно пару вопросов? Вы явно изменили структуру программы (изменили к лучшему, несомненно). Какие цели Вы ставили? Какие были у Вас приоритеты и мотивировка? Что Вы считаете, будет меняться в будущем, а что останется таким, как было?

Готовая программа - это ответ на вопрос "что". Ответ на вопрос "почему" всегда поучительнее.

P.S. Я тоже помещу версию программы. Лучше, наверное, чуть позже, чтобы не смешивать версии при обсуждении. Так, наверное, честнее - и у всех будет возможность потоптать меня...


Я не менял структуру проги. Я ее написал такой уже через 5 дней после создания данной темы и не поместил сюда, поскольку: 1) получилось слишком длинно и 2) мне пришлось тогда надолго (на 10 дней) уехать. Сегодня, увы, опять уматываю (дней на 5-6) :( .

Какую цель я ставил?... Мне понравилось задание и я решил, что решив ее, у меня будет код, который я смогу в дальнейшем использовать для других целей. Я всегда стараюсь писать как бы это сказать... "в стиле API" . То есть, решая какую-то глобальную задачу, делим ее на несколько более мелких. Для каждой из этих сравнительно "мелких" пишем API, которое будет полностью изолировано от остальных и предоставлять все необходимые средства (процедуры, функции, структуры данных) для решения "своих", узких задач.

Итак, есть у нас база данных. Логично написать модуль, который будет предоставлять полный сервис по работе с этой базой данных. При этом то, как этот сервис работает, не должно волновать того, кто этот сервис использует. Насколько я понимаю, аналогичное решение используется во всех стандартных библиотеках: при работе с файловой системой - есть куча функций, которые работают с указателями на структуру FILE, либо с дескрипторами файлов, но внутренняя кухня этих функций скрыта от пользователя (то бишь программера), и слава богу. Аналогично - набор функций для работы с графической системой, RAS API и т.д, и т.п.

Что изменится в будущем? Ну, во-первых, можно получше защитить прогу. Так, если заданного файла не существует, его можно создавать. Опять же, можно подумать, как сохранять сортировку при добавлении записи в БД. Думаю, можно добавить процедуру удаления записи из БД. Еще можно подумать, как сделать так, что бы можно было к записям добавлять дополнительные поля (но это, конечно, уже сложно будет).. Это то, что я могу сейчас сказать "навскидку". Может, и еще что-нибудь.

 Профиль  
                  
 
 
Сообщение02.12.2005, 09:03 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Еще можно попытаться улучшить качество сервиса, то есть сделать работу с БД более удобной. Мне не очень нравится процедура AddStar поскольку в таком виде после добавления звезды всегда будет терятся сортировка. Не знаю... В-общем надо подумать, что можно изменить в лучшую сторону.

 Профиль  
                  
 
 
Сообщение02.12.2005, 09:38 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
незванный гость писал(а):
... Какие были у Вас приоритеты и мотивировка? ...


Насчет приоритетов и мотивировок...

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 105 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group