Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для A1lpy
16 / 1 / 0
Регистрация: 24.07.2018
Сообщений: 22

Выполнение Си кода из переменной

31.08.2018, 11:11. Показов 2803. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно в языке программирования Си выполнить код из переменной?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2018, 11:11
Ответы с готовыми решениями:

Динамическое выполнение кода, содержащегося в переменной
Как написать и использовать данный код на vb.net ? Example (in C# code): using ScriptDotNet; Script s = Script.Compile( ...

Как ускорить выполнение кода? (Получение цвета пикселя, сравнение и выполнение действия)
Всем привет. Нужна консультация экспертов) Программа такая. Есть пиксель на экране, в нем то появляется яркий цвет, то темный (лампочка...

Одноразовое выполнение булевской переменной
Здравствуйте, программисты! У меня такая проблема: есть public static bool - переменная onPlatform, мне нужно, чтобы при прыжке на...

48
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
01.09.2018, 21:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Он примерно в той области, что описана в посте #12
это ты про сегменты памяти?
так никто и не говорил что это универсальный метод
скорее всего грязный хак
например на гарвардских архитекторах вообще не выполнится
а вот на фон Немановских,в которых и данные и команды суть одно и тоже, зависит наверное от настроек ОС
я ломать системы бросил еще во времена XPюнделя
но вот 32 компилятор скомпилил и даже выполнл
а вот 64 битный даже компилить не захотел
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
01.09.2018, 23:18
Цитата Сообщение от ValeryS Посмотреть сообщение
но вот 32 компилятор скомпилил и даже выполнл
У меня под виндой под cygwin'ом в 32-битном режиме тоже отработало. В 64-битном режиме упало на коде из ExtBuf (видимо, всё-таки страница закрыта от исполнения). По линуксом ожидаемо упало при исполнении как в 32-битном, так и в 64-битном режиме

Вероятно, под виндой в 32-битном режиме биты на страницах памяти проставляются как-то не стандартно. Может быть, что-то растёт из совместимости

Добавлено через 19 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
я ломать системы бросил еще во времена XPюнделя
Тут о поломках речи вообще не идёт
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
01.09.2018, 23:51
Цитата Сообщение от Evg Посмотреть сообщение
Тут о поломках речи вообще не идёт
речь то не идет
но чтобы ломать системы нужно знать их устройство, и эти же знание нужны чтобы заставить программу работать нештатно
а я последнее время перешел на микроконтроллеры, и в винде уже как простой пользователь
а линукс вообще ни знал никогда

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
В 64-битном режиме упало на коде из ExtBuf
у меня есть подозрение, что в 64 битном режиме уже другие машинные коды
где то читал что современные пентиумы это RISC архитектура, у них просто стоит блок дешифратора, который перекодирует старые коды в коды RISC процессора, для обратной совместимости
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
02.09.2018, 01:52
Вот вы тут обсуждаете всякие внедрения кода в память, но судя по тому, что раздел для начинающих,
у автора явная проблема XY
https://en.wikipedia.org/wiki/XY_problem
Вместо того, чтобы воспользоваться любым другим, интерпретируемым (скриптовым) языком программирования, для которых такие фишки типа самопишущихся прог естесственны, автор упорно ищет решение на Си, а вы ему в этом зачем-то помогаете...
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.09.2018, 06:26
Для того, чтобы выполнить какой-либо код, нужен аппаратный и/или программный интерпретатор этого кода,
или транслятор этого кода в другой код, подходящий для другого интерпретатора.

Kuzia domovenok, если автор вопроса, в дополнение к PHP, интересуется программированием для симулятора 8086, почему бы ему не заинтересоваться низкоуровневым программированием на языке высокого уровня?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.09.2018, 12:36
Цитата Сообщение от ValeryS Посмотреть сообщение
у меня есть подозрение, что в 64 битном режиме уже другие машинные коды
Те же самые. Из-под отладчика видно, что падаем на nop'е. Кроме как запрета на исполнение других причин не видно

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
автор упорно ищет решение на Си, а вы ему в этом зачем-то помогаете
Ему уже давно никто не помогает, всё обсуждение давно ушло в область теории, которая интересна сама по себе, вне контекста того, что спросил ТС

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

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
где то читал что современные пентиумы это RISC архитектура, у них просто стоит блок дешифратора, который перекодирует старые коды в коды RISC процессора, для обратной совместимости
Ты всё переврал, но суть я понял. Ты говоришь о микроархитектуре. К коду "nop, nop, ret" это отношения не имеет

1
02.09.2018, 14:41

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Но здесь всё закончится тем, что придут модераторы и начнут махать шашкой. Ибо формальное соблюдение правил - это гораздо важнее, чем качество контента на форуме
Пока речь о выполнении кода из памяти (формально как-раз то, о чём ТС и спрашивал), не начнём. Как только дойдёт до доработки процессора паяльником, закроем обязательно.
Искренне ваш, модератор раздела.

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.09.2018, 15:23

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
формально как-раз то, о чём ТС и спрашивал
Формально ТС спрашивал о выполнении Си-кода, а не машинного кода



Добавлено через 1 минуту

Не по теме:

Хотя, опять-таки формально, никто толком не знает, о чём конкретно спрашивал ТС. А потому формально, кроме как о выяснении того, чего хочет ТС, тут говорить ни о чём нельзя

0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
02.09.2018, 19:33
Цитата Сообщение от ValeryS Посмотреть сообщение
вот простейший тест
если бы простейший тест работал, я бы не спрашивал. Но ни gcc, ни mingw не срабатывают. Сегфолт и все тут.
Шаманить с правами на страницы сейчас все же лень.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.09.2018, 19:41
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Шаманить с правами на страницы сейчас все же лень
В посте #20 есть готовый пример (под линукс). Только там афтор задачи код не в виде байтиков забивал, а копировал из кода существующей функции в секцию данных
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 654
02.09.2018, 20:25
можно ключик -zexecstack gcc подсунуть, тест заработает. но для продакшн не годиться т.к. делает много лишнего.
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
02.09.2018, 21:55
Без -z execstack и без сегфолтов работает это
C
1
2
3
4
int main()
{
    ((void(*)()) "\303" )(); /* (){ return; }*/
}
Тут компилятор положил строковую константу вместе с кодом main().
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cc -Os execdata.c 
# ....
 
(gdb) disas
Dump of assembler code for function main:
=> 0x00005555555544f0 <+0>: sub    $0x8,%rsp
   0x00005555555544f4 <+4>: xor    %eax,%eax
   0x00005555555544f6 <+6>: callq  0x555555554694
   0x00005555555544fb <+11>:    xor    %eax,%eax
   0x00005555555544fd <+13>:    pop    %rdx
   0x00005555555544fe <+14>:    retq   
End of assembler dump.
(gdb) si
0x00005555555544f4 in main ()
(gdb) si
0x00005555555544f6 in main ()
(gdb) si
0x0000555555554694 in ?? ()
(gdb) x /i $rip
=> 0x555555554694:  retq   
(gdb) si
0x00005555555544fb in main ()
(gdb) disas
Dump of assembler code for function main:
   0x00005555555544f0 <+0>: sub    $0x8,%rsp
   0x00005555555544f4 <+4>: xor    %eax,%eax
   0x00005555555544f6 <+6>: callq  0x555555554694
=> 0x00005555555544fb <+11>:    xor    %eax,%eax
   0x00005555555544fd <+13>:    pop    %rdx
   0x00005555555544fe <+14>:    retq   
End of assembler dump.
Т.е. получилось не то, что в теме,
а способ обойтись в коде на Си без ассемблеров
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
03.09.2018, 02:46
Цитата Сообщение от Evg Посмотреть сообщение
В посте #20 есть готовый пример
Code
1
2
3
$ g++ main.cpp
main.cpp: In function ‘int main()’:
main.cpp:32:35: error: cast from ‘char*’ to ‘int’ loses precision [-fpermissive]
Code
1
2
3
4
5
6
7
8
9
10
11
$ g++ main.cpp -fpermissive
main.cpp: In function ‘int main()’:
main.cpp:32:35: warning: cast from ‘char*’ to ‘int’ loses precision [-fpermissive]
     char* buff  = (char *)(((int) data + PAGESIZE-1) & ~(PAGESIZE-1));
                                   ^~~~
main.cpp:32:69: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     char* buff  = (char *)(((int) data + PAGESIZE-1) & ~(PAGESIZE-1));
                                                                     ^
$ ./a.out 
+++++++++++++++++++++++++++
Ошибка сегментирования
Сегфолт прямо при копировании из функции в переменную.
Цитата Сообщение от ОС Посмотреть сообщение
Без -z execstack и без сегфолтов работает это
не работает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/mman.h> 
#include <unistd.h>
 
void func(int *a){
  *a+=2;
}
 
int main(){
  //получаем размер страницы памяти
  size_t pagesize = sysconf(_SC_PAGE_SIZE);
  //выделяем кусок памяти, гарантированно вмещающий хотя бы одну страницу
  char *buff2 = (char*)malloc(pagesize*2);
  //переходим к началу страницы
  char *buff = (char*)(((size_t)buff2 + pagesize - 1) & ~(pagesize-1));
  
  //бинарный код func()
  unsigned char sample[]={
    0x55,                   //push   %rbp
    0x48,0x89,0xe5,         //mov    %rsp,%rbp
    0x48, 0x89, 0x7d, 0xf8, //mov    %rdi,-0x8(%rbp)
    0x48, 0x8b, 0x45, 0xf8, //mov    -0x8(%rbp),%rax
    0x8b, 0x00,             //mov    (%rax),%eax
    0x8d, 0x50, 0x02,       //lea    0x2(%rax),%edx
    0x48, 0x8b, 0x45, 0xf8, //mov    -0x8(%rbp),%rax
    0x89, 0x10,             //mov    %edx,(%rax)
    0x90,                   //nop (хз зачем он тут)
    0x5D,                   //pop    %rbp
    0xC3                    //retq
  };
  
  //копируем в подготовленную область памяти
  memcpy(buff, sample, sizeof(sample));
  
  //меняем права на нее
  if (mprotect (buff, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
    fprintf (stderr, "mprotect error \n");
  
  int x=1;
  ((void(*)(int*))buff)(&x);
  printf("%i\n", x);
 
  free(buff2);
  return 0; 
}
так вроде работает.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.09.2018, 05:33
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
$ g++ main.cpp
Зачем компилировать пример на Си как C++ ?

С помощью mprotect() можно поменять ограничения доступа к уже выделенной кем-то странице.
Новые странцы в linux можно выделить сразу исполняемыми и изменяемыми одним вызовом mmap().
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
03.09.2018, 08:23
Оптимизация через mmap это конечно хорошо, но практического смысла я в этом уже не вижу. Вот проверить выполнение из динамической памяти было любопытно.
Но для чего это можно применить? Модификация кода программы во время выполнения? Проще встроить интерпретатор скриптового языка, jit-компилятор или вызов обычного компилятора со сборкой в динамическую библиотеку. Все равно разработчиков этих средств мне не переплюнуть, да еще с кросс-платформенностью возникнуть проблемы: бинарный код ведь на ассемблере писан.
Цитата Сообщение от politoto Посмотреть сообщение
Зачем компилировать пример на Си как C++ ?
потому что изначальный код по той ссылке был на С++ (там использовалось new для выделения памяти)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
03.09.2018, 08:48
Цитата Сообщение от ОС Посмотреть сообщение
Без -z execstack и без сегфолтов работает это
У меня не работает

Запусти "gcc t.c -S" и покажи файл t.s. Есть подозрение, что отдельные конфигурации компиляторов попросту кладут Read-only данные в те же сегменты памяти, что и код

Добавлено через 15 минут
COKPOWEHEU, та тема старая, код был написан под 32-битные системы, на языке Си (а не Си++). Ну и я забыл написать, что пример из самого первого поста в той теме не должен работать (ТС именно с этой проблемой и пришёл на форум), пример с исправлением проблемы написан в посте #2

Но в режиме 64 он всё равно не работает (в исходнике обязательно нужно заменить преобразование к int'у на преобразование к long'у). Падает вот так:

Code
   0x0000000000602000 <+3904>:  push   %rbp
   0x0000000000602001 <+3905>:  mov    %rsp,%rbp
=> 0x0000000000602004 <+3908>:  mov    0x2009ff(%rip),%rdx        # 0x802a0a
   0x000000000060200b <+3915>:  mov    0x2009f1(%rip),%eax        # 0x802a02
   0x0000000000602011 <+3921>:  mov    %eax,%esi
   0x0000000000602013 <+3923>:  mov    $0x400788,%edi
   0x0000000000602018 <+3928>:  mov    $0x0,%eax
   0x000000000060201d <+3933>:  callq  *%rdx
   0x000000000060201f <+3935>:  pop    %rbp
т.е. тут опять возникла изначальная проблема, озвученная в той теме. В режиме 64 обращения к глобальным адресам строятся не как абсолютные, а как относительные. Это приводит к тому, что код функции f2 в runtime нельзя копировать, т.к. он гвоздями прибит к своим собственным адресам. Если закомментировать внутренности f2 (т.е. оставить функцию без кода), то отработает (разумеется, без печати). Можно написать любые внутренности внутри f2, но без обращения к глобальным переменным (чтобы не провоцировать относительные адреса). Ну или заставить компилятор генерировать абсолютные адреса

Собственно, этот пример я приводил в первую очередь как прототип задачи, в которой код исполняется из сегмента данных. В какой-то мере ты его переделал в посте #33, но по сути с тем же ограничением - без использования глобальных переменных (и printf'а, как очень было необходимо в изначальном примере)

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но для чего это можно применить? Модификация кода программы во время выполнения?
Это прототип того, как работают, например, jit-компиляторы. Это ведь не всем очевидно

Добавлено через 49 секунд
Ну или написать самому свой примитивный jit-компилятор. Как-никак интерпретаторы уже многие умеют писать, а тут очень конкретный level up
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 654
03.09.2018, 10:19
Цитата Сообщение от politoto Посмотреть сообщение
Новые странцы в linux можно выделить сразу исполняемыми и изменяемыми одним вызовом mmap()
Для этого придется W^X отключать (если он был конечно).
Нынче это модно делать по такой схеме:
2 процесса, 1й держит страницы с RX; 2й загнан в песочницу и вообще кастрирован по самые уши, держит эти же страницы WR и меняет код по IPC запросам 1го процесса.
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
03.09.2018, 11:41
Цитата Сообщение от Evg Посмотреть сообщение
COKPOWEHEU, та тема старая, код был написан под 32-битные системы, на языке Си (а не Си++). Ну и я забыл написать, что пример из самого первого поста в той теме не должен работать (ТС именно с этой проблемой и пришёл на форум), пример с исправлением проблемы написан в посте #2
Я там все варианты проверял. Просто первый написан на С++, вот и остальных им же собирал. Какая разница по большому счету?
Цитата Сообщение от Evg Посмотреть сообщение
Но в режиме 64 он всё равно не работает (в исходнике обязательно нужно заменить преобразование к int'у на преобразование к long'у).
Только не к long а к size_t. Он для этого и предназначен. Если обратили внимание, в моей версии так и сделано.
Цитата Сообщение от Evg Посмотреть сообщение
Если закомментировать внутренности f2 (т.е. оставить функцию без кода), то отработает (разумеется, без печати). Можно написать любые внутренности внутри f2, но без обращения к глобальным переменным (чтобы не провоцировать относительные адреса). Ну или заставить компилятор генерировать абсолютные адреса
Ну, я это решил немного по-другому: передачей переменной по указателю.
Цитата Сообщение от Evg Посмотреть сообщение
Это прототип того, как работают, например, jit-компиляторы. Это ведь не всем очевидно
Еще бы к этому "jit-компилятору" собственно компилятор прикрутить... Но, как я и сам говорил, с теоретической точки зрения такая механика достаточно интересна.
Цитата Сообщение от Evg Посмотреть сообщение
Ну или написать самому свой примитивный jit-компилятор. Как-никак интерпретаторы уже многие умеют писать, а тут очень конкретный level up
Вряд ли это имеет смысл кроме как для самообразования. От интерпретатора требуется только интерпретировать код, не обязательно быстро. А вот компилятор, даже jit, имеет смысл делать оптимизирующим. А ведь еще возникнут проблемы переносимости. Мы тут три десятка сообщений искали как запустить на Линуксе x86 / x64. А что для windows? А для ARM? Поддерживать весь зоопарк ИМХО непосильная задача для одиночного любителя. А делать Lin_x86 only не особо полезно.
Лучше уж таскать с программой обычный gcc и собирать нужный код в *.so. Не говоря о "стандартной" jit-компиляции для java / .net
Цитата Сообщение от prik Посмотреть сообщение
Нынче это модно делать по такой схеме:
Это в какой области?
1
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 654
03.09.2018, 12:16
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это в какой области?
Например браузеры.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.09.2018, 13:24
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мы тут три десятка сообщений искали как запустить на Линуксе x86 / x64. А что для windows? А для ARM?
На платформах, где аппаратура и ПО не умеет защищать области памяти от выполнения, сработает простой способ. Что-то вроде
C
1
( (void (*)()) (&datacode) ) ();
Если существует платформозависимый способ запретить выполнение кода, нужна платформозависимая обработка:
копирование или проецирование кода в область адресного пространства, где возможно его выполнение,
разрешение выполнения кода платформозависмым способом в той области, где он расположен,
программная симуляция выполнения кода и т.п.

В Win32 свои аналоги mmap и mprotect были ещё когда машины, на которых работала Windows, не умели запрещать выполненние в отдельных страницах.
https://msdn.microsoft.com/en-... 66890.aspx
To execute dynamically generated code, use VirtualAllocEx to allocate memory and the VirtualProtectEx function to grant PAGE_EXECUTE access.
...
When creating a region that will be executable, the calling program bears responsibility for ensuring cache coherency via an appropriate call to FlushInstructionCache once the code has been set in place. Otherwise attempts to execute code out of the newly executable region may produce unpredictable results.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Поддерживать весь зоопарк ИМХО непосильная задача для одиночного любителя
Не только для одиночного любителя. Операционные системы для мейнфреймов не работают на 8-разрядных микроконтроллерах, и компания IBM не особо переживает по этому поводу.
У каждого кода есть своя область применения.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2018, 13:24

Выполнение сценария из переменной VBS
Необходимо выполнить сценарий заданный в переменной: per = &quot;msgbox &quot;&quot;Hi&quot;&quot;&quot; 'И дальше нужно как-то это сообщение показать ...

Выполнение кода
На одном из сайтов прочитал, что в .NET программах невозможно выполнение кода в хипах и в стеке. Как в .NET происходит вызов методов и...

Выполнение JS кода в С++
Нужно авторизоваться на сайте, но требуются куки, получаются они тут, как выполнить код, чтобы получить куки? ;eval(...

Выполнение кода
Как без командных строк компилировать java код? Слышал есть класс для компиляции java на лету.

JavaScript в PHP, выполнение с данными переменной
Помогите найти ошибку. Хочу чтобы $steamID передавался в функцию javascript, выполнялся в ней, и выводился на экран и записывался в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru