Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: cp58
Дата сообщения: 23.03.2012 21:11
V0lt
Если пишите только под Windows, то второй(так как все WinApi их используют), но с переносимостью могут быть проблемы.

Первый вариант(stdint.h) это заголовочный файл от стандартной библиотеки C.
Автор: V0lt
Дата сообщения: 23.03.2012 21:22
akaGM
Мне не память адресовать, мне нужно данные парсить.
Автор: akaGM
Дата сообщения: 23.03.2012 21:52
V0lt
ну а я только об эффективности...
Автор: Eminence
Дата сообщения: 24.03.2012 03:08

Цитата:
Какие типы предпочтительнее использовать?
int8_t, int16_t, int32_t, int64_t и uint8_t, uint16_t, uint32_t, uint64_t (stdint.h)
или
INT8, INT16, INT32, INT64, UINT8, UINT16, UINT32, UINT64 (intsafe.h, BaseTsd.h)?

Volt, если приложение только под винду, и стоит задача парсить данные, то лучше использовать второй вариант
Автор: V0lt
Дата сообщения: 24.03.2012 06:17
Eminence
Цитата:
Volt, если приложение только под винду, и стоит задача парсить данные, то лучше использовать второй вариант

Блин, Я уже по первому варианту сделал.
Автор: Eminence
Дата сообщения: 25.03.2012 14:01

Цитата:
Блин, Я уже по первому варианту сделал.

Да не страшно, по первому варианту тоже нормально будет
Автор: gygant
Дата сообщения: 26.03.2012 12:45
Доброго дня всем

Вот собственно проблемный момент. Си++Билдер 6.

Кусочек кода из цикла:


Код:
...
MatchByDate = True;
if (IsComment == False)
if (MatchByDate == True)
{
...
Автор: akaGM
Дата сообщения: 26.03.2012 12:58
убери в опциях все "optimization", есть там такое...
Автор: gygant
Дата сообщения: 26.03.2012 13:34
akaGM
Project -> Options -> Compiler -> Code optimization //стоит None
Автор: cp58
Дата сообщения: 26.03.2012 14:16
gygant
volatile MatchByDate = True;
Автор: kotlomoy
Дата сообщения: 26.03.2012 14:22
gygant
Пересобирать весь проект, перезапускать Builder не пробовал?
Автор: gygant
Дата сообщения: 26.03.2012 14:57
kotlomoy
Перезапуск билдера\компьютера результата не дал. А вот Build all помогло

cp58
akaGM
спасибо за участие, кое-что новое для себя узнал

Добавлено:
Здравствуйте еще раз.

В программе идет цикл по строкам файла и на каждую строку вызывается эта процедура. Но вот, в чем загвоздка - если в этой процедуре переменным user, site и bytes_received присваивается значение выдернутой SubStr, то программа отрабатывает нормально, а при application->terminate() выдает ошибку abnormal program termination. Если же мы засовываем в эти переменные заранее известные значения, то программа закрывается нормально. В чем может быть причина?


Код:
//пример строки:
//--TCP----username-client---sitename-----80--------2138------32313

void NewProcedure(AnsiString TMLine, AnsiString &user, AnsiString &site, AnsiString &bytes_received)
{
if (TMLine.SubString(0,2)=="--")
{
int parts = 0; //куски информации в строке (7 штук)
int k,j;
bool part;
AnsiString str_part;
for(k=0;k<strlen(TMLine.c_str());k++)
{
if(TMLine.c_str()[k]!='-')
{
if (part==false)
{
part=true;
j = k;
while (TMLine.c_str()[j]!='-'&&j<strlen(TMLine.c_str()))
{
j++;
};
str_part = TMLine.SubString(k,j-k+1);
if (parts==1) user = str_part;
if (parts==3) site = str_part;
if (parts==6) bytes_received = str_part;
/*
if (parts==1) user = "kgh";
if (parts==3) site = "kljlkj";
if (parts==6) bytes_received = "12000";
*/
parts++;
};
}
else //если == "-"
{
part = false;
};
};
}; //if (TMLine.SubString(0,2)=="--")
}

Автор: cp58
Дата сообщения: 28.03.2012 10:08
gygant
Дело в памяти.


Цитата:
if (parts==1) user = "kgh";

Если здесь идет создание нового объекта AnsiString из константной строки(с полным копированием), то

Цитата:
if (parts==1) user = str_part;

здесь идет вызов конструктора копирования и, возможно(давно не имел дел с AnsIString от Borland), неправильно копирует адреса(указывает на один кусок, при освобождении подается уже освобожденная память).
Автор: Red Planet
Дата сообщения: 29.03.2012 20:34
Здравствуйте! Не понимаю, почему итератор ссылается на удаленный из списка элемент?


Код: #include <vcl>
#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include <string>

using namespace std;



// -----------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[]) {
    list<int> mylist;
    list<int>::iterator it1;

    for (int i = 1; i < 10; i++)
        mylist.push_back(i * 10);

    it1 = mylist.begin();
    it1++;

    while (*it1 < 70) {
        int it1_value = *it1;
        cout << "Before: " << it1_value << endl;

        mylist.remove(*it1);

        it1_value = *it1;
        cout << "After: " << it1_value << endl;
        it1++;
    }

    it1 = mylist.begin();
    cout << endl;
    for (; it1 != mylist.end(); it1++)
        cout << *it1 << " " ;
    cout << endl;
    system("pause");
    return 0;
}
Автор: cp58
Дата сообщения: 29.03.2012 21:05
Red Planet

