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

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


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

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

Выпуск № 620
от 24.12.2006, 11:35

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


Вопрос № 67573: Есть проект на С++ .NET(2003) Есть типизированный файл(состоящий из однотипных записей, описываемых структурой) Каким образом организовать считывание-запись такой структуры в файл. Пробовал реализовать через FileStream+BinaryReader/Writer...
Вопрос № 67576: Добрый день, сам я новичек в С++, и сразу возникли вопросы: int i [180] [180] [7]: - проходит int i [180] [180] [8]: - Stack Overflow два раза по int i [180] [180] [5]: - Stack Overflow Есть ли возможность использовать всю или х...
Вопрос № 67616: Здравствуйте, уважаемые эксперты! Возможно, ли передать класс из dll библиотеки в программу и создать объект на основе этого класса, пишу на С++...
Вопрос № 67639: Hi All~ Помогите как можно снять дамп процесса в памяти, при чём не полностью дамп, а только по определённому адресу? т.е. при запуске программа должна искать нужный процесс, и всю инфу находящуюся по конкретному адресу (005f7160), записывала...
Вопрос № 67652: Здравствуйет! Помогите довести код в приложении до рабочего состояния, там класс "накладная" товара и поля цена кол-во надо чтобы заработал таки ввод накладной с клавиатуры и вывод....

Вопрос № 67.573
Есть проект на С++ .NET(2003)
Есть типизированный файл(состоящий из однотипных записей, описываемых структурой)
Каким образом организовать считывание-запись такой структуры в файл.
Пробовал реализовать через FileStream+BinaryReader/Writer, но вручную раскладывать прочитанные байты по записи не удобно, возможно есть другое решение.

Заранее спасибо!

Приложение:

Отправлен: 18.12.2006, 20:09
Вопрос задал: Стас М. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Torsten
Здравствуйте, Стас М.!
Нужно преобразовать структуру в char * и затем писать. Я правда не знаю что ты используешь, я .NET ненавижу и использую только стандартный С++ поэтому и пример приведу на нем, но принцип везде одинаковый.

Приложение:

---------
#define MAGIC_NUMBER 0xdeface

Ответ отправил: Torsten (статус: 3-ий класс)
Ответ отправлен: 18.12.2006, 23:14
Оценка за ответ: 5


Вопрос № 67.576
Добрый день, сам я новичек в С++, и сразу возникли вопросы:
int i [180] [180] [7]: - проходит
int i [180] [180] [8]: - Stack Overflow

два раза по int i [180] [180] [5]: - Stack Overflow
Есть ли возможность использовать всю или хотя-бы половину моей памяти в начальных декларациях?

и второе можно ли в функции rand() получить диапазон от 0 до 256?
С глубоким уважением Александр Трет.
Отправлен: 18.12.2006, 20:15
Вопрос задал: Александр Трет (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Bob Johnson
Здравствуйте, Александр Трет!
во-первых, не стоит использовать стек для выделения памяти таких объемов. всегда есть GlobalAlloc, VirtualAlloc или то же new.
ну если уж надо, то вопрос такой - чем ты компилируешь программу? если это VC, то в свойствах проекта есть параметр, задающий размер стека (Linker - System - "Stack reserve size"). Впиши туда сколько надо и вперед. Если другой компилятор, скорее всего у него есть аналогичный параметр.
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 18.12.2006, 20:50
Оценка за ответ: 5
Комментарий оценки:
Огромное_спасибо!!!

Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, Александр Трет!

Когда вы пишете

int i [180] [180] [7]

, то память под переменную выделяется в стеке. Объём стека ограничен, так как он, в общем-то, не предназначен дял хранения большого объёма данных.
Изменить объём стека можно где-то в настройках компилятора.

В любом случае, это не выход. Выход - выделять память под даннsе из кучи, а не из стека (т.е. при помощи оператора new). Но придётся следить за тем, чтобы не забыть освободить выделенную память.

А ЕЩЁ ЛУЧШЕ, раз уж вы пишете на С++, а не на С, использовать стандартную библиотеку шаблонов stl. Это защитит от утечек памяти.
Например, так:

#include <vector>

using namespace std;
....

vector<vector<vector<int> > > i; //тут надо поаккуратнее с пробелами! их удалять нельзя.
i.resize(180);
for (int j=0;j<i.size();++j){
i[j].resize(180);
for (int k=0;k<i[j].size();++k){
i[j][k].resize(7);
}
}
....

не лучший код, но идея понятна, надеюсь. Забыл я, честно говоря, можно ли у vector задачать начальный объём... Давно на с++ не пишу, если честно ^_^
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 2-ой класс)
Ответ отправлен: 19.12.2006, 01:37
Оценка за ответ: 5
Комментарий оценки:
Премного благодарен! Спасибо!

