Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4

Как написать функцию выделения памяти?

18.08.2020, 01:51. Показов 7300. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько сложно это сделать? Покажите примитивный механизм поиска памяти, как вариант мне даже интересно посмотреть как работают известные функции(new maloc caloc), я читал что по принципу сборщика мусора но механизмов реализации не видел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.08.2020, 01:51
Ответы с готовыми решениями:

Как написать программу для динамического выделения памяти с использованием new
Надо написать прогу, которая выделяет память для структур размером в 2048 байт и обрабатывает ситуацию в случае ее нехватки. Я понятия не...

Передача массива указателей в функцию для выделения памяти
Есть функция, в которую передаются массивы указателей, для выделения памяти. void str_malloc(char** &strBol,char**...

Создать функцию для выделения памяти под двумерный массив
1. C++ Создать функцию для выделения памяти под двумерный массив.

76
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
31.08.2020, 23:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от politoto Посмотреть сообщение
brk()/sbrk() устарели ещё в 1990-х
Если brk является первичной функцией низкоуровневой тот её и не нужно указывать в стандартах:
1)потому что она только просит память и возвращает указатель;
2)она не сохраняет размер( и номер блока если это нужно);
3)она не инициализирует запрошенный участок;
4)она не помечает поля с которыми вы работаете;
6)возможно не работает с виртуальной памятью т.е. вообще либо не производит никаких регулировок (точно не знаю потому что спрашиваю сам);
5)она не производит никаких оптимизаций в отличие от maloc и new

Другими словами это сырая функция.
Что по вашему стоит за maloc в последней вашей ссылке тоже используется brk.
Вы знаете какие-нибудь методы запроса памяти не используя maloc brk
Вы выше упомянули виртуальную память про неё то я забыл. Я так понимаю что brk запрашивает физическую память в отличие от maloc который является функцией разработчиков и работает правильно, в неё конечно вложен многолетний труд. Я думаю что new использует maloc, последняя более первичная функция по отношении к new?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.09.2020, 01:12
Цитата Сообщение от Nexi99 Посмотреть сообщение
Насколько сложно это сделать?
...А освобождать память только грохнув весь хип разом.
C++
1
2
3
4
5
6
7
8
9
10
const std::size_t storageSize=1<<20;
char storage[storageSize];
char*freeStorage=storage;
 
void*myMalloc(std::size_t size)
{
    if(storage+storageSize-freeStorage<size)
        throw std::bad_alloc();
    return (freeStorage+=size)-size;
}
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
01.09.2020, 06:25
Кен Томпсон написал break в UNIX раньше.
Когда написали первый Си, break уже был. И использовался в ранних юниксовых программах.
http://man.cat-v.org/unix-1st/2/sys-break
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
01.09.2020, 15:57
Цитата Сообщение от Nexi99 Посмотреть сообщение
Вы знаете какие-нибудь методы запроса памяти не используя maloc brk
myMalloc(), который написал Renji, https://www.cyberforum.ru/post14812869.html
как раз работает по принципу sbrk()
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
01.09.2020, 22:28  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
myMalloc(), который написал Renji, https://www.cyberforum.ru/post14812869.html
как раз работает по принципу sbrk()
Ну так а я очём. Я думаю что
Малокиэто модифицированные функции а sbrk()это просто сырая функция выделяющая память. Ну там идёт не выделение, там происходит имитация это функция просто двигает указатель внутри ядра или где там короче подаёт команду в процессор(грубо говоря тонкостей нельзя всех знать).
Меня заинтересовало то что вы выше написали что есть ещё и виртуальная память и возникает вопрос где просит память sbrk(), это будет физическая память которую нужно самому регистрировать в виртуальную страницу или эта деталь уже учтена т.е. работа изначально происходит с виртуальной памятью. Но опять же есть ещё библиотека "windows.h", которая работает с исключениями а также там проверяется выход за пределы виртуальной страницы, получается что работая с sbrk() нужно самому это дело настраивать или нет?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.09.2020, 00:30
Цитата Сообщение от Nexi99 Посмотреть сообщение
Меня заинтересовало то что вы выше написали что есть ещё и виртуальная память и возникает вопрос где просит память sbrk(), это будет физическая память которую нужно самому регистрировать в виртуальную страницу или эта деталь уже учтена т.е. работа изначально происходит с виртуальной памятью.
Она вообще ничего не просит и не выделяет. У Пингвинов по-умолчанию используется overcommit. То есть, программа работает в виртуальном адресном пространстве и так или иначе просит "свяжи такой-то кусок виртуальных адресов с физической памятью". Система отвечает "ну, ок" и ничего не делает. Когда же программа пытается обратиться к "выделенной" памяти, срабатывает исключение и ОС пытается реально выделить память. Если же это ей не удается, то приходит OOM Killer и убивает кого попало, пока памяти не станет хватать. В принципе, можно покопаться в настройках ОС и это безобразие отключить.
2
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
02.09.2020, 05:34
Минимальная реализация realloc() в стиле Microsoft Windows.
https://github.com/changloong/... b/malloc.c

