ну я впринципе понял что адреса, только вот почему то не мог нормально переделать))спасибо большое..
» Вопросы по программированию на C/С++
пожалуйста на толкните на нужную мысль
дали задание на писать программу которая будет создавать массив размером 16,32,64,128 килобайта, который будет содержать адрес размещения следующей ячейки в памяти
если варианты найти адрес размещения ячейки в памяти?? поиски в мсдне не дали толкового результата, а гугл совсем иное выдает
дали задание на писать программу которая будет создавать массив размером 16,32,64,128 килобайта, который будет содержать адрес размещения следующей ячейки в памяти
если варианты найти адрес размещения ячейки в памяти?? поиски в мсдне не дали толкового результата, а гугл совсем иное выдает
Оператор взятия адреса &.
int a[5];
void* p=&a[4];
p содержит адрес 4-й ячейки
void* u[5];
u[4]=&u[5];
ячейка 4 будет содержать адрес ячейки 5
int a[5];
void* p=&a[4];
p содержит адрес 4-й ячейки
void* u[5];
u[4]=&u[5];
ячейка 4 будет содержать адрес ячейки 5
akaGM
map<double,int> valueMap;
double Values[100];
valueMap[Values[i]] = i
Выглядит как запись в массив, но это просто перегруженный оператор, где Values[i] - это ключ, i - его значение. В теории часто такую структуру называют ассоциативный массив, но это не совсем корректно и вызывает путаницу. В действительности в дереве нет линейной области памяти, как в массиве, там каждый элемент представляется специальной структурой с ключом, значением ключа, двумя указателями на левую/правую дочернюю вершину дерева.
В зависимости от реализации алгоритма в структуре, описывающей вершину, могут добавляться другие данные. В частности, в STL map реализована как красно-черное дерево (там в вершине дополнительно хранится "цвет" листа).
Код valueMap[Values[i]] = i приводит к созданию новой вершины, корректировке указателей и вращению элементов дерева для сохранения сбалансированности
map<double,int> valueMap;
double Values[100];
valueMap[Values[i]] = i
Выглядит как запись в массив, но это просто перегруженный оператор, где Values[i] - это ключ, i - его значение. В теории часто такую структуру называют ассоциативный массив, но это не совсем корректно и вызывает путаницу. В действительности в дереве нет линейной области памяти, как в массиве, там каждый элемент представляется специальной структурой с ключом, значением ключа, двумя указателями на левую/правую дочернюю вершину дерева.
В зависимости от реализации алгоритма в структуре, описывающей вершину, могут добавляться другие данные. В частности, в STL map реализована как красно-черное дерево (там в вершине дополнительно хранится "цвет" листа).
Код valueMap[Values[i]] = i приводит к созданию новой вершины, корректировке указателей и вращению элементов дерева для сохранения сбалансированности
Помогите. В Ineterbase есть такая процедура на С++
ISC_QUAD* EXPORT fn_doubletodate(ARG(double*, d))
ARGLIST(double* d)
{
ISC_QUAD *bufquad = (ISC_QUAD *) MALLOC (sizeof(ISC_QUAD));
bufquad->gds_quad_high = *d;
*d = (*d - bufquad->gds_quad_high) * msec_in_day;
bufquad->gds_quad_low = ROUND(*d, 0);
return bufquad;
}
Я в си ноль хотелось бы понять как они осуществляют процедуру преоброзования числа в дату. если можно алгоритм
ISC_QUAD* EXPORT fn_doubletodate(ARG(double*, d))
ARGLIST(double* d)
{
ISC_QUAD *bufquad = (ISC_QUAD *) MALLOC (sizeof(ISC_QUAD));
bufquad->gds_quad_high = *d;
*d = (*d - bufquad->gds_quad_high) * msec_in_day;
bufquad->gds_quad_low = ROUND(*d, 0);
return bufquad;
}
Я в си ноль хотелось бы понять как они осуществляют процедуру преоброзования числа в дату. если можно алгоритм
Насколько я понял, дата представляется как (вещественное) число дней, прошедшего с начала отсчёта до некоторого момента, не помню сейчас, с какого именно. Эта процедура возвращает указатеть на структуру, состоящую из двух полей. В старших двух байтах возвращается целое число дней, в младших двух байтах возвращается число целое секунд (округлённо).
karakurt2
А у си отсчет с какой даты начинается? в delphi например 30.12.1899
А у си отсчет с какой даты начинается? в delphi например 30.12.1899
SIgor33, совершенно аналогично. Я так подозреваю, это стандартное представление даты, не зависящее от языка программирования. Вот статья из Microsoft Developer Network по этому вопросу.
а, например, в сях юникса с 1 января 1970г., которое так и называется "unix-time"
---
вернее, "юникс-эпоха":
http://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F
---
вернее, "юникс-эпоха":
http://ru.wikipedia.org/wiki/UNIX-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F
Вот задали поиграться с конструкторами копии, и не компилится мой код. Ошибку пометил в коментарии. Заранее спасибо.
Код:
#include <iostream>
#include <string.h>
#include <windows.h>
class CMyString
{
char *pStr;
protected:
static int Q_OBJ;
public:
CMyString();
static char CON_C[100], DES[100], ADR[100], ADR_C[100], ADR_T[100], CON[100];
static int ShowNumberOfObj() { return Q_OBJ; }
static void Qpp() { Q_OBJ++; }
static void Qmm() { Q_OBJ--; }
CMyString(const CMyString &);
~CMyString();
void Set(char *);
};
int CMyString::Q_OBJ = 0;
char CMyString::CON[100] = "The constructor of new object was called, now the number of objects is ";
char CMyString::CON_C[100] = "The constructor of copy was called, now the number of objects is ";
char CMyString::DES[100] = "The destructor was called, now the number of objects is ";
char CMyString::ADR[100] = "The adress of new object is ";
char CMyString::ADR_C[100] = "This constructor of copy was called by the object with the adress ";
char CMyString::ADR_T[100] = "The adress of temprary object, that was created by the constructor of copy is ";
CMyString::CMyString()
{
char buf[20];
pStr = new char[1];
Qpp();
strcat(CON, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, CON, "Constructor", MB_OK);
CON[72] = 0; //72 is lenth of CON
}
CMyString::~CMyString()
{
char buf[20];
Qmm();
strcat(DES, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, DES, "Destructor", MB_OK);
DES[57] = 0; //57 is lenth of DES
delete pStr;
}
void CMyString::Set(char *pNewStr)
{
int i, s;
s = strlen(pNewStr);
delete pStr;
pStr = new char[s+1];
for(i=0; i<=s; i++)
*(pStr + i) = *(pNewStr + i);
}
CMyString::CMyString(const CMyString &Source)
{
char buf[20], q_str[12];
Qpp();
strcat(CON_C, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, CON_C, "Constructor of copy", MB_OK);
CON_C[65] = 0; //65 is lenth of CON
strcat(ADR_C, itoa((int)(&Source), buf, 16));
MessageBoxA(NULL, ADR_C, "Constructor of copy", MB_OK);
ADR_C[67] = 0;
strcat(ADR_T, itoa((int)this, buf, 16));
MessageBoxA(NULL, ADR_T, "Constructor of copy", MB_OK);
ADR_T[79] = 0;
pStr = new[strlen(Source.pStr)]; // ОШИБКА!!!!!!!!!!!!!! ПОЧЕМУ?
strcpy(pStr, Source.pStr);
}
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
CMyString obj1;
CMyString obj2 = obj1;
return 0;
}
Код:
#include <iostream>
#include <string.h>
#include <windows.h>
class CMyString
{
char *pStr;
protected:
static int Q_OBJ;
public:
CMyString();
static char CON_C[100], DES[100], ADR[100], ADR_C[100], ADR_T[100], CON[100];
static int ShowNumberOfObj() { return Q_OBJ; }
static void Qpp() { Q_OBJ++; }
static void Qmm() { Q_OBJ--; }
CMyString(const CMyString &);
~CMyString();
void Set(char *);
};
int CMyString::Q_OBJ = 0;
char CMyString::CON[100] = "The constructor of new object was called, now the number of objects is ";
char CMyString::CON_C[100] = "The constructor of copy was called, now the number of objects is ";
char CMyString::DES[100] = "The destructor was called, now the number of objects is ";
char CMyString::ADR[100] = "The adress of new object is ";
char CMyString::ADR_C[100] = "This constructor of copy was called by the object with the adress ";
char CMyString::ADR_T[100] = "The adress of temprary object, that was created by the constructor of copy is ";
CMyString::CMyString()
{
char buf[20];
pStr = new char[1];
Qpp();
strcat(CON, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, CON, "Constructor", MB_OK);
CON[72] = 0; //72 is lenth of CON
}
CMyString::~CMyString()
{
char buf[20];
Qmm();
strcat(DES, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, DES, "Destructor", MB_OK);
DES[57] = 0; //57 is lenth of DES
delete pStr;
}
void CMyString::Set(char *pNewStr)
{
int i, s;
s = strlen(pNewStr);
delete pStr;
pStr = new char[s+1];
for(i=0; i<=s; i++)
*(pStr + i) = *(pNewStr + i);
}
CMyString::CMyString(const CMyString &Source)
{
char buf[20], q_str[12];
Qpp();
strcat(CON_C, itoa(ShowNumberOfObj(), buf, 10));
MessageBoxA(NULL, CON_C, "Constructor of copy", MB_OK);
CON_C[65] = 0; //65 is lenth of CON
strcat(ADR_C, itoa((int)(&Source), buf, 16));
MessageBoxA(NULL, ADR_C, "Constructor of copy", MB_OK);
ADR_C[67] = 0;
strcat(ADR_T, itoa((int)this, buf, 16));
MessageBoxA(NULL, ADR_T, "Constructor of copy", MB_OK);
ADR_T[79] = 0;
pStr = new[strlen(Source.pStr)]; // ОШИБКА!!!!!!!!!!!!!! ПОЧЕМУ?
strcpy(pStr, Source.pStr);
}
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
CMyString obj1;
CMyString obj2 = obj1;
return 0;
}
Infinite Retrieval
Цитата:
Может, всё-таки new char[strlen(Source.pStr)]?
Цитата:
pStr = new[strlen(Source.pStr)]; // ОШИБКА!!!!!!!!!!!!!! ПОЧЕМУ?
Может, всё-таки new char[strlen(Source.pStr)]?
Цитата:
Может, всё-таки new char[strlen(Source.pStr)]?
Ё-маё..... башка уже не варит, спасибо.
Да, раз уж вы тут, не подскажите, как можно генерировать в студии код, чтобы пихнуть его в первый сектор жёсткого диска, тобишь как написать собственный загрузщик? Давно хотел с этим поиграться, привез ненужный системник. Насколько я понимаю, нужно просто сгенерировать bin файл с нулевым смещением и то, что атм написанно будет исполняться пи загрузке. Общение с пользователем можно проводить только через прерывания клавиатуры? На экран выводить можно только через тоже соотвествующее прерывание? Наверника же подобные программы пишутся не на fasm, а на C. Каким образом общаются с пользователем? Через какую-нибудь библиотеку общения с портами? Вообщем подскажите с чего начать и как делать. Для начала хочу просто понять как по шагам добиться исполнения собственного кода в начала загрузки, а уж дальше можно передавть джампы на системы.
Infinite Retrieval
Цитата:
Да. Надо только учитывать, что там ещё и таблица разделов должна находиться.
Цитата:
Разумеется, работать можно только с BIOS. Int 10h - вывод на экран, int 16h - клавиатура, int 13h - работа с диском.
Цитата:
Уж MBR-то точно на ассемблере пишется.
Цитата:
Насколько я понимаю, нужно просто сгенерировать bin файл с нулевым смещением и то, что атм написанно будет исполняться пи загрузке.
Да. Надо только учитывать, что там ещё и таблица разделов должна находиться.
Цитата:
Общение с пользователем можно проводить только через прерывания клавиатуры? На экран выводить можно только через тоже соотвествующее прерывание?
Разумеется, работать можно только с BIOS. Int 10h - вывод на экран, int 16h - клавиатура, int 13h - работа с диском.
Цитата:
Наверника же подобные программы пишутся не на fasm, а на C.
Уж MBR-то точно на ассемблере пишется.
000h 446 Код загрузчика
1BEh 64 Таблица разделов
16 Раздел 1
1CEh 16 Раздел 2
1DEh 16 Раздел 3
1EEh 16 Раздел 4
1FEh 2 Сигнатура (55h AAh)
00h 1 Признак активности раздела
01h 1 Начало раздела — головка
02h 1 Начало раздела — сектор (биты 0-5), дорожка (биты 6,7)
03h 1 Начало раздела — дорожка (старшие биты 8,9 хранятся в байте номера сектора)
04h 1 Код типа раздела
05h 1 Конец раздела — головка
06h 1 Конец раздела — сектор (биты 0-5), дорожка (биты 6,7)
07h 1 Конец раздела — дорожка (старшие биты 8,9 хранятся в байте номера сектора)
08h 4 Смещение первого сектора
0Ch 4 Количество секторов раздела
Код файловой системы используемой на данном разделе. В случае расширенного раздела принимает значение 05h.
А если обычный????
тобишь я должен уместить свой код до 1BE.
обишь я пишу прогу общения, затем пишу
org 0x1BE
db 1;
db 1; //как выбрать головку?
db 00000001b; // 1ый сектор (нулевой уже занят) нулевая дорожка
и так далее
Помогите, пожалуйста, каким-нибудь примером заглушкой.
1BEh 64 Таблица разделов
16 Раздел 1
1CEh 16 Раздел 2
1DEh 16 Раздел 3
1EEh 16 Раздел 4
1FEh 2 Сигнатура (55h AAh)
00h 1 Признак активности раздела
01h 1 Начало раздела — головка
02h 1 Начало раздела — сектор (биты 0-5), дорожка (биты 6,7)
03h 1 Начало раздела — дорожка (старшие биты 8,9 хранятся в байте номера сектора)
04h 1 Код типа раздела
05h 1 Конец раздела — головка
06h 1 Конец раздела — сектор (биты 0-5), дорожка (биты 6,7)
07h 1 Конец раздела — дорожка (старшие биты 8,9 хранятся в байте номера сектора)
08h 4 Смещение первого сектора
0Ch 4 Количество секторов раздела
Код файловой системы используемой на данном разделе. В случае расширенного раздела принимает значение 05h.
А если обычный????
тобишь я должен уместить свой код до 1BE.
обишь я пишу прогу общения, затем пишу
org 0x1BE
db 1;
db 1; //как выбрать головку?
db 00000001b; // 1ый сектор (нулевой уже занят) нулевая дорожка
и так далее
Помогите, пожалуйста, каким-нибудь примером заглушкой.
Infinite Retrieval
Я такие вещи не писал. Погугли, найти, думаю, не так уж сложно. Например, вот ссылка на первой же странице.
Я такие вещи не писал. Погугли, найти, думаю, не так уж сложно. Например, вот ссылка на первой же странице.
Ведь можно взять и дизасеблить свой диск!!!!!
Infinite Retrieval
в данной теме, это оффтоп, имхо.
Цитата:
что значит обычный? это код устанавливается в зависимости от файловой системы
Цитата:
посмотрите загрузчик от винды, от довольно понятно написан. загрузчик в мбр должен проверять корректность главной мбр и передавать управление на активный раздел
в данной теме, это оффтоп, имхо.
Цитата:
А если обычный????
что значит обычный? это код устанавливается в зависимости от файловой системы
Цитата:
Помогите, пожалуйста, каким-нибудь примером заглушкой.
посмотрите загрузчик от винды, от довольно понятно написан. загрузчик в мбр должен проверять корректность главной мбр и передавать управление на активный раздел
Цитата:
в данной теме, это оффтоп, имхо.
Именно, оффтоп. Просто тут есть Abs62, а он частенько овечает на мои вопросы. Написал бы в личку - не увидели бы другие потенциальные ответчики, а сосздал бы отдельную тему- Abs62 бы не увидел. Так что я разместил тут вопрос из эгоистических соображений.
киньте пожалуйста ссылки на теорию по разработке контроллера, никак ничего дельного найти не могу (теги по теме Разработка модели контроллера для управления очередностью
выполнения процессов; диспетчер ресурсов)
выполнения процессов; диспетчер ресурсов)
Народ, что посоветуете из учебников. рекомендуется с самого начала, т.е. с нуля. Так же интересуют учебники по визуальному программированию.
p.s. Знаю только некоторые азы c++.
p.s. Знаю только некоторые азы c++.
Vilian
Для начала стоит полистать эту тему.
Для начала стоит полистать эту тему.
Помогите пожалуйста, мне нужно смоделировать поведение толпы, ну например пользователь кидает в толпу палку колбасы или какое-то другое действие,нужно сделать наглядную модль этого процесса,подскажите с чего мне начать,что взять за основу!!!Пожалуйста,очень прошу!
eightysix, в простейшем случае за основу следует взять двумерный массив символов, который будет отображаться на экране и обновляться при нажатии клавиши или прошествии какого-либо времени. Например, символ "1" будет означать колбасу, "0" - человека, а пробел - пустое пространство. При формировании следующего "кадра" определяется на какую клетку может перейти каждый человек таким образом, чтобы он не столкнулся с другим и одновременно стремился убежать подальше от брошенной палки колбасы.
подскажите, пожалуйста, вот такой код:
Код: someClass::someClass(int variable)
{
some_otherClass.method();
some_classVariable1=5;
some_classVariable2=variable;
}
Код: someClass::someClass(int variable)
{
some_otherClass.method();
some_classVariable1=5;
some_classVariable2=variable;
}
C4rn1v0r4
Цитата:
результат на выходе будет один и тот же. только вот производительность во втором случае всегда не ниже первой, но чаще выше. если к примеру у вас some_classVariable1 - это объект какого-то класса, то в первом случае будет вызван конструктор по умолчанию для этого класса, а потом оператор присваивания. т.е. компилятор сгенерирует такой код:
Код: someClass::someClass(int variable) :
some_otherClass(),
some_classVariable1(),
some_classVariable2(),
{
some_otherClass.method();
some_classVariable1=5;
some_classVariable2=variable;
}
Цитата:
или же есть какие-то существенные различия?
результат на выходе будет один и тот же. только вот производительность во втором случае всегда не ниже первой, но чаще выше. если к примеру у вас some_classVariable1 - это объект какого-то класса, то в первом случае будет вызван конструктор по умолчанию для этого класса, а потом оператор присваивания. т.е. компилятор сгенерирует такой код:
Код: someClass::someClass(int variable) :
some_otherClass(),
some_classVariable1(),
some_classVariable2(),
{
some_otherClass.method();
some_classVariable1=5;
some_classVariable2=variable;
}
Lyrik
о, как. буду знать.
спасибо большое за ответ.
о, как. буду знать.
спасибо большое за ответ.
Lyrik
небольшое уточнение, не придирки ради
Цитата:
небольшое уточнение, не придирки ради
Цитата:
т.е. компилятор сгенерирует такой код:
Код: someClass::someClass(int variable) :
some_otherClass(),
...
А мне вот такой вопрос задали...какие ограничения существуют при передаче параметров по ссылке и по значению? то есть что можно и что нельзя передавать при передаче этими двумя способами((((по википедии шарил, так и не нашел ответа на этот вопрос.
Ntony
Цитата:
а по книгам не пробовал? иногда помогает...
Цитата:
по википедии шарил, так и не нашел ответа на этот вопрос
а по книгам не пробовал? иногда помогает...
Ntony
Да, вроде, никаких ограничений, кроме невозможности преобразования типов аргументов. Также
по ссылке нельзя передавать константы как неконстантный аргумент, например:
Код: void f1(int& i){}
void f2(const int& i){}
Да, вроде, никаких ограничений, кроме невозможности преобразования типов аргументов. Также
по ссылке нельзя передавать константы как неконстантный аргумент, например:
Код: void f1(int& i){}
void f2(const int& i){}
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.