#include <fstream>
#include <ios>
#include <ctime>
#include <iostream>
#include <windows.h>
class MyBitmap {
BITMAPFILEHEADER header_;
BITMAPINFOHEADER info_;
bool loaded_;
char* pixels_;
size_t data_size_;
size_t row_padded_;
public:
MyBitmap(const char* fileName) {
loaded_ = false;
pixels_ = 0;
std::ifstream bmp(fileName, std::ios::binary);
if (!bmp) {
return;
}
bmp.read((char*)&header_, sizeof(header_));
if (!bmp) {
return;
}
if (header_.bfType != 'MB') {
std::cout << "Format is not supported" << std::endl;
return;
}
bmp.read((char*)&info_, sizeof(info_));
if (!bmp) {
return;
}
if (info_.biBitCount != 24) {
std::cout << "Format is not supported" << std::endl;
return;
};
row_padded_ = (info_.biWidth * 3 + 3) & (~3);
int height = info_.biHeight;
data_size_ = row_padded_ * height;
pixels_ = new char[data_size_];
bmp.read(pixels_, data_size_);
if (bmp) {
loaded_ = true;
}
return;
}
bool Save(const char* fileName) {
if (!loaded_) {
return false;
}
std::ofstream f(fileName, std::ios::binary);
if (!f) {
return false;
}
f.write((char*)&header_, sizeof(header_));
f.write((char*)&info_, sizeof(info_));
f.write(pixels_, data_size_);
if (f) {
return true;
}
return false;
}
void AddBorderInside(int borderSize = 15) {
for (int i = 0; i < info_.biWidth; i++) {
for (int j = 0; j < info_.biHeight; j++) {
if (i < borderSize || i >= info_.biWidth - borderSize
|| j < borderSize || j >= info_.biHeight - borderSize) {
int pos = row_padded_* j + i * 3;
pixels_[pos] = rand() % 256;
pixels_[pos + 1] = rand() % 256;
pixels_[pos + 2] = rand() % 256;
}
}
}
}
void AddBorderOutside(int borderSize = 15) {
int new_width = info_.biWidth + borderSize * 2;
int new_row_padded = (new_width * 3 + 3) & (~3);
int new_height = info_.biHeight + borderSize * 2;
int new_data_size = new_row_padded * new_height;
char* new_pixels_ = new char[new_data_size];
for (int i = 0; i < info_.biHeight; i++) {
int old_pos = row_padded_* i;
int new_pos = new_row_padded * (borderSize+i) +3 * borderSize;
memcpy(new_pixels_ + new_pos, pixels_ + old_pos, info_.biWidth * 3);
}
delete[] pixels_;
info_.biWidth = new_width;
info_.biHeight = new_height;
pixels_ = new_pixels_;
row_padded_ = new_row_padded;
data_size_ = new_data_size;
AddBorderInside(borderSize);
}
bool IsLoaded() const {
return loaded_;
}
~MyBitmap() {
delete[] pixels_;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(0));
MyBitmap bmp("input.bmp");
if (!bmp.IsLoaded()) {
std::cout << "Unable to load bitmap" << std::endl;
return 1;
}
bmp.AddBorderOutside();
if (!bmp.Save("output.bmp")) {
std::cout << "Unable to save bitmap" << std::endl;
}
return 0;
}
макросы в С++
#include <iostream>
template<typename T>
auto sqr = [](T x)
{
return x * x;
};
int main()
{
std::cout << sqr<int>(3 + 0);
}
//...
class __lambda_3_12
{
public: inline int operator()(int x) const
{
return x * x;
}
//...
};
//...
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int main()
{
int rez;
int arr_src[] = {1,8,3,2};
std::vector<int> arr(arr_src, arr_src + sizeof(arr_src)/sizeof(arr_src[0]));
arr.push_back(7);
arr.push_back(8);
rez = arr.size(); //кол-во элементов в массиве
cout << rez << endl;
for (int i = 0; i < rez; i++)
cout << arr[i] << ' ';
getch();
return 0;
}
Почему у меня при отладке (картинка 1), и при чужой отладке (картинка 2) в сегменте, внизу, где четыре строки es, значения совершенно отличаются, хотя это отладка одной и той же программы?
TITLE Prog3_2a ;название программы
.MODEL small ;отводим под стек и под данные по 64Кб
.STACK 100h ;отмечаем начало сегмента стека
.DATA ;отмечаем начало сегмента данных
A DW -5, 3, 9, -4, 5 ;описание массива из 5 элементов
.CODE ;отмечаем начало сегмента кодов
main PROC
mov AX, @data ;копируем адрес
mov DS, AX ;сегмента данных
mov SI, OFFSET A ;заносим в SI начало массива А
mov CX, 4 ;в СХ заносим количество итераций
cld ;устанавливаем прямой порядок обработки массива
mov AX, [SI]
xor BX, BX
L3:
and AX, 8000h
cmp AX, 8000h
jnz L2 ;проверка на знак, если отриц. то
mov AX, 0
mov [SI], AX
inc BX
L2:
inc SI ;сдвигаемся по массиву к следующему
inc SI ;элементу
mov AX,[SI] ;заносим в АХ текущий элемент массива
loop L3 ;циклически повторяем все действия
;Тут в BX - количество положительных элементов массива (если 0 считать положительным)
mov AX,4C00h ;выход
int 21h ;из программы
main ENDP
END main
#pragma pack(1)
struct FileHeader
struct MAPINFO