Dr.Yevhenius
|
|
« : 28-05-2010 09:26 » |
|
Добрый день! Попробовал записать __int64 в cout. Не получилось. Поэтому возник вопрос: можно ли вообще вывести __int64 с помощью cout'а? Вот код: std::ostream& operator<<(std::ostream& out, intx& number) { __int64 buffer = 0; for(int i = number.getSize() - 1; i >= 0; --i) { buffer = buffer<<8; buffer += number.byteAt(i); } out << buffer; // error C2593: 'operator <<' is ambiguous return out; }
|
|
« Последнее редактирование: 29-05-2010 14:49 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 28-05-2010 09:40 » |
|
как-нибудь так ))
__int64 i64; строка . Format("%I64",i64); cout << строка;
или побайтно хочешь ? В виде хексов ?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #2 : 28-05-2010 09:51 » |
|
Если понимать под "строка" - обьект класса String, то это подойдет разве что для языка C#, а у меня - C++.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 28-05-2010 09:53 » |
|
YevhenUA, при чём тут шарп
это именно для форматирования в поток. Просто я обычно CString (MFC) использую, поэтому пример с std::string с ходу написать не смогу
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #4 : 28-05-2010 09:55 » |
|
Про CString до сих пор вообще не знал. Спасибо, буду пробовать.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 28-05-2010 14:16 » |
|
забудь про эту пакость у меня всё нормально собирается, что за компилятор?
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 28-05-2010 15:13 » |
|
LogRus, с чего вдруг это пакость то Очень удобный класс. Я только не совсем понял, зачем он автору топика, если тот не использует MFC
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #7 : 28-05-2010 17:18 » |
|
Я только не совсем понял, зачем он автору топика, если тот не использует MFC
Наугад сказано, но верно LogRus, о компиляторе информацию не нашел, а вообще Microsoft Visual Studio 6.0. +Я только не совсем понял, зачем он автору топика, если тот не использует MFC
Это же твой вариант , а ничего другого мне никто не предложил.
|
|
« Последнее редактирование: 28-05-2010 17:25 от YevhenUA »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #8 : 28-05-2010 17:21 » |
|
Можно тему продолжать к решению или удалять: к сожалению __int64 мне не подходит по заданию.
|
|
« Последнее редактирование: 28-05-2010 17:27 от YevhenUA »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 28-05-2010 17:31 » |
|
YevhenUA, я так и не понял, используешь ты MFC или нет ))) Если нет, то так отформатировать можно и std::string.
а какой тип подходит ? Почему забраковал __int64 ? )
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #10 : 28-05-2010 17:35 » |
|
MFC не использую. __int64 не подходит, так как он имеет 8 байтов (я так понимаю), а размер intx может достигать 1000000 байтов и более. Решение (еще одно)(без строк) на даный момент: __int64 i = 55; printf("%I64d", i);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 28-05-2010 17:36 » |
|
вот такой код позволяет форматировать string (код не мой, я нашёл и лишь подредактировал) void st_FormatStringArgList(std::string& s,DWORD dwdResLenToTryFirst,const char *fmt, va_list args) { if(s.size()!=0) { s=""; }
if(!fmt) { return; } DWORD length=max(dwdResLenToTryFirst,256); s.resize(length,0);
for(int result=-1;result==-1 && length;length<<=1) { s.resize(length,0); if(s.size()!=length) { s=""; break; }
//result=_vsnprintf... result=_vsnprintf_s( &s[0], s.size()*sizeof(s[0]), s.size(), fmt, args ); } }
void st_FormatString(std::string& s,const char *fmt, ...) { va_list args; va_start(args, fmt); st_FormatStringArgList(s,16,fmt,args); va_end(args); }
void st_FormatString(DWORD dwdResLenToTryFirst,std::string& s,const char *fmt, ...) { va_list args; va_start(args, fmt); st_FormatStringArgList(s,dwdResLenToTryFirst,fmt,args); va_end(args); }
дело за малым: #include <string>
std::string s; __int64 i64; st_FormatString(s,"%I64",i64); cout<<s;
(не тестировал)
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #12 : 28-05-2010 17:37 » |
|
Виглядит строшшшшно.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 28-05-2010 17:37 » |
|
а размер intx может достигать 1000000 байтов и более
дык, массив тебе нужен Расскажи хоть задачу. А то во тьме тыкаемся
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #14 : 28-05-2010 17:39 » |
|
Создать новый целый тип (он же intx), размер которого не определен заранее. Должен поддерживать операции + - * / % а также преобразование в примитивные типы: char, short int, int, float и т. п.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 28-05-2010 17:43 » |
|
а, вон чего. Ну, тут сложение и вычитание более или менее просто, а вот с умножением и делением надо поискать алгоритм )
А массив нужен динамический. Или можно vector применить
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #16 : 28-05-2010 17:47 » |
|
Алгоритм умножения и деления давно известен. Его проходят где то во 2 классе обычной школы
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 28-05-2010 17:49 » |
|
Finch, просто тупо много складывать и отнимать - это довольно долго ))) Разве что "столбик" реализовать
чем автору темы и предлагается заняться )
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #18 : 28-05-2010 17:51 » |
|
Я о том и говорю, что столбик никто еше не отменял. А тем более, если умножение делать в двоичном коде. Там вообше получается красота.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 28-05-2010 17:54 » |
|
имхо, в двоичном виде неэффективно по скорости будет. Лучше применить BCD формат (одна десятичная цифра в байте) или упакованный BCD (одна цифра в тетраде) жаль только, что C++ не поддерживает такие типы напрямую (а сам процессор вроде умеет простые операции с BCD производить - если писать на ассемблере, эти возможности резко становятся доступны )
|
|
« Последнее редактирование: 28-05-2010 17:58 от Алексей1153++ »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #20 : 28-05-2010 18:02 » |
|
Алексей1153++, Если делать в двоичной алгебре умножение, то там так такового умножения вообше не будет. Сдвиг влево и сложение, вот основные операции.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 28-05-2010 18:12 » |
|
это когда без "столбика" , а так всё равно придётся несколько раз сдвинуть - и всё равно каждый байт. А операция сложения/вычитания по скорости такая же. Опять же - флаг переноса в C++ не посмотреть
Догадки всё, конечно, сам на C++ "столбик" не реализовывал. Практика бы всё расставила по местам ))
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #22 : 28-05-2010 18:14 » |
|
Я как-то реализовывал класс сверх больших чисел. В том задании было, что числа положительны и должны содержать не менее 350 десятичных чисел. С точностью до единици. Лучшего метода, чем столбик, я не надумал.
|
|
« Последнее редактирование: 28-05-2010 18:17 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 28-05-2010 18:19 » |
|
нет, сам столбик сомнения не вызывает, вопрос в том, что выбирать для соотношения "скорости работы"/"занимаемая память" ))
bin даст выигрыш в объёме и простоте, а BCD - в скорости (но утверждение не на 100%, как я выше уже говорил... )
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #24 : 29-05-2010 14:46 » |
|
Создал два файла: H-файл, в котором описан класс и CPP-файл, в котором находится реализация. Но когда пишу Microsoft Visual Studio 6.0 не соображает сам подключать intx.cpp. Поэтому решил проблему следующим образом: class intx { ... }; #include "intx.cpp"
Но я засомневался, что такой способ "нормальный" . Хочу у вас спросить: есть ли для этого какая-нибудь специальная директива или команда?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 29-05-2010 14:52 » |
|
YevhenUA, 1) *.H и *.CPP надо добавить в дерево проекта.
2) #include "intx.cpp" - это убрать
3) если используются прекомпилированные заголовки, то в САМОМ начале CPP-файла написать строку #include "stdafx.h" а в САМОМ конце файла CPP должна быть хотя бы одна пустая строка
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #26 : 29-05-2010 15:00 » |
|
Добавил файлы к проекту. Работает. Спасибо.
З.Ы. Минуту понять не мог, что означает слово "САМОМ" (читал по-английски).
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #27 : 29-05-2010 15:16 » |
|
Всё было хорошо, пока не начал тестировать. Workplace.cpp#include <stdafx.h> #include <stdlib.h>
#include "dinamic.h" using namespace quark;
int main(int argc, char* argv[]) { printf("DINAMIC test...\n");
dinamic<int> d;
system("pause"); return 0; }
dinamic.h#ifndef QUARK_DINAMIC #define QUARK_DINAMIC
namespace quark {
template <typename T> class dinamic { public: dinamic(); dinamic(T & variable); ~dinamic(); protected: T* var; };
}
#endif // QUARK_DINAMIC
dinamic.cpp#include <stdafx.h> #include "dinamic.h"
template <typename T> quark::dinamic<T>::dinamic(): var(0) { }
template <typename T> quark::dinamic<T>::dinamic(T & variable): var(0) { var = &variable; }
template <typename T> quark::dinamic<T>::~dinamic() { delete T; T = 0; }
Ошибки:Workplace.obj : error LNK2001: unresolved external symbol "public: __thiscall quark::dinamic<int>::~dinamic<int>(void)" (??1?$dinamic@H@quark@@QAE@XZ) Workplace.obj : error LNK2001: unresolved external symbol "public: __thiscall quark::dinamic<int>::dinamic<int>(void)" (??0?$dinamic@H@quark@@QAE@XZ) Debug/Workplace.exe : fatal error LNK1120: 2 unresolved externals
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #28 : 29-05-2010 15:18 » |
|
Линковщик не видит dinamic.cpp
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 29-05-2010 15:21 » |
|
реализации шаблонных функций надо разместить в H файле
|
|
|
Записан
|
|
|
|
|