Код: while (*it1 < 70) {
int it1_value = *it1;
mylist.remove(*it1++);
}
Автор: kotlomoy
Дата сообщения: 29.03.2012 21:40
Red Planet
list - это связный список - почитай, что это такое, и все вопросы отпадут
Автор: Red Planet
Дата сообщения: 31.03.2012 20:22
kotlomoy, я представляю, что такое двусвязный список. Вопрос отпал, так как на другом форуме сказали, что код


Код: mylist.remove(*it1);
Автор: cp58
Дата сообщения: 31.03.2012 20:52
Red Planet

Цитата:
небезопасный и нелогичный. Если требуется remove, то, думаю, нужно пользоваться

Конечно так делать нельзя, поэтому я привел вам код выше как делать можно и операция

Цитата:
int some_value = 100;
mylist.remove(some_value);

Заменяется на одну

Цитата:
mylist.remove(*it1++);



Цитата:
Еще вопрос. Если мне нужно подгрузить большой (ну скажем, предложений 10-15) текст, то как лучше поступить? Можно, кончено, считать при помощи ifstream из txt, однако не думаю, что в серьезных программах так делается. Если бы так делалось, то пользователь смог бы перед запуском заменить исходный текст на что-нибудь свое и глумиться над программой как угодно.

Всмысле подменить? Пользователь с правами на запись в любом случае сможет подменить локально хранимый файл, как не держи данные, можно конечно зашифровать, а толку?

Для больших и сложных типов данных используют встраиваемый движок БД(berkleydb, firebird...)
Автор: Red Planet
Дата сообщения: 31.03.2012 21:15

Цитата:
Для больших и сложных типов данных используют встраиваемый движок БД(berkleydb, firebird...)


Нет, не для моего случая. Там просто текст из 10-15 предложений.


Цитата:
Пользователь с правами на запись в любом случае сможет подменить локально хранимый файл, как не держи данные, можно конечно зашифровать, а толку?


Значит, ничего плохого в том, чтобы читать из txt.

Я имел в виду "зашить" текст в программу.


Автор: akaGM
Дата сообщения: 31.03.2012 21:29
Red Planet

Цитата:
Я имел в виду "зашить" текст в программу.
зашей как статический массив, можно с минимальным шифрованием, если не сильно критично...
Автор: cp58
Дата сообщения: 31.03.2012 23:10
Red Planet
Во всех решениях есть свои тонкости; например, если зашить в код программы, то чтобы выпустить под новую локализацию, скажем на язык суоми, то придется в код программы добавлять какой-то #define, затем к каждой строке прописывать локализованную версию и перекомпилировать программу, с единым файлом локализаций достаточно заменить строки в файле.

Чтобы правильно принять решение надо знать с чем имеешь дело.
Автор: akaGM
Дата сообщения: 31.03.2012 23:42
cp58
обычно не перекомпилируют, а пересобирают из ресурсов, а ещё грамотнее через плагины подключают...
Автор: cp58
Дата сообщения: 31.03.2012 23:53
akaGM
И? Плагины пересобирать не надо? Я говорю о простоте замены, вплоть до ручного - пользователем.
Автор: akaGM
Дата сообщения: 01.04.2012 00:16

Цитата:
И? Плагины пересобирать не надо?
строго говоря -- надо, а обычно сразу все языковые длл'и (в случае локализации, например) в одну директорию изначально заливают...
Автор: Red Planet
Дата сообщения: 01.04.2012 14:26
akaGM, cp58, спасибо.


Скажите, если в потоке


Код: MyThread : public TThread
Автор: Gant26
Дата сообщения: 02.04.2012 19:26
Здраствуйте ,форумчане !
Решил изучать С++ и не знаю с какой литературы начать не подскажите ?
Автор: cp58
Дата сообщения: 03.04.2012 10:56
Red Planet

Цитата:
поток сам по себе выгрузится из памяти, уничтожится, одним словом

Да, поток выполняет callback функцию и завершает работу, ОС освобождает ресурсы.

Цитата:
Я правильно поток завершаю?

Главное не забывать про динамическую память, выделенную в потоке.

Добавлено:
Gant26
А на данный момент что-нибудь знаете?
Автор: akaGM
Дата сообщения: 03.04.2012 11:53
Gant26

смотри в путеводитель по форуму
здесь такие вопросы задавались/обсуждались 1001 раз...
Автор: Gant26
Дата сообщения: 04.04.2012 10:17
cp58, да но нечтожно мало .
akaGM, спасибо я посмотрю .
Автор: Irta3
Дата сообщения: 04.04.2012 15:09
как слинковать программу на С++ с фортранной
Пытаюсь подружить программу на С++ с субрутиной на фортране. Текст программ взят из Немнюгина
/*main.cpp*/
#include <iostream.h>
extern "C"
{
void __stdcall FR1(int *, int *); i
nt __stdcall FF1(int *);
}
int main ()
{
int n = 10,nSq=1, nCube=2;
FR1(&n, &nSq);
cout<< "The square is:"<<nSq<<endl;
nCube=FF1(&n);
cout<< "The Cube is:"<< nCube <<endl;
return 0;
}
/*fortran.f*/
SUBROUTINE FR1(NM)
M=N*N
RETURN
END

INTEGER FUNCTION FF1(N)
FF1=N*N*N
RETURN
END
А вот как их откомпелировать вместе не знаю. Раньше никогда подобным не занималась и с линуксом начала общаться совсем недавно. Так что прошу помощи.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.