Организация управления памятью прилкадных программ к с++ напрямую не относится. Это или общие вопросы практики программирования или https://www.cyberforum.ru/c-linux/ и https://www.cyberforum.ru/c-linux/ , если обсуждаются особенности конкретных систем.

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h>
 
#ifdef __linux__
 
#include <unistd.h>
#include <fcntl.h>
 
void *  sb { sbrk(0), };
 
#endif
 
int
main()
{
 
#ifdef __linux__
    extern int etext, edata, end;
    
    std::cout 
        << &etext << '\n'
        << &edata << '\n'
        << &end     << '\n'
        << sbrk(0) << '-' << sb << '\n';
 
         dup2(  open("/proc/self/maps",O_RDONLY), 0 );
     system("cat");
 
#endif
    
}


А в с++ new, delete, std::realloc() - средства перераспределения памяти с целью последующего создания в ней новых объектов.
И изучаеющему полезно помнить, что стандарт с++ позволяет переопределять operator newdelete) как глобально, так и для отдельных классов, а также определять новые варианты этих операторов ( с другими параметрами ), отсутствующие в стандарте.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
int
main()
{
    new char[10]{'a','b','c',};
    
        extern char _heap[];
    
    std::cout << _heap;
}
 
char _heap[2000];
 
void* 
operator new( size_t size)
{
    static auto _brk{_heap};
    
    return _brk+=size, _brk-size;
}
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
03.09.2020, 00:53  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Она вообще ничего не просит и не выделяет. У Пингвинов по-умолчанию используется overcommit. То есть, программа работает в виртуальном адресном пространстве и так или иначе просит "свяжи такой-то кусок виртуальных адресов с физической памятью".
А где просит память sbrk()? Я имею в виду какую память просит sbrk() физическую или виртуальную или это не имеет значения, память по умолчанию запрашивается виртуальная а уже поиск физической памяти это уже не задача sbrk(), этим может заниматься ОС, если подана команда в ОС на запрос памяти то она её даёт, если виртуальной памяти не хватает то ОС просит физическую память и тем самым увеличиваем объём виртуальной а виртуальная память отдаёт часть себя нужной программе? Какие там примерно механизмы такие или нет?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.09.2020, 01:36
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я имею в виду какую память просит sbrk() физическую или виртуальную
Бумажную.
Виртуальная "память" это просто ассоциативный массив внутри процессора, состоящий из пар "виртуальный адрес:куда обращаться за данными". Причем, "куда" может быть как физической памятью, так и вызовом некоторой функции (подгрузки свопа, например). Все эти sbrk просто оформляют бумажку "предъявителю сего выдать данные по обращению к адресу 0x12345678". Выдадут ли по этой бумажке хоть что-то или менеджер памяти внезапно объявит себя банкротом - вопрос другой.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
03.09.2020, 02:44  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Выдадут ли по этой бумажке хоть что-то или менеджер памяти внезапно объявит себя банкротом - вопрос другой.
ну менеджер памяти должен проводить проверку на то есть ли память или нет если нет вернуть тот же NULL. Получается что заморачиваться над вопросом где просит память sbrk() не целесообразно да и по большей степени мы в своих функциях такую проверку не делаем т.к. 99% что new maloc дадут память. В общем на этой функции можно свободно строить свои функции.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.09.2020, 03:46
Цитата Сообщение от Nexi99 Посмотреть сообщение
ну менеджер памяти должен проводить проверку на то есть ли память или нет если нет вернуть тот же NULL.
Я же говорю, overcommit. Ничего он не должен и спокойно выдаст хоть терабайт. А вот при попытке к этому терабайту обратиться будет приключение.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    for(int i=0;i<1000;++i)
        std::cout<<(void*)new char[1<<30]<<std::endl;
    std::cout<<"Ok"<<std::endl;
    return 0;
}
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
03.09.2020, 11:34
brk() при этом на моей системе практически не дёргается
Bash
1
strace -c -e memory ./lin > /dev/null ; strace -i -e brk ./lin > /dev/null
Code
1
2
3
4
5
6
7
8
9
10
11
12
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0      1022           mmap
  0.00    0.000000           0         8           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                  1034           total
[00007f3ec32c9769] brk(NULL)            = 0x7fffc78ea000
[00007f3ec2e7ef49] brk(NULL)            = 0x7fffc78ea000
[00007f3ec2e7ef49] brk(0x7fffc790b000)  = 0x7fffc790b000
[????????????????] +++ exited with 0 +++
Добавлено через 2 часа 13 минут
Microsoft linux на Windows 10 справляется с лабораторной работой по суммированию 27-гигабайтного массива.
Windows Batch file
1
2
3
type "e.c++"
wsl g++ e.c++ 
wsl ./a.out
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>
#include <type_traits>
 
double cube [ 1500] [1500] [1500];
int
main()
{
    std::printf( "%zd"  ,sizeof cube );
    std::fflush( stdout );
    double sum{};
    for (size_t i{}; i < std::extent<decltype(cube)>{}; ++i)
        for (size_t j{}; j < std::extent<decltype(cube), 1>{}; ++j)
            for (size_t k{}; k < std::extent<decltype(cube), 2>{}; ++k)
                sum += cube[i][j][k];
 
    std::printf(" sum = %lf" "\n", sum);
}
Code
1
27000000000 sum = 0.000000
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
05.09.2020, 22:53  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
brk() при этом на моей системе практически не дёргается
В смысле не работает не даёт память?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.09.2020, 06:44
На 1000 new char[010000000000] всего 3 вызова brk() за всё время работы программы, при том два из них - brk(0) .
PHP
1
2
3
brk(NULL)            = 0x7fffc78ea000
brk(NULL)            = 0x7fffc78ea000
brk(0x7fffc790b000)  = 0x7fffc790b000
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
06.09.2020, 15:24  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
На 1000 new char[010000000000] всего 3 вызова brk() за всё время работы программы, при том два из них - brk(0) .
Ну всё таки они вызывают brk/sbrk. Я так понимаю что эта функция первична. Может есть и то что стоит за brk?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2020, 06:10
За этим системным вызовом стоит история UNIX и лично Кен Томпсон с покойным Деннисом Ритчи.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sysbreak: / set the program break
    mov u.break,r1 / move users break point to r1
    cmp r1,$core / is it the same or lower than core?
    blos    1f / yes, 1f
    cmp r1,sp / is it the same or higher than the stack?
    bhis    1f / yes, 1f
    bit $1,r1 / is it an odd address
    beq 2f / no, its even
    clrb    (r1)+ / yes, make it even
2: / clear area between the break point and the stack
    cmp r1,sp / is it higher or same than the stack
    bhis    1f / yes, quit
    clr (r1)+ / clear word
    br  2b / go back
1:
    jsr r0,arg; u.break / put the "address" in u.break (set new 
                / break point)
    br  sysret4 / br sysret
https://www.tuhs.org/cgi-bin/utree.pl?file=V1/u2.s
https://minnie.tuhs.org/Archiv... /man21.pdf
https://minnie.tuhs.org/Archiv... _Jun72.pdf
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2020, 17:31

Не по теме:


А здесь этот u.break инициализируется:

Assembler
1
2
3
4
5
sysexec:
    jsr r0,arg2 / arg0 in u.namep,arg1 on top of stack
    jsr r0,namei / namei returns i-number of file named in 
             / sysexec call in r1
        br error9
Кликните здесь для просмотра всего текста
jsr r0,iget / get i-node for file to be executed
bit $20,i.flgs / is file executable
beq error9
jsr r0,iopen / gets i-node for file with i-number given in
/ r1 (opens file)
bit $40,i.flgs / test user id on execution bit
beq 1f
tstb u.uid / test user id
beq 1f / super user
movb i.uid,u.uid / put user id of owner of file as process
/ user id
1:
mov (sp)+,r5 / r5 now contains address of list of pointers to
/ arguments to be passed
mov $1,u.quit / u.quit determines handling of quits;
/ u.quit = 1 take quit
mov $1,u.intr / u.intr determines handling of interrupts;
/ u.intr = 1 take interrupt
mov $rtssym,30 / emt trap vector set to take system routine
mov $fpsym,*10 / reserved instruction trap vector set to take
/ system routine
mov $sstack,sp / stack space used during swapping
mov r5,-(sp) / save arguments pointer on stack
mov $ecore,r5 / r5 has end of core
mov $core,r4 / r4 has start of users core
mov r4,u.base / u.base has start of users core
mov (sp),r2 / move arguments list pointer into r2
1:
tst (r2)+ / argument char = "nul"
bne 1b
tst -(r2) / decrement r2 by 2; r2 has addr of end of arguent
/ pointer list
1: / move arguments to bottom of users core
mov -(r2),r3 / (r3) last non zero argument ptr
cmp r2,(sp) / is r2 = beginning of argument ptr list
blo 1f / branch to 1f when all arguments are moved
2:
tstb (r3)+
bne 2b / scan argument for \0 (nul)
2:
movb -(r3),-(r5) / move argument char by char starting at
/ "ecore"
cmp r3,(r2) / moved all characters in this argument
bhi 2b / branch 2b if not
mov r5,(r4)+ / move r5 into top of users core; r5 has
/ pointer to nth arg
br 1b / string
1:
clrb -(r5)
bic $1,r5 / make r5 even, r5 points to last word of argument
/ strings
mov $core,r2
1: / move argument pointers into core following argument strings
cmp r2,r4
bhis 1f / branch to 1f when all pointers are moved
mov (r2)+,-(r5)
br 1b
1:
sub $core,r4 / gives number of arguments *2
asr r4 / divide r4 by 2 to calculate the number of args stored
mov r4,-(r5) / save number of arguments ahead of the argument
/ pointers
clr -(r5) / popped into ps when rti in sysrele is executed
mov $core,-(r5) / popped into pc when rti in sysrele
/ is executed
mov r5,0f / load second copyz argument
tst -(r5) / decrement r5
mov r5,u.r0 /
sub $16.,r5 / skip 8 words
mov r5,u.sp / assign user stack pointer value, effectively
/ zeroes all regs when sysrele is executed
jsr r0,copyz; core; 0:0 / zero user's core
clr u.break
mov r5,sp / point sp to user's stack
mov $14,u.count
mov $u.off,u.fofp
clr u.off / set offset in file to be read to zero
jsr r0,readi / read in first six words of user's file, starting
/ at $core
mov sp,r5 / put users stack address in r5
sub $core+40.,r5 / subtract $core +40, from r5 (leaves
/ number of words less 26 available for
/ program in user core
mov r5,u.count /
cmp core,$405 / br .+14 is first instruction if file is
/ standard a.out format
bne 1f / branch, if not standard format
mov core+2,r5 / put 2nd word of users program in r5; number of
/ bytes in program text
sub $14,r5 / subtract 12
cmp r5,u.count /
bgt 1f / branch if r5 greater than u.count
mov r5,u.count
jsr r0,readi / read in rest of user's program text
add core+10,u.nread / add size of user data area to u.nread
br 2f

Assembler
1
2
3
4
5
6
7
8
1:
    jsr r0,readi / read in rest of file
2:
    mov u.nread,u.break / set users program break to end of 
                / user code
    add $core+14,u.break / plus data area  <<<<<<!
    jsr r0,iclose / does nothing
    br  sysret3 / return to core image at $core
То же нормальным английским языком:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SYNOPSIS          sys        break; addr       / break = 17.
 
DESCRIPTION       break sets the system's idea of the highest location used
                  by the program to addr. Locations greater than addr and
                  below the stack pointer are not swapped and are thus
                  liable to unexpected modification.
 
                  If the argument is 0 or higher than the stack pointer the
                  entire 4K word user core area is swapped.
 
                  When a program begins execution via exec the break is set,
                  at the highest location defined by the program and data
                  storage areas. Ordinarily, therefore, only programs with
                  growing data areas need to use break.
 
FILES
 
SEE ALSO          exec
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
NAME                        exec --execute a file
 
SYNOPSIS            sys             exec; name; args      / exec = 11.
 
                     name: <...\0>
                    ...
              args: arg1; arg2; ...; 0
              arg1: <...\0>
              ...
 
DESCRIPTION         exec overlays the calling process with the named file,
                    then transfers to the beginning of the core image of the
                    file. The first argument to exec is a pointer to the name
                    of the file to be executed. The second is the address of a
                    list of pointers to arguments to be passed to the file.
                    Conventionally, the first argument is the name of the
                    file. Each pointer addresses a string terminated by a null
                    byte.
 
                    There can be no return from the file; the calling core
                    image is lost.
 
                    The program break is set from the executed file; see the
                    format of a.out.
 
                    Once the called file starts execution, the arguments are
                    passed as follows. The stack pointer points to the number
                    of arguments. Just above this number is a list of pointers
                    to the argument strings.
 
                      sp--> nargs
 
                              arg1
                              ...
                              argn
 
                      arg1: <arg1\0>
                        ...
                    argn: <argn\0>
 
                    The arguments are placed as high as possible incore: just
                    below 60000(8).
 
                    Files remain open across exec calls. However, the illegal
                    instruction, emt, quit, and interrupt trap specifications
                    are reset to the standard values. (See ilgins, cemt,
                    intr).
 
                    Each user has a real user ID and an effective (The real ID
                    identifies the person using the system; the effective ID
                    determines his access privileges.) exec changes the
                    effective user ID to the owner of the executed file if the
                    file has the "set--user--ID mode. The real user ID is not
                    affected.
        11/3/71                                                SYS EXEC (II)
https://www.tuhs.org/cgi-bin/u... n5/a.out.5
https://www.tuhs.org/cgi-bin/u... n2/break.2
https://www.tuhs.org/cgi-bin/u... an2/exec.2

Те же exec() и sbreak(), переписанные на архаичном Си:
https://www.tuhs.org/cgi-bin/u... ken/sys1.c



Добавлено через 4 часа 9 минут
А вот и простой malloc() на K&R
https://www.tuhs.org/cgi-bin/u... r/malloc.c
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
struct map {
    char *m_size;
    char *m_addr;
};
 
malloc(mp, size)
struct map *mp;
{
    register int a;
    register struct map *bp;
 
    for (bp = mp; bp->m_size; bp++) {
        if (bp->m_size >= size) {
            a = bp->m_addr;
            bp->m_addr =+ size;
            if ((bp->m_size =- size) == 0)
                do {
                    bp++;
                    (bp-1)->m_addr = bp->m_addr;
                } while ((bp-1)->m_size = bp->m_size);
            return(a);
        }
    }
    return(0);
 
}
1
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,837
Записей в блоге: 4
07.09.2020, 20:34  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
А вот и простой malloc() на K&R
На изучение времени конечно вагон потратишь. Буду использовать brk/sbrk если что. Спасибо ребята за информацию.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.09.2020, 21:17
Цитата Сообщение от Nexi99 Посмотреть сообщение
На изучение времени конечно вагон потратишь
И окажется, что в системе нет всех этих brk/sbrk/break полувековой давности.

Вот, кстати, чуть короче реализация:
https://www.tuhs.org/cgi-bin/u... sys/sys1.c
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
/*
 * break system call.
 *  -- bad planning: "break" is a dirty word in C.
 */
sbreak()
{
    register a, n, d;
 
    /*
     * set n to new data size
     * set d to new-old
     * set n to new total size
     */
 
    n = (((u.u_arg[0]-TOPSYS+63)>>6) & 01777);
    if(n < 0)
        n = 0;
    d = n - u.u_dsize;
    n =+ USIZE+u.u_ssize;
    if(n > UCORE) {
        u.u_error = E2BIG;
        return;
    }
    u.u_dsize =+ d;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
07.09.2020, 21:49
politoto, почему-то всегда читаю твой ник как "поллитро"
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2020, 21:49
Помогаю со студенческими работами здесь

Написать функцию выделения первого слова из строки
Написать эту функцию - это ещё пол беды. Ещё необходимо ИСПОЛЬЗУЯ именно эту функцию найти в строке первое слово (не число) максимальной...

Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
Дан класс и указатель: class X{ int a; public: X(int _a) {a = _a;} }; X *p; Напишите инструкцию выделения памяти для...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки данными с клавиатуры, 3) выводящую...

Написать код для динамического выделения памяти под массив из 10000 целых чисел
Прошу помочь с решением ! Написать код для динамического выделения памяти под массив из 10000 целых чисел. Продемонстрировать заполнение...

Написать функцию выделения произвольной строки двумерного массива в одномерный
Написать функцию выделения произвольной строки двумерного массива в одномерный. Выделить две произвольные строки.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru