Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 467
от 16.07.2006, 21:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 341, Экспертов: 45
В номере:Вопросов: 3, Ответов: 5


Вопрос № 48762: как создать, заполнить и работать с масивом структур? я незнаю но помоему он называеться списком? структура должна содержать например: struct ast { char *name; int *i; float t; }d; как внести в него информацию. где: name ...
Вопрос № 48764: Здравствуйте достопочтенные спецы. Как на чистом С++ работать с COM портом? Подскажите пожалуйста или дайте ссылку. Премного благодарен....
Вопрос № 48830: Вкратце хочу запускать вычисление отдельным процессом, даже когда-то писал такое. Но как назло это все осталось на старой работе. Судорожно вспоминаю функции типа ... CreateProcess, ResumeProcess, WaitforSingeObject. Но детали хоть убей не помню. Буд...

Вопрос № 48.762
как создать, заполнить и работать с масивом структур? я незнаю но помоему он называеться списком? структура должна содержать например:
struct ast {
char *name;
int *i;
float t;
}d;
как внести в него информацию. где:
name - имя структуры(неизвестное кол-во символов)
int *i - масив целых или др. чисел(неизвестное кол-во чисел)
t - простые пременые
пожалуста можна пример а то я уже неделю мучаюсь.(или сылку где можно найти пример и инфо.).воообще возможна или желательна такая работа или мне лучше использовать что-то другое???
хотелось чтобы небыло расхода большого памяти при создании массива структур.
Спасибо!
Отправлен: 10.07.2006, 22:09
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: AndyC
Здравствуйте, HITY!
Если с++, примерно так.

struct ast
{
std::string name;
std::vector<int> i;
float t;
}

std::vector<ast> array_of_ast;//Если известен размер (даже примерно), лучше указать
std::list<ast> list_of_ast;//Если нужен список.

ast temp_ast;

temp_ast.name="Name";
temp_ast.i.push_back(10);

array_of_ast.push_back(temp_ast);

std::cout<<array_of_ast[0].name;
......

Если ast будет большого размера, правильней храить в массиве указатели. Но с ними сложнее манипулировать.

Если С, примерно так:

struct ast
{
char *name;
int size_name;
int *i;
int size_i;
float t;
} ast_t;

ast_t array_of_ast[100]; //Или динамически выделять.

array_of_ast[0].size_name=123;
array_of_ast[0].name=malloc(array_os_ast[0].size_name);
strcpy
.... и т.д

Список сочинять ручками.
Расход памяти будет меньше (должен быть). НО! Аккуратно выделять/освобождать память и не выходить за пределы массивов :)
Ответ отправил: AndyC (статус: 1-ый класс)
Ответ отправлен: 11.07.2006, 08:38
Оценка за ответ: 4

Отвечает: gitter
Здравствуйте, HITY!
Прежде чем работать со структурой ast я бы посоветовал добавить в нее поле, которое бы служило уникальным ключем этой структуры в списке.

Чтобы легко работать со списком, его (список) лучше отождествить с цепью

Для того чтобы работать со структурой типа список, необходимо объявить такую структуру
//структура двунаправленного списка
struct List
{
List* prev_element; //указатель на предыдущий элемент списка
ast element; //элемент списка
List* next_element; //указатель на следующий элемент списка
};

//объявляем список
List* list=NULL;

Эта структура представляет себя - цепочку, где каждый элемент в цепочке знает о своём соседнем элементе (звене)

Для того, чтобы к цепи (к списку) присоединить звено (элемент списка),
необходимо написать функции, которые бы умели добавлять звено в начало или в конец существующей цепи (или, если цепь пустая, то просто объявить это звено цепью)
чтобы удалить звено из цепи, необходимо сначала определить какое звено необходимо удалить (т.е. определить ключ элемента списка, которого необходимо удалить), необходимо написать функцию удаления элемента по ключу.
Также, можно написать функции: редактирования элемента списка по ключу; сортировки элементов по ключу и т.д.

Чтобы не быть голословным, тестовый пример работы с таким списком можете скачать здесь http://gitter.narod.ru/RusFAQ/48762.rar

Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 11.07.2006, 14:59

