Вопрос № 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!
Если с++, примерно так.
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){};
Ответ отправил: AndyC (статус: 1-ый класс)
Ответ отправлен: 11.07.2006, 15:59 Оценка за ответ: 5 Комментарий оценки: спасибо. меня правда в бок занесло. мне нужно CreateThread и ему подобные функции и вроде уже нашел