Отвечает: ADSota
Здравствуйте, Александр Трет!

1. Если компилятор для DOS, то нужно сделать 2 вещи:
а) Настроить компилятор - сделать модель памяти huge (для Borland C это будет меню "Options"-"Compiler"-"Code generation"-"Model"-"Huge"). Это даст возможность использования больших массивов (без этого массивы будут иметь максимум размера 1Мб).
б) Обозначить свой массивы как большие и статические:
static int huge i[180][180][20];
Используя обе эти вещи вы спокойно можете работать с этим массивом. (Только если используете ссылки на этот массив - лучше используйте дальние - это на будущее).
---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Профессионал)
Россия, Зеленоград
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 19.12.2006, 08:29
Оценка за ответ: 5
Комментарий оценки:
Премного благодарен! Спасибо!

Отвечает: Sergijj
Здравствуйте, Александр Трет!

В ответах экспертов был незаслуженно забыт rand()...:)
Восполняю пробел:

#include <stdlib.h>

unsigned int randomDigit;

void main(void) {
randomDigit = rand()% 256;// % - это взятие остатка от деления.
};


---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 7-ой класс)
Ответ отправлен: 20.12.2006, 11:05
Оценка за ответ: 5
Комментарий оценки:
Спасибо!


Вопрос № 67.616
Здравствуйте, уважаемые эксперты!
Возможно, ли передать класс из dll библиотеки в программу и создать объект на основе этого класса, пишу на С++
Отправлен: 19.12.2006, 01:39
Вопрос задал: FreeCube (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, FreeCube!
На сайте www.rsdn.ru была статья "Использование DLL в программе на Visual C++". Идем на сайт, а там Статьи-Базовые сервисы-DLL . Статья - компиляция того, что в MSDN есть.

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
ICQ: 28260749
----
Ответ отправлен: 19.12.2006, 01:57

Отвечает: Sergey A. Wedensky
Здравствуйте, FreeCube!

Конечно, можно. ОБъявляете класс как __declspec(dllexport).
Для удобства обычно делают примерно так:

// exportedclass.h

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

class MYDLL_API CExportedClass {
public:
CExportedClass(void);
};

Тогда можете использовать этот же header в приложении, использующем DLL. При компиляции библиотеки дефайните MYDLL_EXPORTS, а приложения - нет.
Подключаете при помощи библиотеки импорта (.lib).
Ответ отправил: Sergey A. Wedensky (статус: 10-ый класс)
Ответ отправлен: 19.12.2006, 11:19


Вопрос № 67.639
Hi All~
Помогите как можно снять дамп процесса в памяти, при чём не полностью дамп, а только по определённому адресу?
т.е. при запуске программа должна искать нужный процесс, и всю инфу находящуюся по конкретному адресу (005f7160), записывала бы в файл.

А можно ли дампануть удалённый процесс(на другом компьютере)?(если можно аргументируйте).
Заранеее спасибо.

Приложение:

Отправлен: 19.12.2006, 09:29
Вопрос задал: \LeKs// (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Alex Stoyn / LeKs!
локальный процесс можно - OpenProcess, ReadProcessMemory.
а про удаленный ничего сказать не могу. но если есть пароль с правами администратора на удаленный компьютер, можно на нем запустить программу, которая сделает все локально
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 20.12.2006, 23:02


Вопрос № 67.652
Здравствуйет!
Помогите довести код в приложении до рабочего состояния, там класс "накладная" товара и поля цена кол-во надо чтобы заработал таки ввод накладной с клавиатуры и вывод.

Приложение:

Отправлен: 19.12.2006, 10:12
Вопрос задал: W4rmonger (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, W4rmonger!
Чтобы заработали <i>функции</i> ввода и вывода по стандарту с/с++ после них нужно ставить список аргументов <b>даже</b> если он пустой, то есть окрывающую и закрывающую скобку.
Вы видимо паскалист.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 3-ий класс)
Ответ отправлен: 19.12.2006, 10:40

Отвечает: Терсков Сергей
Здравствуйте, W4rmonger!
Приведенный тобой код нерабочий в принципе. Тут много ошибок, например:
- объявление функции внутри другой (На C++ это недопустимо)
- не закрыт класс
- вызов функции с пустым списком параметров без скобок () и т.д.

Так что проще было бы переделать все заново. Вот возьми заготовку на C++. В ней реализованы два класса - товар и накладная на товары. Для вывода и ввода используются перегруженные операторы >> и <<. Так что ввод-вывод можно подключать любой (хоть консольный, хоть файловый).

Приложение:

Ответ отправил: Терсков Сергей (статус: 4-ый класс)
Ответ отправлен: 20.12.2006, 04:04


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.38 от 20.12.2006
Яндекс Rambler's Top100

В избранное