2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
 
 
Сообщение26.11.2005, 03:43 
Аватара пользователя
:evil:
LynxGAV писал(а):
экзекьют

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

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

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

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

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

 
 
 
 
Сообщение01.12.2005, 21:06 
Аватара пользователя
Решил после нескольких дней моральных мучений выложить свой вариант данной проги.

У меня вышло 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 
Аватара пользователя
Я решил код каждого файла в разные посты засунуть, что бы не получилось одного слишком большого (поста)
Вот код второго файла (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 
Аватара пользователя
Вот последний файл (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 
Уряяя!
Надеюсь, незванный гость заглянет в гости и все пояснит...:D
Крайне интересно.

 
 
 
 
Сообщение01.12.2005, 21:31 
Аватара пользователя
to LynxGAV:
Те места, что Вам не понятны - это скорее всего там, где код не соответствует комментарию (т.е. я хотел это сделать, но второпях забыл.. :) )

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

 
 
 
 
Сообщение01.12.2005, 21:45 
Aлександр!
Я....редиска.
Всё равно, кто объясняет. Даже по праву положено тому, кто является автором.
Но для меня разбираться в чужих программах важко. При первой же возможности буду пытаться.

 
 
 
 
Сообщение01.12.2005, 22:10 
Аватара пользователя
: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 
Аватара пользователя
Что касается количества строк в массиве - согласен, размер указывать пожалуй, не стоит. Что касается нуля в конце - пара символов пальцы не оторвет, и поэтому я их всегда приписываю (и на всяк. случай, и для себя).

 
 
 
 
Сообщение01.12.2005, 22:42 
Аватара пользователя
:evil:
Sanyok писал(а):
Что касается нуля в конце - пара символов пальцы не оторвет, и поэтому я их всегда приписываю (и на всяк. случай, и для себя).

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

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

 
 
 
 
Сообщение01.12.2005, 22:57 
Аватара пользователя
Я не знаю! Не знал, точнее. А вот то, что ноль в конце может лишний код породить - это что-то новенькое... Но даже если и так, то, наверное, не больше одного байта.... Не бог весть что... Или здесь я не прав?

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

 
 
 
 
Сообщение02.12.2005, 05:30 
Аватара пользователя
: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 
Аватара пользователя
незванный гость писал(а):
:evil:
2) Мои вопросы "что Вы пытаетесь этим сказать" были не риторическими, не ироническими и не саркастическими. Это было приглашение задуматься, осмыслить логику и цель своих действий. Ибо поняв собственную мотивацию можно либо согласиться с возражением (и тогда легко и логично поменять стиль), либо сказать себе - "да, я выслушал аргументы 'против', но мои аргументы 'за' перевешивают для меня вред, по крайней мере, в подобной ситуации". Такая интроспекция полезна для всех. Ответ "почему бы и нет" ничего не добавляет к дискурсии (негативный аргумент), ответ "потому что <...>" (позитивный аргумент) заставил бы задуматься меня - в чем я не прав, и взвесить для себя важность Вашей мотивации. То есть, послужил бы мне на пользу, а я - жадный!


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

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

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

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

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


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

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

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

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

 
 
 
 
Сообщение02.12.2005, 09:03 
Аватара пользователя
Еще можно попытаться улучшить качество сервиса, то есть сделать работу с БД более удобной. Мне не очень нравится процедура AddStar поскольку в таком виде после добавления звезды всегда будет терятся сортировка. Не знаю... В-общем надо подумать, что можно изменить в лучшую сторону.

 
 
 
 
Сообщение02.12.2005, 09:38 
Аватара пользователя
незванный гость писал(а):
... Какие были у Вас приоритеты и мотивировка? ...


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

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

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

 
 
 [ Сообщений: 105 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group