Я хочу применить функцию к коллекции, карте и т.д., используя Guava.
В основном, мне нужно изменить размер строк и столбцов таблицы
по отдельности, чтобы все строки и столбцы были одинакового размера, делая что-то подобное:
Table<Integer, Integer, Cell> table = HashBasedTable.create();
Maps.transformValues(table.columnMap(), new ResizeFunction(BlockDimension.WIDTH));
Maps.transformValues(table.rowMap(), new ResizeFunction(BlockDimension.HEIGHT));
public interface Cell {
int getSize(BlockDimension dimension);
void setSize(BlockDimension dimension);
}
У меня уже есть представление о том, каким должен быть ResityFunction
. Однако необходимо применить , а не просто вернуть коллекцию
.
Я хочу написать кусок кода, который постоянно меняется, даже если изменение незначительное.
Например, может быть что-то вроде
для i в 1 к 100, сделать
начать
x: = 200
для j в 200 вниз до 1, сделать
начать
сделать что-то
конец
конец
Предположим, что мой код должен после первой итерации изменить строку x: = 200
на другую строку x: = 199
, а затем после следующей итерации изменить ее на x: = 198
и так далее.
Возможно ли написание такого кода? Нужно ли для этого использовать встроенную сборку?
ПРАВКА: Вот почему я хочу сделать это в C:
Эта программа будет запущена на экспериментальной операционной системе, и я не могу/не знаю, как использовать программы, скомпилированные с других языков. Настоящая причина, по которой мне нужен такой код, заключается в том, что этот код выполняется на гостевой операционной системе виртуальной машины. Гипервизор является бинарным транслятором, который переводит порции кода. Переводчик выполняет некоторые оптимизации. Он переводит фрагменты кода только один раз. В следующий раз, когда тот же самый блок будет использован гостем, переводчик будет использовать ранее переведенный результат. Теперь, если код изменяется на лету, то переводчик замечает это и помечает свой предыдущий перевод как устаревший. Таким образом, принудительный повторный перевод того же кода. Это то, чего я хочу добиться, чтобы заставить переводчика делать много переводов. Обычно эти порции являются инструкциями между командами перехода (например, инструкциями перехода). Я просто думаю, что самодифицирующийся код будет фантастическим способом достичь этого.
Извините, я отвечаю с небольшим опозданием, но я думаю, что нашел именно то, что вы ищете: https://shanetully.com/2013/12/writing-a-self-mutating-x86_64-c -program /
В этой статье они изменяют значение константы, вставляя сборку в стек. Затем они выполняют шелл-код, изменяя память функции в стеке.
Ниже приведен первый код:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>
void foo(void);
int change_page_permissions_of_address(void *addr);
int main(void) {
void *foo_addr = (void*)foo;
// Change the permissions of the page that contains foo() to read, write, and execute
// This assumes that foo() is fully contained by a single page
if(change_page_permissions_of_address(foo_addr) == -1) {
fprintf(stderr, "Error while changing page permissions of foo(): %s\n", strerror(errno));
return 1;
}
// Call the unmodified foo()
puts("Calling foo...");
foo();
// Change the immediate value in the addl instruction in foo() to 42
unsigned char *instruction = (unsigned char*)foo_addr + 18;
*instruction = 0x2A;
// Call the modified foo()
puts("Calling foo...");
foo();
return 0;
}
void foo(void) {
int i=0;
i++;
printf("i: %d\n", i);
}
int change_page_permissions_of_address(void *addr) {
// Move the pointer to the page boundary
int page_size = getpagesize();
addr -= (unsigned long)addr % page_size;
if(mprotect(addr, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == -1) {
return -1;
}
return 0;
}