Отвечает: Vest
Здравствуйте, HITY!
Я почитал готовые ответы на твой вопрос, и решил добавить немного другой:
Ты спрашиваешь про массив или про список? Между ними есть некоторая разница, о ней везде написано, но например одна существенная - это то, что к элементу массива можно напрямую обращаться, зная его индекс а к списку нельзя (пока все предыдущие элементы не переберёшь).
А насчёт,что делать со структурой? Можешь создать из неё класс вида:
class AST
{
public:
AST();
~AST();

private:
char* name;
int* i;
....
}

В конструкторе по умолчанию (который у меня записан) ты запишешь инициализацию весх своих данных (без этого не обойтись, т.к. при создании массива из элементов класса - этот конструктор будет вызываться).
Кстати, желательно на всякий случай иметь ещё поле хрянящее в себе длину строки. Плюс ещё добавь несколько функций, для заполнения объекта класса, чтобы ты мог использовать например так:
AST obj;
obj.SetName("test");
obj.SetI(10);

тоже может быть и для массива:
AST obj[10];
obj[2].SetName.....
В таком же духе
только необходимо определить деструктор, чтобы память грамотно и чисто очищалась. Информацию по классам можешь прочесть везде - это удобная вещь. Насчёт производительности, главное чтобы не было "тяжёлых" объектов в статической памяти (массивов с большим числом элементов), лучше их создавать в динамической, а ещё лучше постараться пересмотреть алгоритм (например можно обрабатывать не весь массив а по частям).
Учти, что классы доступны в C++ а не в C, если ты используешь С, то необходимо будет создать вспомогательные функции для работами с элементами массива, вида:
ASTSetName(struct* ast, const char* );
---------
Халявы не бывает
Ответ отправил: Vest (статус: 3-ий класс)
Ответ отправлен: 13.07.2006, 01:22


Вопрос № 48.764
Здравствуйте достопочтенные спецы.
Как на чистом С++ работать с COM портом?
Подскажите пожалуйста или дайте ссылку.
Премного благодарен.
Отправлен: 10.07.2006, 22:35
Вопрос задала: Builder (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Решетник Д
Здравствуйте, Builder!
используя Вин32 АПИ:
В ОС Виндовс работа с устройствами стандартизирована.
Для этого используется механизм работы с файлами - смотреть CreateFile.
Открывать нужно COMx, x - номер порта.
Насколько я знаю, в Паскале механизм был такой же самый.
Скорее всего в С++ тоже работают через файлы.
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 10-ый класс)
Ответ отправлен: 10.07.2006, 23:07
Оценка за ответ: 4
Комментарий оценки:
Я хотел бы узнать, как это сделать не используя Вин32 API, а просто на Си++. Но все равно спасибо.


Вопрос № 48.830
Вкратце хочу запускать вычисление отдельным процессом, даже когда-то писал такое. Но как назло это все осталось на старой работе. Судорожно вспоминаю функции типа ... CreateProcess, ResumeProcess, WaitforSingeObject. Но детали хоть убей не помню. Буду рад любому примеру.
Заранее так сказать благодарен. :-)
Отправлен: 11.07.2006, 15:32
Вопрос задал: Santana (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: AndyC
Здравствуйте, Santana!
Если С++ не изобретайте велосипед. boost::thread и boost::thread_group

class sample_loop
{
public://private и get функция с синхронизацией:)
unsigned long int m_count;
public:
sample_loop(unsigned long int _count):m_count(_count){};

void operator () (void)
{
for(;m_count;--m_count);
return;
}
};

int main()
{
sample_loop loop(12345);

std::cout<<loop.m_count<<std::endl;

boost::thread thrd(boost::ref(loop));//boost::ref - передает ссылку вмето значения.
//Весьма полезная штучка

thrd.join();//Ждём пока завершится.

std::cout<<loop.m_count<<std::endl;
}
Ответ отправил: AndyC (статус: 1-ый класс)
Ответ отправлен: 11.07.2006, 15:59
Оценка за ответ: 5
Комментарий оценки:
спасибо. меня правда в бок занесло. мне нужно CreateThread и ему подобные функции и вроде уже нашел


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное