Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

чем заменить "switch"

33K
11 августа 2009 года
Posix86749
54 / / 13.07.2009
есть переменая типа String. В нее записывается месяц (например "Aug"). Надо в зависимости от того какой месяц, пеерменной i_month типа int присваивать номер месяца. Сначала думал сделать это при помощи switch
 
Код:
switch (month)
{
 case "Jan": i_month=1; break;
 case "Feb": i_month=2; break;
.
.
.
case "Dec":i_month=12; break;

}

но компилятор выдал ошибку "Switch selection expression must be of integral type". Почитал справку, и, оказвается что switch со стрингом не работет. И чем мне теперь его заменить? Простоым if что ли? или я чего-то не пойму
2.1K
11 августа 2009 года
wAngel
129 / / 23.11.2004
Хэш-таблицей можно заменить.
1.9K
11 августа 2009 года
Anton Chik
175 / / 26.09.2005
чем тебе не угодил AnsiString?)
в ListBox1 перечисляешь месяцы,
теперь получить номер строки, в которой написана строка month, можно таким образом:
 
Код:
i_month=ListBox1->Items->IndexOf(month);
2.1K
11 августа 2009 года
wAngel
129 / / 23.11.2004
Цитата: Anton Chik
чем тебе не угодил AnsiString?)
в ListBox1 перечисляешь месяцы,
теперь получить номер строки, в которой написана строка month, можно таким образом:
 
Код:
i_month=ListBox1->Items->IndexOf(month);


Вы предлагаете для такой просто операции создавать визуальный компонент? При чем тут AnsiString?

1
11 августа 2009 года
kot_
7.3K / / 20.01.2000
Цитата: wAngel
Вы предлагаете для такой просто операции создавать визуальный компонент? При чем тут AnsiString?


Он предлагает использовать для этой цели класс TStringList, в котором требуемый функционал уже реализован. Что в целом правильно. Просто ввиду слабого понимания иерархии наследования в ВСВ, он предложил визуальный компонент.
В данном случае вы можете наблюдать особь вида программист компонентный в естественной среде обитания. Продукты жизнедеятельности особей данного вида - это наличие визуальных компонентов на форме с установленным в false свойством видимость. Ареал обитания - часто встречается в визуальной среде разработке VBA,Delphi, Builder.

1.9K
11 августа 2009 года
Anton Chik
175 / / 26.09.2005
Цитата: kot_
В данном случае вы можете наблюдать особь вида программист компонентный в естественной среде обитания. Продукты жизнедеятельности особей данного вида - это наличие визуальных компонентов на форме с установленным в false свойством видимость. Ареал обитания - часто встречается в визуальной среде разработке VBA,Delphi, Builder.



Так и есть. В разумных пределах. Приведите мне критические отрицательные стороны использования невидимых визуальных компонентов. Оставаясь на позициях программирования в среде быстрой разработки приложений.

Конкретно по топику, зачем писать ручками объявление/создание/заполнение(особенно)/удаление экземпляра TStringList, если можно обойтись несколькими кликами?
Что я получу? Одобрение матерых програмеров?

Если Вас смущает простота задачи в том плане, что разговор идет о месяцах года, то я уверен, если немного подумать, то можно разрешить проблему в рамках класса TDate, думать просто некогда.
Но вопрос был поставлен как "Чем заменить switch?". Ну пишите хэш-таблицу, не помешает взбодрить мозги.

11
11 августа 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Anton Chik
Приведите мне критические отрицательные стороны использования невидимых визуальных компонентов. Оставаясь на позициях программирования в среде быстрой разработки приложений.


параллель: Индусский код

 
Код:
uint i;
...
if (i.ToString().Length == 1)
{
  ...
}
тоже все логично... но через ж...
246
11 августа 2009 года
GIZMO
1.8K / / 30.07.2004
Цитата: Anton Chik
Так и есть. В разумных пределах.


Такое использование TListBox, по-моему, за пределом разумного. Визуальный компонент предназначен для визуального представления данных, а использовать отдельное его св-во только для преобразования названия месяца ... ну хз в общем

1.9K
11 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Anton Chik
Так и есть. В разумных пределах. Приведите мне критические отрицательные стороны использования невидимых визуальных компонентов.


