чем заменить "switch"
{
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 что ли? или я чего-то не пойму
в ListBox1 перечисляешь месяцы,
теперь получить номер строки, в которой написана строка month, можно таким образом:
в ListBox1 перечисляешь месяцы,
теперь получить номер строки, в которой написана строка month, можно таким образом:
Вы предлагаете для такой просто операции создавать визуальный компонент? При чем тут AnsiString?
Он предлагает использовать для этой цели класс TStringList, в котором требуемый функционал уже реализован. Что в целом правильно. Просто ввиду слабого понимания иерархии наследования в ВСВ, он предложил визуальный компонент.
В данном случае вы можете наблюдать особь вида программист компонентный в естественной среде обитания. Продукты жизнедеятельности особей данного вида - это наличие визуальных компонентов на форме с установленным в false свойством видимость. Ареал обитания - часто встречается в визуальной среде разработке VBA,Delphi, Builder.
Так и есть. В разумных пределах. Приведите мне критические отрицательные стороны использования невидимых визуальных компонентов. Оставаясь на позициях программирования в среде быстрой разработки приложений.
Конкретно по топику, зачем писать ручками объявление/создание/заполнение(особенно)/удаление экземпляра TStringList, если можно обойтись несколькими кликами?
Что я получу? Одобрение матерых програмеров?
Если Вас смущает простота задачи в том плане, что разговор идет о месяцах года, то я уверен, если немного подумать, то можно разрешить проблему в рамках класса TDate, думать просто некогда.
Но вопрос был поставлен как "Чем заменить switch?". Ну пишите хэш-таблицу, не помешает взбодрить мозги.
параллель: Индусский код
...
if (i.ToString().Length == 1)
{
...
}
Такое использование TListBox, по-моему, за пределом разумного. Визуальный компонент предназначен для визуального представления данных, а использовать отдельное его св-во только для преобразования названия месяца ... ну хз в общем
1. Излишний расход памяти, т.к. любой визуальный компонент имеет в себе информацию, которая в таком подходе не используется.
2. Некоторые визуальные компоненты (которые могут принимать фокус ввода) имеют handle окна. Т.е. вы практически создаете лишнее окно и делаете его невидимым.
3. В сложных программах всегда стараются разделить пользовательский интерфейс и бизнес-логику. Основная причина в том, что код оказывается переплетен во множестве обработчиков событий и незначительное изменение в интерфейсе приводит к лавинообразной правке множества фрагментов раскиданных по всей программе. Вы предлагаете увеличить зависимость основного кода от конкретной формы.
Извини, но то что Вы предлагаете, это не программирование, а быдло-кодерство. Без обид.
Конкретно по топику, зачем писать ручками объявление/создание/заполнение(особенно)/удаление экземпляра TStringList, если можно обойтись несколькими кликами?
См. выше п.3
теперь использую 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]);
}
PS: А как насчет учета локализации?
PS: А как насчет учета локализации?
Я не совсем вкурсе что скрывает "под капотом" сия конструкция :confused: но других варианотов я не знаю.
А по поводу локализации что не так? Что Вы имеете ввиду?
Jan - Янв
Feb - Фев
...
Dec - Дек
а учитываете ли вы, что дата вам где-то может быть передана нифига ни с инглицкими названиями месяцев (если конечно пользователь будет вводить дату)? и учитываете ли то, что неприятно в русскоязычной программе видеть инглицкие слова =) или то, что не нужна инглицкоязычная программа в русском офисе, где работают простые пользователи ) ну и тд и тп.
если месяца русскими буквами будут? )) это имелось в виду. или у вас для русских пользователей всё по-буржуйски? :)
в общем, про язык имелось в виду :)
[COLOR=Gray]PS: не выспался я сегодня...[/COLOR]
если месяца русскими буквами будут? )) это имелось в виду. или у вас для русских пользователей всё по-буржуйски? :)
в общем, про язык имелось в виду :)
Дата всегда будет на "буржуйском", потому как входные данные - это лог телефонных звонков с Cisco Call Manager:)
Так почему бы не парсить сей могучий лог с помощью стандартных потоков вводв/вывода С++ с фасетами аля time_get и прочим. Ушами то меньше крутить придетцо. Или я заблуждаюсь?
Так почему бы не парсить сей могучий лог с помощью стандартных потоков вводв/вывода С++ с фасетами аля time_get и прочим. Ушами то меньше крутить придетцо. Или я заблуждаюсь?
:eek:блин, из вышесказанного понял только слова "потоки ввода/вывода"и "уши":D. не знаю как все это делается. поэтому и приходится париться со всякой ерундой :(
Кусочек лога покажите. :D
ну это жесть будет...
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 - это номер телефона, который принял звонок
#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"
Когда все распарсите в std::tm то позовете std::mktime и std::difftime из заголовка ctime и получите разницу в секундах.
мдя... ничего не понял... что-то я видать за слишком "крутую" задачу взялся
Зато это повод подучить как язык так и возможности, предоставляемые стандартной библиотекой. И то и другое полезно, дабы велосипеды не плодить, коих и без очередного предостаточно.
Класс вроде тоже подходящий для моих целей, только не понятно как в него записать какие-то свои данные.Например
l=k.CurrentDateTime();
Такое сработает.
а как сделать что-то вроде:
k="13.05.2009 13:31:34";
совершенно непонятно. И вообще, после изучения справки в билдере мне кажеться это сделать вообще невозможно... а так хотелось бы
k=StrToTime("12:13:54");
l=StrToTime("10:00:23");
m=k-l;
в результате переменная m получает значение "02:13:31", что собсно и надо было:D может и криво, но ведь работает:D