я 7 часов искал причину вылета, оказалось что забыл поставить звезду во втором инте при объявление двумерного динамического массива, у тебя +1 подписчик теперь)
СПАСИБО Вам Тимофей за все курсы, каждый урок бесценен, иногда смотрел по 2-3 раза просто для кайфа и укладки, еще хочу сказать спасибо Вам за уроки в Фоксфорде. Вы настоящий джедай. (надеюсь когда-нибудь с вами встречусь)
Благодарю за лекцию. Очень жалко, что все так быстро закончилось. Динамический двумерный массив как-то тяжело прошел. Как-нибудь под настроение, пожалуйста, сделайте продолжение.
Поздравления! Дима праздник! У Димы праздник! Я все закончил с этим!! Праздник! Как раз майские праздники! Да, многомерный массив- штука крайне хитрая.... ЗВерята радуются! Цыпленок радуется! Утенок радуется! Дима радуется! кролик радуется! Совенок радуется!!🐤🦉🦆🐸🐧🐦
Новомодный способ одного маллока не работает. Тимофей Фёдорович, будем признательны, если разберёте его более подробно с выводом на экран элементов и назначением отдельных элементов.
Не получилось с помощью кода из видео указателем пройти по динамическому массиву. Сначала все хорошо: проходит массив А[0] и выводит 1, 2, 3, 4, 5 в нашем случае. А дальше шагает физически по памяти до самого конца или до последнего элемента массива A[3], как получится :) Повозившись с кодом проблему так же решить не смог. Как тут быть и правильно гулять по элементам массива с помощью поинтеров?
@@catastrophic3709 В начале выделенной памяти у нас будут лежать адреса, по которым будут лежать уже сами значения элементов массива (полезные данные), которые, в свою очередь, будут идти сразу после всех этих адресов, поэтому переменная "start" как раз-таки указывает на смещение начала непосредственных значений массива (полезных данных). Далее в цикле распределяем адреса значений для каждого из элементов массива, то есть инициализируем самое начало выделенной памяти.
@@7qim То есть, правил но ли я понял, мы сперва выделяем пямять под массив указателей и элементы массива, далее в переменной "start", мы смещаемся с массива указателей на начальные элементы массива и в цикле мы даём адресс самим элементам?
Вот что непонятно, зачем нам создавать отличные структуры при работе с статическим и динамическим, почему бы просто не создать в динамической памяти аналог статического двумерного массива? без лишнего набора ссылок? Вся эта канитель, с динамическим массивом, нужна чтоб удобным способом [ ][ ] получать доступ к данным, и код читаемым был. Но для этого нам нужно сделать неудобную реализацию и лишнюю память использовать на указатели. Что и скорость снизит. Так же хотелось бы узнать как не ровный двумерный массив реализуется, где подмассивы разного размера.
Могу предположить, что раз вы с каждой итерацией увеличиваете переменную P, то цикл так-то будет бесконечным, ибо P в условии вашем тоже меняется с каждой итерацией.
А как вам такой вариант? #include #include void print_array2(int *arr, int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) printf("%5d", *(arr + i * col + j)); printf(" "); } } int main() { int m[3][5] = {0}; print_array2(&m[0][0], 3, 5); return 0; } Идея в том, что мы просто передаём в функцию адрес первого элемента массива, а дальше всё вычисляем с помощью адресной арифметики. При этом функция получается универсальной, нет никаких дефайнов или страшных двойных указателей.
@@MrMikhailDJ нее этот дядька объясняет как надо ) когда я учился процесс объяснения был примерно такой "нет времени объяснять дойдём до лаб научитесь"дошли до лаб "вот лабы индивидуальные чтоб не списывали, вон гугл - вперёд" :)
Юрий Колесник хз у меня в унике этому вопросу уделалась 1 лекция и 1 семинар. Я считаю что 90 минут теории и 90 минут практики достаточно, чтобы понять. Ну и плюс лаба на которой уже точно всё уясниться
@@MrMikhailDJ Везет вам, у нас вообще дают на практике задания на подобии: "Спросить у пользователя число N. Сгенерировать динамический массив размером NхN, заполненный целыми числами подряд.Вычислить сумму элементов (ромбом)." И уходят, ни лекции, ни нормальной практики, как учится... ? Они видимо думают, что мы за первый семестр выучили СИ, но мы проскакали все очень быстро, по 2 темы за пару проходили...
@@7qim только, наверное, последние скобки лишние: надо int *start = (int *)A + N; - вот тогда мы отшагнем N раз по размеру (int *). А в варианте int * start = (int *)(A + N); - мы сначала отшагнем N раз по размеру (int **) - это изначальный тип A, а потом уже итог приведем к (int *). Хотя, возможно, размер (int **) и (int *) гаранитровано одинаковые - этот момент я не знаю...
Сделал чтобы были 4 строки и 5 колонок: void static_array_print2(int A[ ][MATRIX_WIDTH]) { for (int* p = (int*)A, i = 0; p < (int*)A + N; p++, i++) { for (int j = 0; j < MATRIX_WIDTH; j++) printf("%3d", *(p + i * N + j)); printf(" "); } }
нашел другой пример создания двумерного массива: int *a; // указатель на массив a = (int*)malloc(n*m * sizeof(int)); // n-колличесвто строк, m-столбцов free(a);
Так это по сути своей одномерный массив, который состоит не из N элементов, а N*M. Для двумерности нужно тогда создать ещё массив указателей, и присоединять каждый указатель после N-го элемента, тогда да - это можно будет назвать двумерным массивом.
// Очистка памяти for (i = 0; i < n; i++) // цикл по строкам free(a[i]); // Освобождение памяти для строк матрицы free(a); // Освобождение памяти для массива указателей
Зачем вообще нужно развивать тему многомерных динамических массивов?Без них можно обойтись если учесть тот факт,что современные компьютеры такие скоросные и мощные,что памяти сполна хватит без экономии(ведь ради этого именно в древние времена развивали эту тему)?
"в него положу собственно... амммм. приведеннный к чар звездочка начало А с отшагнутым.. я приведу в конце концов к инт звездочка указатель, но в скобках у меня будет приведенный к чар звездочка самого А "..... учитель хороший конечно, но что бы понять надо весь плейлист с самого начала смотреть. иначе кукухой можно поехать
Спасибо огромное, ученики школы 21 зимнего бассейна 2022 года благодарны вам!
Ученики школы 21 снова передают вам привет и огромное спасибо
Спасибо Вам большое, ученики школы 21 осеннего бассейна 2023!
Спасибо вам большое от учеников школы 21 (14/02/2022)
я 7 часов искал причину вылета, оказалось что забыл поставить звезду во втором инте при объявление двумерного динамического массива, у тебя +1 подписчик теперь)
Спасибо большое от дядьки 36 лет =) Просто бог объяснения ^^
СПАСИБО Вам Тимофей за все курсы, каждый урок бесценен, иногда смотрел по 2-3 раза просто для кайфа и укладки, еще хочу сказать спасибо Вам за уроки в Фоксфорде. Вы настоящий джедай. (надеюсь когда-нибудь с вами встречусь)
Огромное человеческое спасибо за столь прекрасные уроки
ученики школы 21 вам благодарны
На месте😎
Заха
Отдыхаем
однозначно!
ахренеть как доходчиво оба метода будут полезными! огромное спасибо!!!!!!!!!
Спасибо! School 21
21/09/22 - sheritsh
Сразу вижу хороший человек. От души говорит.
Благодарю за лекцию. Очень жалко, что все так быстро закончилось. Динамический двумерный массив как-то тяжело прошел. Как-нибудь под настроение, пожалуйста, сделайте продолжение.
Спасибо большое, ученики школы 21 летнего бассейна 2024 года благодарны вам!!!
Поздравления! Дима праздник! У Димы праздник! Я все закончил с этим!! Праздник! Как раз майские праздники! Да, многомерный массив- штука крайне хитрая.... ЗВерята радуются! Цыпленок радуется! Утенок радуется! Дима радуется! кролик радуется! Совенок радуется!!🐤🦉🦆🐸🐧🐦
Вся школа 21 ликует. Спасибо!
Новомодный способ одного маллока не работает. Тимофей Фёдорович, будем признательны, если разберёте его более подробно с выводом на экран элементов и назначением отдельных элементов.
Спасибо вам от учеников школы 21!!!!
привет от августовского (2023 г) интенсива школы 21! Peer to peer
привет и спасибо от учеников школы 21!:)
И снова школа 21 передает спасибо ❤❤❤
и от весеннего бассейна 2024 :)
Не получилось с помощью кода из видео указателем пройти по динамическому массиву. Сначала все хорошо: проходит массив А[0] и выводит 1, 2, 3, 4, 5 в нашем случае. А дальше шагает физически по памяти до самого конца или до последнего элемента массива A[3], как получится :)
Повозившись с кодом проблему так же решить не смог. Как тут быть и правильно гулять по элементам массива с помощью поинтеров?
Большущее спасибо, тяжело понять материал, пришлось Ваш код взять
будущим бассейнистам шк 21 привет :))
И вам не болеть!
Спасибо за инфу. Очень помогло
Ученики благодарны вам с августовского бассейна
И снова ученики школы 21 говорят спасибо 😊
13:50
Надо было смелее и дальше упрощать до _"A + N"_ вместо _"(char *)A + N * sizeof(int *)"_
интересно, с double это сработает? А то чето сега вылетает, не по глазам где ошибка закралась
Достопочтенный, объясните пожалуйста, для чего мы это пишем, типо память мы выделили, а вот это и последующие для чего?
@@catastrophic3709 В начале выделенной памяти у нас будут лежать адреса, по которым будут лежать уже сами значения элементов массива (полезные данные), которые, в свою очередь, будут идти сразу после всех этих адресов, поэтому переменная "start" как раз-таки указывает на смещение начала непосредственных значений массива (полезных данных). Далее в цикле распределяем адреса значений для каждого из элементов массива, то есть инициализируем самое начало выделенной памяти.
@@7qim То есть, правил но ли я понял, мы сперва выделяем пямять под массив указателей и элементы массива, далее в переменной "start", мы смещаемся с массива указателей на начальные элементы массива и в цикле мы даём адресс самим элементам?
@@catastrophic3709 Да.
Привет от детей школы 21
Спасибо большое
Вот что непонятно, зачем нам создавать отличные структуры при работе с статическим и динамическим, почему бы просто не создать в динамической памяти аналог статического двумерного массива? без лишнего набора ссылок? Вся эта канитель, с динамическим массивом, нужна чтоб удобным способом [ ][ ] получать доступ к данным, и код читаемым был. Но для этого нам нужно сделать неудобную реализацию и лишнюю память использовать на указатели. Что и скорость снизит. Так же хотелось бы узнать как не ровный двумерный массив реализуется, где подмассивы разного размера.
Почему нельзя писать в условии цикла p < p + 20 ? это вызывает ошибку при выполнение.
Могу предположить, что раз вы с каждой итерацией увеличиваете переменную P, то цикл так-то будет бесконечным, ибо P в условии вашем тоже меняется с каждой итерацией.
@@АлександрБеспалов-н2п да, это так
Меньше писанины и лучшее распределение памяти - это по мне )
А как вам такой вариант?
#include
#include
void print_array2(int *arr, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
printf("%5d", *(arr + i * col + j));
printf("
");
}
}
int main()
{
int m[3][5] = {0};
print_array2(&m[0][0], 3, 5);
return 0;
}
Идея в том, что мы просто передаём в функцию адрес первого элемента массива, а дальше всё вычисляем с помощью адресной арифметики. При этом функция получается универсальной, нет никаких дефайнов или страшных двойных указателей.
А если размеры вводит пользователь?
Thanks from 42 Amsterdam
Спасибо!
Ужас как сложно, придется не один раз пересматривать, чтоб уловить суть.
всё проще на практике, просто объясняют херово
@@MrMikhailDJ нее этот дядька объясняет как надо ) когда я учился процесс объяснения был примерно такой "нет времени объяснять дойдём до лаб научитесь"дошли до лаб "вот лабы индивидуальные чтоб не списывали, вон гугл - вперёд" :)
Юрий Колесник хз у меня в унике этому вопросу уделалась 1 лекция и 1 семинар. Я считаю что 90 минут теории и 90 минут практики достаточно, чтобы понять. Ну и плюс лаба на которой уже точно всё уясниться
@@MrMikhailDJ Везет вам, у нас вообще дают на практике задания на подобии: "Спросить у пользователя число N. Сгенерировать динамический массив размером NхN, заполненный целыми числами подряд.Вычислить сумму элементов (ромбом)." И уходят, ни лекции, ни нормальной практики, как учится... ? Они видимо думают, что мы за первый семестр выучили СИ, но мы проскакали все очень быстро, по 2 темы за пару проходили...
@@НатальяАлфёрова-и6т ну это смотря какой универ. Я учусь в мгту им баумана на РК6, там сапр и очень много проги. Поэтому и уровень такой
почему не int * start = (int *)A + N * sizeof(int *)? для чего нужно (char *)?
Чтобы шагать побайтово, а не по 4 байта (это размер int).
В действительности можно и нужно это всё упростить до:
_int * start = (int *)(A + N);_
@@7qim только, наверное, последние скобки лишние:
надо int *start = (int *)A + N; - вот тогда мы отшагнем N раз по размеру (int *).
А в варианте int * start = (int *)(A + N); - мы сначала отшагнем N раз по размеру (int **) - это изначальный тип A, а потом уже итог приведем к (int *).
Хотя, возможно, размер (int **) и (int *) гаранитровано одинаковые - этот момент я не знаю...
Очень интересно, но ничего не понятно.
спасибо!
Сделал чтобы были 4 строки и 5 колонок:
void static_array_print2(int A[ ][MATRIX_WIDTH]) {
for (int* p = (int*)A, i = 0; p < (int*)A + N; p++, i++) {
for (int j = 0; j < MATRIX_WIDTH; j++)
printf("%3d", *(p + i * N + j));
printf("
");
}
}
нашел другой пример создания двумерного массива:
int *a; // указатель на массив
a = (int*)malloc(n*m * sizeof(int)); // n-колличесвто строк, m-столбцов
free(a);
ты не так освобождаешь память
Так это по сути своей одномерный массив, который состоит не из N элементов, а N*M. Для двумерности нужно тогда создать ещё массив указателей, и присоединять каждый указатель после N-го элемента, тогда да - это можно будет назвать двумерным массивом.
// Очистка памяти
for (i = 0; i < n; i++) // цикл по строкам
free(a[i]); // Освобождение памяти для строк матрицы
free(a); // Освобождение памяти для массива указателей
@@ZStanislav нет, поскольку a это одномерный динамисеский массив интов а не указателей, освобождение памяти: free(a);
школа 21 летний бассейн 2023 всем привет
ошибка на титульном листе урока. название следующего видео
интересно, Джон Кармак знал про этот читерский способ во времена разработки игрового движка? )
он на нем написан
июнь-июль школа 21)
Жаль нельзя второй лайк поставить
Зачем вообще нужно развивать тему многомерных динамических массивов?Без них можно обойтись если учесть тот факт,что современные компьютеры такие скоросные и мощные,что памяти сполна хватит без экономии(ведь ради этого именно в древние времена развивали эту тему)?
статичские массивы на стеке выделяются, а там много не выделишь ) а динамикой в куче
"в него положу собственно... амммм. приведеннный к чар звездочка начало А с отшагнутым.. я приведу в конце концов к инт звездочка указатель, но в скобках у меня будет приведенный к чар звездочка самого А "..... учитель хороший конечно, но что бы понять надо весь плейлист с самого начала смотреть. иначе кукухой можно поехать
из контекста всего урока вырывать нельзя (в плейлисте 5 уроков, которые разделены на 30+ видео)
сложно ❤
School 21!
всю серию ждал, когда ты вызовешь calloc (именно С), но чуда не произошло, увы
Малока
Зато в питоне ты такой просто [][]