1. Излишний расход памяти, т.к. любой визуальный компонент имеет в себе информацию, которая в таком подходе не используется.
2. Некоторые визуальные компоненты (которые могут принимать фокус ввода) имеют handle окна. Т.е. вы практически создаете лишнее окно и делаете его невидимым.
3. В сложных программах всегда стараются разделить пользовательский интерфейс и бизнес-логику. Основная причина в том, что код оказывается переплетен во множестве обработчиков событий и незначительное изменение в интерфейсе приводит к лавинообразной правке множества фрагментов раскиданных по всей программе. Вы предлагаете увеличить зависимость основного кода от конкретной формы.


Цитата: Anton Chik
Оставаясь на позициях программирования в среде быстрой разработки приложений.


Извини, но то что Вы предлагаете, это не программирование, а быдло-кодерство. Без обид.

Цитата: Anton Chik

Конкретно по топику, зачем писать ручками объявление/создание/заполнение(особенно)/удаление экземпляра TStringList, если можно обойтись несколькими кликами?


См. выше п.3

33K
12 августа 2009 года
Posix86749
54 / / 13.07.2009
Я конечно извиняюсь, но может кто нить скинуть ссылочку про хэш массивы? А то я уже запарился капать на форуме и в гугле :(
33K
12 августа 2009 года
Posix86749
54 / / 13.07.2009
Все, нашел:)
теперь использую map. Получается что-товроде этого:
Код:
#include <map>
using namespace std;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 map<String,int> month;
 month["Jan"]=1;
 month["Feb"]=2;
 month["Mar"]=3;
 Edit1->Text=IntToStr(month[Edit2->Text]);

}
260
12 августа 2009 года
Ramon
1.1K / / 16.08.2003
Что же скрывает "под капотом" сия конструкция из стандартной библиотеки? И так ли нужна она вам?

PS: А как насчет учета локализации?
33K
12 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: Ramon
Что же скрывает "под капотом" сия конструкция из стандартной библиотеки? И так ли нужна она вам?

PS: А как насчет учета локализации?


Я не совсем вкурсе что скрывает "под капотом" сия конструкция :confused: но других варианотов я не знаю.
А по поводу локализации что не так? Что Вы имеете ввиду?

92
12 августа 2009 года
Тень Пса
2.2K / / 19.10.2006
Цитата:

Jan - Янв
Feb - Фев
...
Dec - Дек


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

если месяца русскими буквами будут? )) это имелось в виду. или у вас для русских пользователей всё по-буржуйски? :)

в общем, про язык имелось в виду :)

[COLOR=Gray]PS: не выспался я сегодня...[/COLOR]

33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: Тень Пса

если месяца русскими буквами будут? )) это имелось в виду. или у вас для русских пользователей всё по-буржуйски? :)

в общем, про язык имелось в виду :)


Дата всегда будет на "буржуйском", потому как входные данные - это лог телефонных звонков с Cisco Call Manager:)

260
13 августа 2009 года
Ramon
1.1K / / 16.08.2003
А еще, что-то мне подсказывает, что в сей лог Сиська не только дни недели ложит.

Так почему бы не парсить сей могучий лог с помощью стандартных потоков вводв/вывода С++ с фасетами аля time_get и прочим. Ушами то меньше крутить придетцо. Или я заблуждаюсь?
33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: Ramon
А еще, что-то мне подсказывает, что в сей лог Сиська не только дни недели ложит.

Так почему бы не парсить сей могучий лог с помощью стандартных потоков вводв/вывода С++ с фасетами аля time_get и прочим. Ушами то меньше крутить придетцо. Или я заблуждаюсь?


:eek:блин, из вышесказанного понял только слова "потоки ввода/вывода"и "уши":D. не знаю как все это делается. поэтому и приходится париться со всякой ерундой :(

9
13 августа 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: Posix86749
:eek:блин, из вышесказанного понял только слова "потоки ввода/вывода"и "уши":D. не знаю как все это делается. поэтому и приходится париться со всякой ерундой :(


Кусочек лога покажите. :D

33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Цитата: Lerkin
Кусочек лога покажите. :D


ну это жесть будет...

 
Код:
Aug  3 12:01:50 192.168.4.70 353: Aug  3 12:06:41: %VOIPAAA-5-VOIP_CALL_HISTORY: CallLegType 2, ConnectionId 2256FA507F0111DEA8558866525F2007, SetupTime 12:06:25.999 UTC Mon Aug 3 2009, PeerAddress 84212123456, PeerSubAddress , DisconnectCause 10  , DisconnectText normal call clearing (16), ConnectTime 12:06:28.309 UTC Mon Aug 3 2009, DisconnectTime 12:06:41.209 UTC Mon Aug 3 2009, CallOrigin 2, ChargedUnits 0, InfoType 2, TransmitPackets 681, TransmitBytes 107765, ReceivePackets 645, ReceiveBytes 103200
Aug  3 12:02:30 192.168.4.70 355: Aug  3 12:06:41: %VOIPAAA-5-VOIP_CALL_HISTORY: CallLegType 1, ConnectionId 2256FA507F0111DEA8558866525F2007, SetupTime 12:06:26.009 UTC Mon Aug 3 2009, PeerAddress 654321, PeerSubAddress , DisconnectCause 10  , DisconnectText normal call clearing (16), ConnectTime 12:06:28.309 UTC Mon Aug 3 2009, DisconnectTime 12:06:41.209 UTC Mon Aug 3 2009, CallOrigin 1, ChargedUnits 0, InfoType 2, TransmitPackets 644, TransmitBytes 108192, ReceivePackets 681, ReceiveBytes 107765

Вот это две строчки лога, в том виде , в котором они вываливаются с циски. Две эти строчки характеризуют один звонок. PeerAddress 84212123456 - это номер телефона который позвонил, а PeerAddress 654321 - это номер телефона, который принял звонок
33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
И еще момент. Помогите разобраться со временем. Просто мне надо брать из лога Connection Time и Discoonect Time и находить между ними разницу (т.е. длительность звонка). Не могу понять как это сделать малой кровью:(
260
13 августа 2009 года
Ramon
1.1K / / 16.08.2003
Код:
#include <locale>
#include <sstream>
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    typedef istreambuf_iterator< char, char_traits<char> > iterator;

    tm          time = {};
    istringstream       in(__TIME__ __DATE__);
    ios_base::iostate   state = in.rdstate();
    iterator        end;

    const time_get<char, iterator>& tg =
        use_facet< std::time_get<char, iterator> >( in.getloc() );

    tg.get_time(in, end, in, state, &time);
    tg.get_date(in, end, in, state, &time);

    return 0;
}


Код тупой, не красивый и без обработки ошибок, однако суть фасетов раскрывает.

PS: Резулт будет лежать в соотв. полях "time"
260
13 августа 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Posix86749
И еще момент. Помогите разобраться со временем. Просто мне надо брать из лога Connection Time и Discoonect Time и находить между ними разницу (т.е. длительность звонка). Не могу понять как это сделать малой кровью:(



Когда все распарсите в std::tm то позовете std::mktime и std::difftime из заголовка ctime и получите разницу в секундах.

33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
br /> Код тупой, не красивый и без обработки ошибок, однако суть фасетов раскрывает.


мдя... ничего не понял... что-то я видать за слишком "крутую" задачу взялся

260
13 августа 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Posix86749
мдя... ничего не понял... что-то я видать за слишком "крутую" задачу взялся



Зато это повод подучить как язык так и возможности, предоставляемые стандартной библиотекой. И то и другое полезно, дабы велосипеды не плодить, коих и без очередного предостаточно.

33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Просто мне даже не понятно как ЭТО использовать. Я уже не говорю о том, что бы разобраться в устройстве
33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Наверно бред скажу, но мне просто некогда это все догонять... времени мало... Кстати, а через TDateTime это нельзя реализовать?
Класс вроде тоже подходящий для моих целей, только не понятно как в него записать какие-то свои данные.Например
 
Код:
TDateTime k,l;
l=k.CurrentDateTime();

Такое сработает.
а как сделать что-то вроде:
 
Код:
TDateTime k,l;
k="13.05.2009 13:31:34";

совершенно непонятно. И вообще, после изучения справки в билдере мне кажеться это сделать вообще невозможно... а так хотелось бы
33K
13 августа 2009 года
Posix86749
54 / / 13.07.2009
Млин, нашел вот такой способ:
 
Код:
TDateTime k,l,m;
 k=StrToTime("12:13:54");
 l=StrToTime("10:00:23");
 m=k-l;

в результате переменная m получает значение "02:13:31", что собсно и надо было:D может и криво, но ведь работает:D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог