GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
1. Можно накладные расходы показать: на выделение и высвобождение памяти, и попутно на пустые циклы. 2. Не хватает функций realloc и memset. 3. Можно сравнить время доступа при работе с памятью, выделенной большими блоками и маленькими.
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Кибибайты были введены относительно недавно, в 1998 году, до этого у программистах не возникало проблем использовать разные приставки "кило" и "мега" в программировании и физике:) А потом им вдруг сложно стало.
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Когда мне особенно грустно, я запускаю ideшку, и прописываю аллокацию какого-то куска памяти...просто так. Сразу после этого чуствуешь, что с си ты творец, ты всемогущ, тебя никто не сможет победить....
@@nickjonas8257 ну ты до строк в си дойдёшь, так же завопишь. Да и вообще питон не для этого делали... (мимо, начал программировать в си и чуть-чуть покодил в питоне)
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@@batfist6595 GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Объявление массива в виде int N; scanf("%d", &N); char A[N]; это фича GCC. Стандарт этого делать не позволяет. Размер массива должен быть вычислен на этапе компиляции.
Не обязательно GCC. Если в компиляторе есть поддержка VLA, то пропустит, нет - матюкнется. А для GCC есть флаг, запрещающий использование подобных массивов (-Werror=vla).
Тимофей, вопрос по 26 минуте: - Всё же указатели можно сравнивать, как я понимаю - просто бессмысленно в свете предполагаемой цели, так как даст некорректные значения? Разве нельзя придумать задачу, по которой нужно сравнивать именно указатели из разных областей памяти - ну, исследует человек пространство памяти, что такого? :)
на 17:55 int *A = (char *)malloc(N * sizeoff(int)) разве тип пойнтера и тип вывода функции malloc не должны совпадать? Разве не должно быть int *A = (int*)malloc(N * sizeoff(int)) ?
6:02, Коллега, ну как можно так ошибаться? Ну конечно в Си указатель void автоматически приводится к заданному типу. Стыдно такое не знать. Обычно этим грешат разработчики на С++
Спасибо за лекцию! Вопрос: после освобождения памяти free(A) мы же не сможем обращаться к массиву? зачем тогда освобождать, если нельзя продолжить работу с массивом?
вопрос. Вы вводили в переменную N громадные значения. должно же быть переполнение по идее? и будет запрос на выделение памяти от отрицательного количества бит. какое вообще поведение будет у malloc? мне не совсем понятно.
@@linterrupt Это если он *_unsigned_*_ int,_ а просто _int_ это на самом деле *_signed_*_ int,_ то есть вмещать может не 0...4,2 млрд, а -2,1...2,1 млрд.
спасибо особо интересно было, я вот тут побаловался и увидел как график постепенно растет если добавить задержу и увеличивать размер массива. #include #include #include int main(void) { int N = 10; printf("Enter size of array to create: "); //scanf("%d", &N); while (1) { int *A = (int*)malloc(N*sizeof(int)); //int *A = (int*)calloc(N, sizeof(int)); 0 if (A == NULL) { printf("OS not gave mamory. Exit... "); exit(1); } for (int i = 0; i < N; i++) { A[i] = i; } printf("Array successefully created! "); N+=10; Sleep(1); //free(A); } printf("\tArrays successefully created! "); system("pause"); return 0; } а если убрать задержку то видно как он резко взлетает как квадратичная функция
Спасибо за лекцию! Подскажите, а в чем существенное отличие, если я объявлю глобальную переменную и изменю ее в функции и передачей адреса переменно для функции? В чем отличие?
скорость, во-первых, во-вторых, функции типа void не могут что-либо менять без указателя, void change_number(int number) { number *= 2; } int main(void) { int x = 666; change_number(x); // ничего не делает return 0; }
А правда ли,что в си++ можно не парится за утечку памяти из кучи?Там всё происходит почти автоматически(библиотека stl).И нет необходимости следить за каждым шагом работы с динамической памятью?
маллос вообще-то по документации, выделяет не память, а адресное пространство... а память может выделять а может и не выделять.. зависит от операционки
Вы правы. Просто меня учили, что это "функция, вычисляемая в момент компиляции", а по первоисточникам я не могу всю терминологию проверять. К счастью, это не меняет сути дела. На будущее учту вашу поправку.
13:00 - уважаемый учитель, раньше верно учили, это сейчас в образовании хаос и бардак. ВНИМАНИЕ! Не путайте людей! Один килобайт - 1(kB) = 1024 (B) Байт, один мегабайт - 1 (MB) = 1024 (kB) = 1048576 (B). А этот ваш кибибайт (kiB): 1 (kiB) = 1000 (B) - просто упрощение для (тупых) масс пользователей которых в школе учили что 1 килограмм = 1000 грамм, 1 (км) = 1000 (м)... , а тут на тебе 1 (kB) = 1024 (B). К тому же это оказалось выгодно продавцам памяти и флеш накопителей, чтобы можно было как с продовольственными товарами продавать пачку сока/молока не 1 литр, а 900 мл, 850 мл... ПО ПРЕЖНЕЙ ЦЕНЕ одного литра. Короче и капиталисты/волки сыты (ненадолго) и тупые овцы/потребители без когнитивных диссонансов. Это я вам тут как опытный программист старой школы написал, не ради критики, а на пользу истинным знаниям.
Дима умный! Дима почти закончил этот курс молодого бойца. Для школьников. Следуюбщий урок для меня последний. Почти!! Что то Дим знал. Что то нет. Я вот к прмиеру не пользуюст ПРИНТФ и СКАНФ у меня СТД ИН и АУТ. И я фанат СВИТЧ! Удобная на самом деле штука. Вот не соглашусь что СВИТЧ это плохо. Вот с с логикой и математикой у меня слабо.. Это сложновато. Еще прикол &*Pointer= Pointer; Да! Массив A+10! Я сам пишу обычно *(A+10). Вот это &A[i] = A+I; Еще я это пишу nullptr а тут типа NULL. Как раз по работе с памятью и искал что то для повтора. А потом искал что то чтобы с начала все.
Слабый препод. Не понимает, что дело не в его компиляторе, а дело в его операционной системе. У него ОС 32 разрядная. Отсюда максимальная память процесса
@@ИльяНовичихин-ы1и не только в отрицании. Прошедшее время уже обозначено вспомогательным глаголом. Но в любом случае перевод не правильный. "OS didn't give" будет пониматься как "ОС не давала".
Под последним Вашим видео отключены комментарии, по этому пишут тут.
Хотел выразить свою поддержку и сказать огромное спасибо за работу.
спасибо за уроки, сначала хотел уточнить одну деталь, но вопрос снялся при просмотре других лекций.
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Благодарю за лекцию + с уважением, Евген.
1. Можно накладные расходы показать: на выделение и высвобождение памяти, и попутно на пустые циклы.
2. Не хватает функций realloc и memset.
3. Можно сравнить время доступа при работе с памятью, выделенной большими блоками и маленькими.
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Я так понял мне даже ОС не даст😢
Проси ПЧЁЛ...
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@xeither289
пнх
ну шо тебе дали?
Только благодаря вам узнал про мебибайты и кибибайты.. Спасибо!
Кибибайты были введены относительно недавно, в 1998 году, до этого у программистах не возникало проблем использовать разные приставки "кило" и "мега" в программировании и физике:) А потом им вдруг сложно стало.
Бред полный
Спасибо вам, Тимофей, из школы 21!
Попал на основу?
Какой город? Случайно не Новосибирск?
@@Utars Казань
Тимофей, благодарю за искусно преподнесённый контент!
Очень наглядно и с примерами.
Эксперименты над железом... Прикольно, что при k
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Все уроки топ! в свое время сильно помогли
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Спасибо за урок, легенда второго номера егэ по информатике😅
Ворнинга на 6:00 нет потому что Си неявно преобразует указатели.
Интересная подача информации👍😃
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Отлично объясняете)
отличный урок😍👍
крутой препод, спасибо!
16Гб ОЗУ ) я думал там ведро с 2Гб и Core2Duo ))нормальная тачка, можно в Unity или Unreal творить ништяки
Когда мне особенно грустно, я запускаю ideшку, и прописываю аллокацию какого-то куска памяти...просто так. Сразу после этого чуствуешь, что с си ты творец, ты всемогущ, тебя никто не сможет победить....
Ты можешь повелевать оперативкой. Своими пальцами, ты прикинь. Ты управляешь информацией так, как тебе угодно. Ты бог оперативки
Питонисты хором скажут: НООООООУ
@@nickjonas8257 ну ты до строк в си дойдёшь, так же завопишь. Да и вообще питон не для этого делали... (мимо, начал программировать в си и чуть-чуть покодил в питоне)
GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
@@batfist6595 GOD JESUS TOLD US TO LOVE GOD AND TO LOVE ONE ANOTHER! LET'S NOT DESTROY THIS WORLD! NO WAR!!! БОГ СОЗДАЛ ТАКОЙ ПРЕКРАСНЫЙ МИР! НЕ БУДЕМ РАЗРУШАТЬ МИР! ПОЛЮБИМ БОГА И ВСЕХ ЛЮДЕЙ! НЕТ ВОЙНЕ!!
Спасибо Тимофей!
10:21 "OS didn't give ..."
"... a flying f*ck". xD
Объявление массива в виде
int N;
scanf("%d", &N);
char A[N];
это фича GCC. Стандарт этого делать не позволяет. Размер массива должен быть вычислен на этапе компиляции.
Не обязательно GCC. Если в компиляторе есть поддержка VLA, то пропустит, нет - матюкнется. А для GCC есть флаг, запрещающий использование подобных массивов (-Werror=vla).
VLA есть в стандарте, так что всё ок)
7:50 память возвращается системе - без функции free()?
Лучший!
Тимофей, вопрос по 26 минуте:
- Всё же указатели можно сравнивать, как я понимаю - просто бессмысленно в свете предполагаемой цели, так как даст некорректные значения?
Разве нельзя придумать задачу, по которой нужно сравнивать именно указатели из разных областей памяти - ну, исследует человек пространство памяти, что такого? :)
Спасибо!
Тимофей, с did используется глагол в форме инфинитива, didn't gAve - неправильно.
в данном случае "неправильно" должно писаться слитно, грамотей 🐒
@@nicholasspezza9449 благодарю за ликбез. Исправил
на 17:55 int *A = (char *)malloc(N * sizeoff(int)) разве тип пойнтера и тип вывода функции malloc не должны совпадать? Разве не должно быть int *A = (int*)malloc(N * sizeoff(int)) ?
Тоже так подумала
подловил
6:02, Коллега, ну как можно так ошибаться? Ну конечно в Си указатель void автоматически приводится к заданному типу. Стыдно такое не знать. Обычно этим грешат разработчики на С++
Спасибо за лекцию! Вопрос: после освобождения памяти free(A) мы же не сможем обращаться к массиву? зачем тогда освобождать, если нельзя продолжить работу с массивом?
чтобы он не занимал память процесса
вопрос. Вы вводили в переменную N громадные значения. должно же быть переполнение по идее? и будет запрос на выделение памяти от отрицательного количества бит. какое вообще поведение будет у malloc? мне не совсем понятно.
Непонятно? так проверь ёпта
@@ТопКекич1996 ок, результаты через час.
@@learpcss9569 понимаю, что не актуально. но int вмешает обычно 4 000 000 000. А он запихивал 2 000 000 000
@@linterrupt Это если он *_unsigned_*_ int,_
а просто _int_ это на самом деле *_signed_*_ int,_ то есть вмещать может не 0...4,2 млрд, а -2,1...2,1 млрд.
А почему в начале видео не используется free( ) для освобождения памяти?
А что насчет realloc'a?
спасибо особо интересно было, я вот тут побаловался и увидел как график постепенно растет если добавить задержу и увеличивать размер массива.
#include
#include
#include
int main(void)
{
int N = 10;
printf("Enter size of array to create: ");
//scanf("%d", &N);
while (1)
{
int *A = (int*)malloc(N*sizeof(int));
//int *A = (int*)calloc(N, sizeof(int)); 0
if (A == NULL)
{
printf("OS not gave mamory. Exit...
"); exit(1);
}
for (int i = 0; i < N; i++)
{
A[i] = i;
}
printf("Array successefully created!
");
N+=10;
Sleep(1);
//free(A);
}
printf("\tArrays successefully created!
");
system("pause"); return 0;
}
а если убрать задержку то видно как он резко взлетает как квадратичная функция
Спасибо за лекцию!
Подскажите, а в чем существенное отличие, если я объявлю глобальную переменную и изменю ее в функции и передачей адреса переменно для функции? В чем отличие?
В реальном мире ты никогда не сможешь заюзать "глобальную" переменную для этого.
скорость, во-первых, во-вторых, функции типа void не могут что-либо менять без указателя,
void change_number(int number)
{
number *= 2;
}
int main(void)
{
int x = 666;
change_number(x); // ничего не делает
return 0;
}
Ну чтоб подождать))
3:17
OS didn't gave memory - неправильно. Правильно didn't give.
а "Array successfully created" не смутило?))
int *A = (char *)malloc(N*sizeof(int)) - я один заметил, что там (char *) лишний🤔
int* должно быть, если правильно понимаю
Норм то, что там где выделяем память, при водим void* к char* и присваиваем переменной int*?
А правда ли,что в си++ можно не парится за утечку памяти из кучи?Там всё происходит почти автоматически(библиотека stl).И нет необходимости следить за каждым шагом работы с динамической памятью?
@ИринаИрина-ш5ы7р
Неправда.
А почему при обьявлении массива ( без маллока) память выделяется в стеке?? Почему не в куче?
От языка зависит , в Java только в heap выделяется , и поэтому программы на яве медленне , а на С/C++ быстрые!
@@NG-gz9ly То есть стек быстрее кучи? То есть, затем нужно объявлять сложные гуи-объекты в стеке? Ради оптимизации? Я познаю дзен
@@batfist6595 Нашел время для коммента
@@NG-gz9ly 2:30 время учиться)
@@batfist6595 Знаешь в ютубе есть чел Winderton , у него плйлист основы программ-ния там все про это говорится
15:36
Она постоянно не даёт, что-то вечно растет и падает, система не выдерживает выдает ошибки, все прям как в жизни)
маллос вообще-то по документации, выделяет не память, а адресное пространство...
а память может выделять а может и не выделять.. зависит от операционки
😎😎😎😎
Зато честно: 0:31 - 0:38
Оп! Не дала! (с) 😅
sizeof - это оператор, а не функция
Вы правы. Просто меня учили, что это "функция, вычисляемая в момент компиляции", а по первоисточникам я не могу всю терминологию проверять. К счастью, это не меняет сути дела.
На будущее учту вашу поправку.
Почему массив A не объявлен, как он работает без объявления
объявлен ведь
игрался с malloc и ставил совершенно безумные цифры. Память на удивление выделялась, но как и почему?
Какие цифры?
ОС может отказать и без ошибки , понять или выделила можно через оператор выбора
В какой то момент моя память просто не захотела отказываться, и продолжила выделять
Просящему даётся, с операционной системой как с женщиной
да, в чём-то они похожи..
13:00 - уважаемый учитель, раньше верно учили, это сейчас в образовании хаос и бардак. ВНИМАНИЕ! Не путайте людей! Один килобайт - 1(kB) = 1024 (B) Байт, один мегабайт - 1 (MB) = 1024 (kB) = 1048576 (B). А этот ваш кибибайт (kiB): 1 (kiB) = 1000 (B) - просто упрощение для (тупых) масс пользователей которых в школе учили что 1 килограмм = 1000 грамм, 1 (км) = 1000 (м)... , а тут на тебе 1 (kB) = 1024 (B). К тому же это оказалось выгодно продавцам памяти и флеш накопителей, чтобы можно было как с продовольственными товарами продавать пачку сока/молока не 1 литр, а 900 мл, 850 мл... ПО ПРЕЖНЕЙ ЦЕНЕ одного литра. Короче и капиталисты/волки сыты (ненадолго) и тупые овцы/потребители без когнитивных диссонансов. Это я вам тут как опытный программист старой школы написал, не ради критики, а на пользу истинным знаниям.
Тоже так думал, пока на Википедию не залез. Видимо зависит от того, какой стандарт дает определение для килобайта и кибибайта.
3 дня Тимофей комп не выключал к моменту записи видео. 🧐
Настоящее горе, это не когда девушка не дает.
Настоящее горе, это когда ОC не дает
врёте, когда я учился в школе такой, киби чуши, не было. вики говорит, что эту дурь придумали в 1999. а до этого 40 лет, все и так понимали друг друга
Более того, до сих пор понимают.
Дима умный! Дима почти закончил этот курс молодого бойца. Для школьников. Следуюбщий урок для меня последний. Почти!! Что то Дим знал. Что то нет. Я вот к прмиеру не пользуюст ПРИНТФ и СКАНФ у меня СТД ИН и АУТ. И я фанат СВИТЧ! Удобная на самом деле штука. Вот не соглашусь что СВИТЧ это плохо. Вот с с логикой и математикой у меня слабо.. Это сложновато. Еще прикол &*Pointer= Pointer; Да! Массив A+10! Я сам пишу обычно *(A+10). Вот это &A[i] = A+I; Еще я это пишу nullptr а тут типа NULL.
Как раз по работе с памятью и искал что то для повтора. А потом искал что то чтобы с начала все.
У меня жена как операционная система . Тоже имеет полные права и может отказать
Как я сюда попал? 😳
Помогите.
Мне моя операционка 3Гиб не дала, но я не расстроился, потому-что дала подружка...
Не на линуксе, случайно сидишь?
@Innokentijs Dostovālovs так не бывает. Ты попробуй заполнить при этом выделенную память. Калоком например выдели
@juvusart
На самом деле тебе дала только твоя левая потная ручонка.
@alienhazzard7201 бро, что правда, то правда! Но я представлял подружку.
Как программист знакомится с девушкой?)
Пусть сами знакомятся!
Никак
Слабый препод. Не понимает, что дело не в его компиляторе, а дело в его операционной системе. У него ОС 32 разрядная. Отсюда максимальная память процесса
Там должно быть "OS didn't give", а не "gave")
Gave - прошедшее время, не? ОС же не постоянно не дает память для этой программы, а типа один раз в прошлом.
@@batfist6595 В отрицании в past simple глагол надо использовать в первой форме.
@@ИльяНовичихин-ы1и Ооо, спасибо, не знал
@@ИльяНовичихин-ы1и не только в отрицании. Прошедшее время уже обозначено вспомогательным глаголом. Но в любом случае перевод не правильный. "OS didn't give" будет пониматься как "ОС не давала".
Didn’t give, а не didn’t gave)))
вы неадекватны.
Противно слушать голос