На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Массив строк - трудный выбор
    массив строк:

    #define MAX_SIZE 20000

    char *str[MAX_SIZE]

    недостаток - заранее нужно указывать максимальный размер
      Дядя Банзай, Ваш способ работы со строками хороший, быстрый.. до тех пор, пока нам не придётся сильно манипулировать с ними :wall: :wall: .
        У меня вопрос к автору топика.
        Не кажется ли Вам, что смешивание стилей в учебном материале (как я понял цель топика - просвещение), это плохой пример для новичков? Почему бы не использовать std::cout, если уж начали переход от С к С++?
        Аналогично при сортировке. Для класса определены operator>, operator< и метод compare. Использование c_str() в данном случае не просто не имеет смысла, но и приводит, как понимаю, лишний раз к выделению памяти, т.к. стандартом не оговаривается, что данные в std::sting должны быть расположены линейно, как в std::vector.

        Цитата dangee, 31.03.04, 08:50, 328276
        А как std::string конвертировать в int, double, float и обратно?

        Можно использовать вот такие два шаблонных класса:
        ExpandedWrap disabled
          template <typename T>
          std::string toString(T val)
          {
              std::ostringstream oss;
              oss<< val;
              return oss.str();
          }
           
          template<typename T>
          T fromString(const std::string& s)
          {
            std::istringstream iss(s);
            T res;
            iss >> res;
            return res;
          }

        Пример использования:
        ExpandedWrap disabled
              
          int iVal;
          std::string strInt = toString(iVal);
          iVal = fromString<int>(strInt);
           
          float fVal;
          std::string strFloat = toString(fVal);
          fVal = fromString<float>(strFloat);
        Сообщение отредактировано: BioUnit -
          Внесу-ка я свою лепту :)

          ExpandedWrap disabled
            #include <stdlib.h>
            #include <string.h>
            #include <stdio.h>
             
            #define ST_SUCCESS 0
            #define ST_NO_MEM 0
            #define ST_INDEX_MAX 64000
            #define ST_INDEX_OVER 64001
             
            class stringlist;
             
            struct string_s {
                string_s* next;
                string_s* prev;
               char* data;
            };
             
            string_s* null_pointer = NULL;
             
            class stringlist {
            protected:
               string_s* first; //pointer to first entry
               string_s* end;  //pointer to last entry
            public:
               stringlist();
               ~stringlist();
               string_s* operator [](unsigned int index);
               unsigned int find(const char* s);
                  int add(string_s** pointer, const char* data);
                   int create(const char* data, string_s** pointer_recurce);
                    int append(char* data);
                string_s* delete_entry(string_s* pointer);
                int set(string_s* pointer, const char* data);
                char* get(string_s* pointer, char* s1);
                string_s* walk(unsigned int number);
            };
             
            int stringlist::add(string_s** pointer1, const char* data) {
                int result = ST_SUCCESS;
               string_s *pointer = *pointer1;
                string_s *newitem = (string_s*) malloc(sizeof (string_s));
               if(newitem!=NULL) {
                    newitem->data = (char*) malloc(strlen(data)+1);
                    if(newitem->data!=NULL) {
                    strcpy(newitem->data, data);
                    if(NULL != pointer) {
                        newitem->next = pointer->next;
                     pointer->next = newitem;
                    }
                    else {
                     pointer=newitem;
                     newitem->next=NULL;
                     first=newitem;
                    }
                    newitem->prev=pointer;
                }
                   else {
                    free(newitem);
                      result = ST_NO_MEM;
                    }
               }
               else {
                result = ST_NO_MEM;
               }
               *pointer1 = pointer;
               return result;
            }
             
            int stringlist::create(const char* data, string_s** pointer_recurse=&null_pointer) {
              int result = ST_SUCCESS;
              string_s* pointer = *pointer_recurse;
              string_s* pointer_first = first;
              if(NULL == first) {  //if first entry not created :)
                result = add(&pointer, data);
                if(result == ST_SUCCESS) {
                  pointer->next = NULL;
                  first = pointer;
                }
              }
              else {
                first=NULL;
                result = create(data, &pointer);
                if(result == ST_SUCCESS) {
                  pointer->next = pointer_first;
                }
              }
              pointer->prev=NULL;
              *pointer_recurse = pointer;
              return result;
            }
             
            int stringlist::append(char* data) {
                return add(&end, data);
            }
             
            string_s* stringlist::delete_entry(string_s* pointer) {
                string_s* pointer_next = pointer->next;
                string_s* pointer_prev = pointer->prev;
               if(pointer!=NULL) {
                if(pointer==end) {
                    end = pointer_prev;
                  }
                  if(pointer->data != NULL) {
                        free(pointer->data);
                  }
                  free(pointer);
               }
               if(pointer_prev!=NULL) pointer_prev->next = pointer_next;
                return pointer_prev;
            }
             
            char* stringlist::get(string_s* pointer, char* s1) {
                if(pointer!=NULL)
                    return strcpy(s1, pointer->data);
               else
                return NULL;
            }
             
            int stringlist::set(string_s* pointer, const char* data) {
                if(pointer!=NULL) {
                strcpy(pointer->data, data);
                return ST_SUCCESS;
               }
               else
                return 1;
            }
             
            string_s* stringlist::walk(unsigned int number) {
                unsigned int walker = number % 4;
               unsigned int walkersteps = ((unsigned int) number / 4 );
               string_s* pointer = first;
               for(unsigned int i=0; i<walkersteps ;i++) {
                    pointer = pointer->next->next->next->next;
               }
               switch(walker) {
                case 1: pointer=pointer->next; break;
                case 2: pointer=pointer->next->next; break;
                case 3: pointer=pointer->next->next->next; break;
               }
               return pointer;
            }
             
            unsigned int stringlist::find(const char* s) {
               string_s* pointer = first;
               unsigned int i;
               for(i=0; ;i++) {
                   if(*pointer->data == *s) {
                    if(0==strcmp(pointer->data, s)) {
                        return i;
                     }
                   }
                   pointer = pointer->next;
               }
               return ST_INDEX_OVER;
            }
             
            string_s* stringlist::operator[](unsigned int index) {
                return walk(index);
            }
             
            stringlist::stringlist() {
                first = NULL;
               end=NULL;
                create("\0");
               end=first;
            }
             
            stringlist::~stringlist() {
                while(delete_entry(end)!=NULL);
            }
             
             
            int main() {
                char s[32];
                stringlist list;
               list.create("test string");
               string_s* first_element = list[1];
               list.get(first_element, s);
               printf("%s\n",s);
               getc(stdin);
               return EXIT_SUCCESS;
            }
            Интересный... велосипед...
            А чем стандартный std::list не подошел?
            А почему malloc, а не new?
            А почему string_s - глобальная структура, её ещё где-то можно использовать?
            А почему класс stringlist распоряжается памятью для string_s?
            А что это за макросы ST_INDEX_OVER и т.п.? Без них нельзя?
            А как мне изменить строку в этом списке, например, прибавить к ней еще пару символов?
            А что за глобальная переменная null_pointer?
              Цитата BioUnit, 5.12.04, 20:56, 533584
              А что это за макросы ST_INDEX_OVER и т.п.? Без них нельзя?

              Коды ошибок

              Цитата BioUnit, 5.12.04, 20:56, 533584
              А как мне изменить строку в этом списке, например, прибавить к ней еще пару символов?

              stringlist::set
              Цитата BioUnit, 5.12.04, 20:56, 533584
              А что за глобальная переменная null_pointer?

              НЕ помню :)
                Мяут, объясни мне, плз, одну вещь: а нафига?
                Такой свой велосипед написать может практически каждый. При этом из минусов можно сразу отметить ошибки(без них редко обходятся даже такие простые классы), отсутствие документации.
                Часто страдает эффективность. Еще интересный вопрос - обработка ошибок. Это же тоже надо все описывать, когда что возвращается/какое исключение кидается.
                Как я понимаю, цель данной статьи заключается в том, чтобы помочь выбрать из уже существующего огромного количества библиотек нужную или их эффективную комбинацию.
                Влезая со своим очередным классом, ты вносишь еще больше путаницы, которой и так достаточно.
                  M
                  Прошу обратить внимание на Правила раздела (вверху страницы)


                  и впредь придерживаться их
                    byte, я тренировался односвязные списки писать :wall:
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0315 ]   [ 15 queries used ]   [ Generated: 19.04.24, 21:20 GMT ]