Спасибо большое за уроки! Это огромнейший труд, тут не поспоришь. Качество подачи материала очень высокое. Именно Ваши уроки помогают расставить по местам многие вещи в голове.
давным давно, листая пикабу, наткнулся на пост с вашими уроками и добавил в закладки. наконец-то нашел время. осилил за пару дней. считаю чудом, что смог заинтересоваться программированием в принципе. пару лет назад посмотрел "интересный" урок по конструктору игр "GameMaker" и понеслось. на первых порах долго не мог понять, что такое аргументы и как они работают. вроде читаешь русскую справку, перечитываешь, как не объясняй - понять ни черта не можешь. "АРГУМЕНТ" и все, или - функция "ВОЗВРАЩАЕТ" - куда\что\зачем возвращает????? в итоге додумался до всего сам, когда уже забросил это дело. если бы мне кто тогда популярно объяснил и повторил "repeat(100500)" раз одно и тоже... цены б ему не было. так что, спасибо вам! некоторым это очень необходимо.
Спасибо за видео. Мы тебя тоже любим )) Отдельное спасибо, что не холтуришь и не пытаешься по меньше объяснить лишь бы быстрей. От начала до конца, все разжевываешь. И не слушай тех, кто говорит: че ты так долго говоришь и объясняешь. Так говорят холтурщики, которым влом самим объяснять, а лишь быстро быстро показывают, ну типо запомнишь. Есть такие горе учителя.
Кстати у кого в Windows не работает %zu , используйте %i. Должно заработать. Еще кстати у меня при использовании %p 0x у меня не выводится, а выводится следующее: [*] Array addressess: 0: 0028FF24 1: 0028FF28 2: 0028FF2C 3: 0028FF30 Байт код когда открыл 2588 строк компилятор сделал, не как на видео 500 с чем-то. Видимо компилятор на линуксе более экономично работает. Адреса еще при повторном запуске программы вообще не меняются в Windows. Ну вот такие особенности работы программы на Windows 7 заметил. Интересно получилось) Спасибо большое за урок! Очень ценные знания)
Привет. Почему данная функция "ShowArraySize" не выводит на экран правильный размер массива в байтах? И как это было бы правильно реализовать ? #include void ShowArraySize(int array[]) { size_t a = sizeof array; printf("%zu ", a); printf("%zu ", sizeof array); } int main(void) { int price[4] = {10, 20, 30, 40}; ShowArraySize(price); printf("%zu ", sizeof price); return 0; }
36:13 при компиляции с флагом -pedantic компилятор ругается :format ‘%p’ expects argument of type ‘void *’, but argument 3 has type ‘float *’ Это нормально?
@@nightwitch698 Он говорит, что тип указателя не совпадает. Можно сделать cast: (void *)pointerName в месте его использования, короче говоря при выводе добавить скобки (void *) перед именем указателя.
Вопрос по поводу синтаксического сахара: Вы утверждаете, что запись типа array[10] будет работать медленнее чем *(array + 10). Я так понимаю приведение записи array[10] к *(array + 10) происходит на этапе компиляции, а не во время выполнения, и если так, то по скорости работы они должны быть абсолютно одинаковы.
Ген, ты нереально крут, сегодня удивил препода записью *(array + 1) Спасибо тебе большое, но на самом деле, очень много повторяешь информацию, чтобы дошла до всех, я согласен, это нормально, но все же поменьше повторений))
Основная проблема всех курсов по программированию -- отсутствие _творческих_ задач, которые бы заставляли искать решение самому. Ну или полная оторванность задач от реальности. Си, в сумме своей, изучают для микроконтроллеров и реализация задач, оторванных от инициализации и использования переферии (кольцевые буферы, обработка массивов/строк/произвольного структурированного объема данных, простейшие модели с возможностью реакции на входное воздействие, конечные автоматы) дали бы значительное ускорение обучению не языку как таковому, а его использованию. А если сможете показать, детально, с кучей шагов от планирования до реализации, написание, например, того же драйвера под линукс - вот это РЕАЛЬНО будет снос башки, ибо такой материал есть только на ангельском.
на 23 минуте вы расcказываете про размер float я всё это делал на Windows size_t floatSize = sizeof(float); printf(" Float Size: %zu butes ", floatSize); и в командной строке мне выдало Float Size: zu butes
Есть такой вопрос. Если пример из урока компилирую и запускаю на Linux то выводится адреса в 16 - ричном формате как и у автора и адреса меняются при перезапуске. Если то же делать под Windows то получается вот так: [*] Array Access: 0: 0028ff24 1: 0028ff28 2: 0028ff2c 3: 0028ff30 [*] Array Access: 0: 0028ff24 1: 0028ff28 2: 0028ff2c 3: 0028ff30 При этом адреса остаются те же при перезапуске программы. Пробовал добавлять вначале 0х и %X но это просто меняет вид записи, а статичность адресов при перезапуске так и остаётся. В чём тут разница? Компилирую с добавлением -std=c99 -Wall Спасибо.
Суть 40ка минут видео: Адресация в массиве бывает YourArray[0], а бывает *(YourArray+0). Передача массива в функцию YourFuncion(YourArray[ ]) Указатель на элемент получают знаком амперсанда &YourArray[0]
Забегая немного в перёд, я так понимаю, что более сложные программы построены на принципе вложения тела программы в бесконечный цикл. Команды ввода-вывода отрабатываются через прерывания и выход из программы - это завершение бесконечного цикла и возврат функцией мейн нуля. Я прав или нет?
printf ("%10.2f ", *(prices + 0)); - почему вот так выводит значение находящееся по адресу, но если так же пытаться вывести адрес: printf ("%10.2f ", &(prices + 0)); то выводит ошибку. Но зато вот так выводит: printf ("0x%10.2x ", &prices[0]); Еще получается так что если выводя адресс вместо %x написать %f , то выводит не адрес, а значение по адресу...это конечно не столь важно, но любопытно же
Не понимаю, а как компилятор понимает, что + 1 это сдвиг на 4 байта? prices возвращает адрес в нулевого элемента в шестнадцатеричной системе и прибавляет к этому адресу 1, но след. элемент находится на +4 байта. Каким образом мы переходим к след. элементу? Ведь не никаких особых подсказок для компилятора, что в контексте этой задачи, нам нужен сдвиг на один размер значения флоат.
Гена , не знаю ответишь ты или нет) но все равно попытаюсь. Я дошла до моменты вывода адреса массива ( пишу в Windows), и у меня компилятор выводит вот в таком виде 0: 0061FF04 1: 0061FF08 2: 0061FF0C 3: 0061FF10 я несколько раз выводила и всегда выходят одни и те же цифры , и концовка не такая как у тебя. Почему так? интересно
Привет Геннадий, прошу отнестись к моему вопросу адекватно. Будет ли видео о вводе информации на экран, если да, то когда(приблизительно)? Заранее спасибо!
Продолжил компилировать на windows7. При значении в исходном %zu выводилось в работе проги: "zu". Заменил на %u - стало выводиться правильное число в байтах: "4" (для float). С99, компилятор тот же. От чего это зависит? Заранее благодарен за ответ!
Привет! Если ввести size_t PricesSize = sizeof (prices); printf(" Prices Size: %zu bytes ", sizeof (PricesSize)); то выдает 8 байт вместо 16-ти, а если убрать sizeof из строки вывода, то ставит 16 байт. Почему так, объяснишь?
Вопрос может немного не по теме, но хотелось бы получить ответ. Когда данные вводятся с какого - либо устройства, то они ведь тоже работают через оперативную память и каждому устройству выделяются ячейки памяти? Если это так, то где можно найти имена ячеек памяти,которые выделяются устройству и можно ли декодировать информацию, записанную на них?
Почему программа будет работать медленно если указывать адрес массива в квадратных скобках а не в круглых со звездочкой, ведь по идее компилятор этот "синтаксический сахар" убирает, непонятен этот момент. Аналогично с декларированием глобальных переменных, тоже непонятно почему медленно будет работать и вообще, если медленней то насколько?
Медленне не будет, это компилируемый код, я просто работал на момент записи с интерпретируемыми языками и почему-то решил сказать об этом. А в целом, когда мы имеем дело с "синтаксическим сахаром" , то мы имеем дело с конверсией к исходному виду кода, который могли бы использовать напрямую. Но это не всегда медленнее. А по поводу скоростей, нужно замерять.
Почему в принципе адресация через квадратные скобки должна работать медленнее чем адресация через указатель? Если одно приравнивается к другому на этапе компиляции, то на скорость это не должно влиять
Относительно Lesson16/exercise + Есть функция, которая принимает два массива на вход, и выводит данные в виде таблицы. - Написать функцию, которая принимает два массива на вход, и выводит отсортированную таблицу городов в порядке убывания населения. Тут проблема Население отсортировать в масиве не проблема. Не получается привязать города . ... Помогите Gena ANTG !!!
Привязку надо делать по индексу ) Во время прохода элменеты массивы с населением меняют свое положение в массиве и изменяют свой порядковый индекс. То есть, массив городов уже не нужно сортировать, соритурем какой-нибудь один массив, запоминаем индексы, тут нужно подумать как это оформить, подсказу я вам дал )
Добрый вечер Гена! Во первых огромное спасибо за урок! Есть вопрос по поводу кода. Пишу на windows. Через маркер %zu не выводятся данные о байтах, а вот через маркер %i да. Можешь объяснить пожалуйста почему так?
Приветствую! У тебя скорее всего 4ая версия gcc, по-умолчанию он использует стандарт c89, а %zu из c99. При компиляции просто добавь флаг --std=c99 и всегда компилируй с этим флагом.
Привет, у меня такой вопрос. маркер %zu в командной сторке отображается "Float size zu bytes" и все остальные типы также. Вместо маркера %zu я поставил %u, И все нормально выводит. У меня Виндовс 7 64 бит. gcc 4.9.3. Подскажи в чем проблема скрывается.
спасибо огромное за ответ и вот что у меня получилось neme-std=c99.exe или neme.exe итак итак хотя все добавилось ( neme-std=c99.exe) не является внутренней или внешней командой исполняемой командой или пакетным файлом
я уже 3 раза пересмотрл масивьі но не слова там не нашшол от том как создать Массив с именами городов. ето в твоих упражнениях я искал ето в интернете и нечего толкового не нашел подскажи как ето сделать?????я нашол только как ето сделать если есть один город но не 9 штук char city[] = {"New-York", "London" "Minsk", "Kuiv", "Warsaw", "Berlin", "Tokio", "Honk-Kong", "Moscow"}; и как нужно здавать printf в таком случае...Подскажи пожалуйста???
Ты написал массив с 9 городами, но так как строка это массив символов, у нас получается массив из строк (массив из массивов), тебе нужно добавить еще одну пару скобок в имени city: char city[][20] = { ... }, где 20 - это максимальная длина строки для названия города. Кстати, на начальном этапе все таки лучше писать кол-во элементов в массиве: char city[9][20] = { ... };
флаг это дополнительный параметр после имени программы, обычно выглядит так: --flag, -f Добавить нужно -std=c99 при компиляции: gcc name.c -o name -std=c99
Привет! В последней части урока при выводе адреса массива постоянно вылетает ошибка: error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘float *’ [-Werror=format=] printf("0: %p ", &array[0]); Погуглил - нашел такое решение с заменой аргумента с float на void. Заработало. Но верно ли оно?: void showArrayAddresses(float array[]) { printf(" [*] Array Addresses: "); printf("0: %p ", (void*)&array[0]); printf("1: %p ", (void*)&array[1]); printf("2: %p ", (void*)&array[2]); printf("3: %p ", (void*)&array[3]); return;
@@mikhailchunaev1138 Выйдет на следующей неделе. Будет очень много видео) Сейчас идет предзаказ, можете купить по сниженной цене, после выхода цена будет 9999 руб.
Вот именно, что надо читать книги. У Гриффитсов хорошо по этому поводу написано. Во-первых, переменная массива не может указывать ни на что другое (под само имя память не выделяется, в отличии от указателя). Во-вторых адрес массива, это адрес массива (&array == array), что для указателей не так (&pointer != pointer). В-третьих, sizeof(array) - размер массива в байтах, а вот sizeof(pointer) - размер указателя. Но всё равно ваши видео хороши для начинающих =)
Евгений Архипов Запись вида: &array == array это по-вашему что?)) Вы берете адрес и сравниваете его с именем массива. Это и есть указатель(имя массива равно его адресу, в вашем же примере). А те различия, что вы назвали, относятся к ТИПу. Тип указатель и тип массив - разные типы. Но механика в массивах реализована на указателях. Это не противоречит природе массива, так как любая структура в Си имеет адрес, а значит с ней можно работать через указатель. Ну а за благодарность, отдельное спасибо!))
Указатель, это переменная, для хранения адреса. Имя массива, это НЕ указатель. Под указатель выделяется память, под имя массива память не выделяется. Вы в видео утверждаете, что имя массива, это указатель, что не верно.
Евгений Архипов Причем здесь память? Дело в адресе ) Имя массива указывает на адрес его первого элемента. Имя указателя указывает тоже на адрес того, на что мы ссылаемся. А уже как компилятор выделяет память под эти типы - это его дело. Я могу создать массив, могу создать указатель на его первый элемент / могу на имя(это одно и то же), у них будут одинаковые адреса, это говорит о чем? Это говорит о том, что они указывают / ссылаются на один и тот же адрес. Плюс к этому, я могу работать с массивом с помощью указателей, и вообще не работать через квадратные скобки. Имя функции, имя массива - это указатели.
Lesson 16 #include #define n 9 #define SIZE 9 char * cities[]={"Moscow","New-York","London","Minsk", "Kiev","Warsaw","Berlin","Tokio","Hong-Kong"}; int peoples [SIZE]={11503000,8406000,8674000,1893000, 2804000,1711000,3502000,13610000,7188000}; int *pmaxp[n], *pmaxc[n]; //функция обмена адресами void obmen (int *a[n], int i, int j) { int *tmp; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } void main(void) { int i,j for(i=0; i
Не сразу поняла, что ф-я ArrayAdressess явл-ся общей и не могла провести связь с массивом prices. Пересмотрев дошло. Но остался один вопрос по поводу вывода адресов в 16-й системе. У меня почему-то нулевой элемент оканчивается на буковку "с"-то есть на 12, это нормально? 0: 0xbfcbf17c 1: 0xbfcbf180 2: 0xbfcbf184 3: 0xbfcbf188
Присылайте свои решения задач, рассмотрим их в видео. Покажу, как можно улучшить код. А так, Антон, ты молодец!)) Будет больше решений рассмотрим их в видео.
🚀 Подписывайся на мой канал в Telegram: @antg_official
🚀 И заходи на сайт: antg.pro!
Гена, за количество повторов - тебе премия Оскар положена!!!
Красава))) С такими повторами зритель запомнит по-любэ все тонкости)
Спасибо)) тронут))
Спасибо большое за уроки! Это огромнейший труд, тут не поспоришь. Качество подачи материала очень высокое. Именно Ваши уроки помогают расставить по местам многие вещи в голове.
И Вам спасибо!)
давным давно, листая пикабу, наткнулся на пост с вашими уроками и добавил в закладки. наконец-то нашел время. осилил за пару дней. считаю чудом, что смог заинтересоваться программированием в принципе. пару лет назад посмотрел "интересный" урок по конструктору игр "GameMaker" и понеслось. на первых порах долго не мог понять, что такое аргументы и как они работают. вроде читаешь русскую справку, перечитываешь, как не объясняй - понять ни черта не можешь. "АРГУМЕНТ" и все, или - функция "ВОЗВРАЩАЕТ" - куда\что\зачем возвращает????? в итоге додумался до всего сам, когда уже забросил это дело. если бы мне кто тогда популярно объяснил и повторил "repeat(100500)" раз одно и тоже... цены б ему не было. так что, спасибо вам! некоторым это очень необходимо.
Спасибо!)) сейчас наполню канал ))
Спасибо за видео. Мы тебя тоже любим ))
Отдельное спасибо, что не холтуришь и не пытаешься по меньше объяснить лишь бы быстрей.
От начала до конца, все разжевываешь.
И не слушай тех, кто говорит: че ты так долго говоришь и объясняешь.
Так говорят холтурщики, которым влом самим объяснять, а лишь быстро быстро показывают, ну типо запомнишь. Есть такие горе учителя.
Спасибо! ))
))
Ставлю палец вверх только за то что вышло новое видео.
Хорошо рассказывает, Много моментов узких раскрыто и как ты это делаешь )) класс! В преподаватели идти или же консультировать за отдельные деньги !
Кстати у кого в Windows не работает %zu , используйте %i. Должно заработать.
Еще кстати у меня при использовании %p 0x у меня не выводится, а выводится следующее:
[*] Array addressess:
0: 0028FF24
1: 0028FF28
2: 0028FF2C
3: 0028FF30
Байт код когда открыл 2588 строк компилятор сделал, не как на видео 500 с чем-то. Видимо компилятор на линуксе более экономично работает.
Адреса еще при повторном запуске программы вообще не меняются в Windows.
Ну вот такие особенности работы программы на Windows 7 заметил. Интересно получилось)
Спасибо большое за урок! Очень ценные знания)
KRASAVCHIK, PRODOLZHAI!!!!!!
SPASIBO TEBE ZA OPEN SOURCES!!!
согласен с высказавшимися ранее. Закулисье очень важно для понимания и знания способов написания кода
Мы еще живы и ждём. Геныч не забивай пожалуйста.
Гена здравствуйте, очень классный курс и Вы прекрасно все излагаете, пожалуйста дайте ссылку на урок 16 часть первая не могу найти его. Спасибо
Здравствуйте, Роман! Спасибо за отзыв, очень приятно! Вот эта часть: th-cam.com/video/GaEeZ5F_KiI/w-d-xo.html
@@ANTGPRO спасибо
наконец то нормальный не бубнящий голос подписываемся
спс Гена/ твои уроки в школе 42(Unit) очень помогают =) правда смотрим их в х1,5
Очень рад ))
выпускай побыстрее продвинутый курс,куплю сразу, в универ. объем нереальный, только твои видео помогают
Привет. Почему данная функция "ShowArraySize" не выводит на экран правильный размер массива в байтах? И как это было бы правильно реализовать ?
#include
void ShowArraySize(int array[])
{
size_t a = sizeof array;
printf("%zu
", a);
printf("%zu
", sizeof array);
}
int main(void)
{
int price[4] = {10, 20, 30, 40};
ShowArraySize(price);
printf("%zu
", sizeof price);
return 0;
}
36:13 при компиляции с флагом -pedantic компилятор ругается :format ‘%p’ expects argument of type ‘void *’, but argument 3 has type ‘float *’ Это нормально?
@@nightwitch698 Он говорит, что тип указателя не совпадает. Можно сделать cast: (void *)pointerName в месте его использования, короче говоря при выводе добавить скобки (void *) перед именем указателя.
@@nightwitch698 Раньше такого предупреждения/ошибки не было, она появилась в более новых версиях компилятора.
34:32 тут же ошибка в 8 стрке. Должно быть int* onepointer = &one ,да?
Там нет ошибки )
Урааа, наверное, завтра родятся дети у амурских тигров и я найду второй носок :) Спасибо, Гена, что не забыл!
Вопрос по поводу синтаксического сахара:
Вы утверждаете, что запись типа array[10] будет работать медленнее чем *(array + 10). Я так понимаю приведение записи array[10] к *(array + 10) происходит на этапе компиляции, а не во время выполнения, и если так, то по скорости работы они должны быть абсолютно одинаковы.
Верно, хотел сказать что все равно все приводится к работе с указателями.
Ген, ты нереально крут, сегодня удивил препода записью *(array + 1)
Спасибо тебе большое, но на самом деле, очень много повторяешь информацию, чтобы дошла до всех, я согласен, это нормально, но все же поменьше повторений))
Спасибо! )) Хорошо))
Основная проблема всех курсов по программированию -- отсутствие _творческих_ задач, которые бы заставляли искать решение самому. Ну или полная оторванность задач от реальности. Си, в сумме своей, изучают для микроконтроллеров и реализация задач, оторванных от инициализации и использования переферии (кольцевые буферы, обработка массивов/строк/произвольного структурированного объема данных, простейшие модели с возможностью реакции на входное воздействие, конечные автоматы) дали бы значительное ускорение обучению не языку как таковому, а его использованию. А если сможете показать, детально, с кучей шагов от планирования до реализации, написание, например, того же драйвера под линукс - вот это РЕАЛЬНО будет снос башки, ибо такой материал есть только на ангельском.
Все верно, но это вводный курс, поэтому мы тут работаем с языком, будет продвинутый, там практическое программирование.
на 23 минуте вы расcказываете про размер float
я всё это делал на Windows
size_t floatSize = sizeof(float);
printf("
Float Size: %zu butes
", floatSize);
и в командной строке мне выдало
Float Size: zu butes
добавь флаг при компиляции: -std=c99, у тебя, видимо, 4ая версия gcc, там стандарт c89 и он не поддерживает %zu
Все круто делай дальше
Спасибо!
Есть такой вопрос. Если пример из урока компилирую и запускаю на Linux то выводится адреса в 16 - ричном формате как и у автора и адреса меняются при перезапуске. Если то же делать под Windows то получается вот так:
[*] Array Access:
0: 0028ff24
1: 0028ff28
2: 0028ff2c
3: 0028ff30
[*] Array Access:
0: 0028ff24
1: 0028ff28
2: 0028ff2c
3: 0028ff30
При этом адреса остаются те же при перезапуске программы.
Пробовал добавлять вначале 0х и %X но это просто меняет вид записи, а статичность адресов при перезапуске так и остаётся.
В чём тут разница? Компилирую с добавлением -std=c99 -Wall
Спасибо.
Все нормально. Windows выделила это пространство адресов так как у нее они свободны и система предоставляет их в пользование.
Суть 40ка минут видео:
Адресация в массиве бывает YourArray[0], а бывает *(YourArray+0).
Передача массива в функцию YourFuncion(YourArray[ ])
Указатель на элемент получают знаком амперсанда &YourArray[0]
Не все так понимают, нужно объяснять.
Вроде & даёт адрес переменной?
Cobra Cyborg не только переменной: функции, структуры, массива, элемента массива, переменной и т.д
Gena ANTG да, это оператор адреса. Позже у Эриксона вычитал про него.)
Забегая немного в перёд, я так понимаю, что более сложные программы построены на принципе вложения тела программы в бесконечный цикл. Команды ввода-вывода отрабатываются через прерывания и выход из программы - это завершение бесконечного цикла и возврат функцией мейн нуля. Я прав или нет?
Можно сказать и так )
Ура... новые видео 👍 ツ
Приятного просмотра! ))
printf ("%10.2f
", *(prices + 0)); - почему вот так выводит значение находящееся по адресу, но если так же пытаться вывести адрес: printf ("%10.2f
", &(prices + 0)); то выводит ошибку. Но зато вот так выводит: printf ("0x%10.2x
", &prices[0]); Еще получается так что если выводя адресс вместо %x написать %f , то выводит не адрес, а значение по адресу...это конечно не столь важно, но любопытно же
залей урок авторизации и регистрации и привязка почты!
Почему после добавления функции showArrayAdressessByPointer программа не компелируется? пишет что то вроде: незадекларированна arrey
В видео было название array, а у вас arrey )
Ген, удели 3 минуты для урока установки тем, просто на примере этого урока, в будущем можно будет самому проделывать данные процессы
Хорошо, сделаю.
Не понимаю, а как компилятор понимает, что + 1 это сдвиг на 4 байта? prices возвращает адрес в нулевого элемента в шестнадцатеричной системе и прибавляет к этому адресу 1, но след. элемент находится на +4 байта. Каким образом мы переходим к след. элементу? Ведь не никаких особых подсказок для компилятора, что в контексте этой задачи, нам нужен сдвиг на один размер значения флоат.
Здравствуй, а почему постоянно менялись адреса элементов массива. когда ты постоянно запускал программу?
после окончания работы программы все данные уничтожаются(массивы переменные) и при запуске программы снова выделяются новые ячейки в памяти
Гена , не знаю ответишь ты или нет) но все равно попытаюсь. Я дошла до моменты вывода адреса массива ( пишу в Windows), и у меня компилятор выводит вот в таком виде
0: 0061FF04
1: 0061FF08
2: 0061FF0C
3: 0061FF10
я несколько раз выводила и всегда выходят одни и те же цифры , и концовка не такая как у тебя. Почему так? интересно
Да потому что это адрес. У тебя с ним тоже одинаковый домашний адрес? Так же само и с компьютером)
Привет! Система выдает те адреса, который свободны для использования. В Вашем случае это одни и те же адреса. Это нормально.
Gena ANTG спасибоо)
what's the name of the ubuntu theme in the video ?
Theme: (Arc Theme): github.com/horst3180/arc-theme
Icons: (Numix): www.ubuntumaniac.com/2016/04/install-numix-circle-icon-theme-on.html
Sublime Theme: github.com/equinusocio/material-theme
thanks a lot dude :)
Привет Геннадий, прошу отнестись к моему вопросу адекватно. Будет ли видео о вводе информации на экран, если да, то когда(приблизительно)? Заранее спасибо!
Привет! Выводе на экран? Что именно вас интересует?
+Gena ANTG как бы вам сказать? Ну вот например в Паскале это readln
Про Орп ааа, понял, как раз следующий урок об этом будет )
+Gena ANTG Понял, спасибо!
Продолжил компилировать на windows7. При значении в исходном %zu выводилось в работе проги: "zu". Заменил на %u - стало выводиться правильное число в байтах: "4" (для float). С99, компилятор тот же. От чего это зависит? Заранее благодарен за ответ!
Добавь флаг -std=c99 при компиляции, у тебя MinGW 4 версии, я думаю, и все будет отлично
Привет!
Если ввести
size_t PricesSize = sizeof (prices);
printf("
Prices Size: %zu bytes
", sizeof (PricesSize));
то выдает 8 байт вместо 16-ти,
а если убрать sizeof из строки вывода, то ставит 16 байт.
Почему так, объяснишь?
Привет! Дело в том, что ты два раза делаешь sizeof - первый раз для массива, а второй - для переменной типа size_t. Само собой у них разные размеры)
@@ANTGPRO спасибо
Уже все понятно :)
Для сортировки массива городов надо было создать дополнительный масив а не переменню.
В подсказках ведь написал )
Вопрос может немного не по теме, но хотелось бы получить ответ.
Когда данные вводятся с какого - либо устройства, то они ведь тоже работают через оперативную память и каждому устройству выделяются ячейки памяти? Если это так, то где можно найти имена ячеек памяти,которые выделяются устройству и можно ли декодировать информацию, записанную на них?
Почему программа будет работать медленно если указывать адрес массива в квадратных скобках а не в круглых со звездочкой, ведь по идее компилятор этот "синтаксический сахар" убирает, непонятен этот момент. Аналогично с декларированием глобальных переменных, тоже непонятно почему медленно будет работать и вообще, если медленней то насколько?
Медленне не будет, это компилируемый код, я просто работал на момент записи с интерпретируемыми языками и почему-то решил сказать об этом. А в целом, когда мы имеем дело с "синтаксическим сахаром" , то мы имеем дело с конверсией к исходному виду кода, который могли бы использовать напрямую. Но это не всегда медленнее. А по поводу скоростей, нужно замерять.
Привет, а где можно узнать про твой сайт и продвинутый курс?
Привет! Вся информация будет здесь.
Как пользоватся using namespace std; ?
В Си нет пространства имен, это в С++.
Лайки ставить не забывайте !
Такс такс такс, я жду продвинутый платный и сайт до си пор... Пока нет примерных сроков?
Сроки уже есть, но пока озвучивать не стану. Будет много материала!
gena у меня тоже пишет Float Size: zu bytes как понять с флагом что это такое
при компиляции нужно добавить флаг -std=c99: gcc name.c -o name -std=c99
когда сайт запустишь?)
Как только разберусь с работой. Сейчас сложный период.
Почему в принципе адресация через квадратные скобки должна работать медленнее чем адресация через указатель? Если одно приравнивается к другому на этапе компиляции, то на скорость это не должно влиять
Да, я говорил про скорость в плане того, что лишней работы не происходит, не происходит неявного кастинга. В процессе работы, это не повлияет )
Относительно Lesson16/exercise
+ Есть функция, которая принимает два массива на вход, и выводит данные в виде таблицы.
- Написать функцию, которая принимает два массива на вход, и выводит отсортированную таблицу городов в порядке убывания населения.
Тут проблема
Население отсортировать в масиве не проблема.
Не получается привязать города . ... Помогите Gena ANTG !!!
Привязку надо делать по индексу ) Во время прохода элменеты массивы с населением меняют свое положение в массиве и изменяют свой порядковый индекс. То есть, массив городов уже не нужно сортировать, соритурем какой-нибудь один массив, запоминаем индексы, тут нужно подумать как это оформить, подсказу я вам дал )
Добрый вечер Гена! Во первых огромное спасибо за урок! Есть вопрос по поводу кода. Пишу на windows. Через маркер %zu не выводятся данные о байтах, а вот через маркер %i да. Можешь объяснить пожалуйста почему так?
Приветствую! У тебя скорее всего 4ая версия gcc, по-умолчанию он использует стандарт c89, а %zu из c99.
При компиляции просто добавь флаг --std=c99 и всегда компилируй с этим флагом.
Спасибо большое Гена, только вот версия gcc у меня 5.3.0 :)))
Dereh Haim так работает?))
Да, если добавляю --std=c99 то все прекрасно работает... Странно это все конечно.
Dereh Haim Каждый стандарт вносит свои фишки, ничего странного нет.
Привет, у меня такой вопрос.
маркер %zu в командной сторке отображается "Float size zu bytes" и все остальные типы также.
Вместо маркера %zu я поставил %u, И все нормально выводит. У меня Виндовс 7 64 бит. gcc 4.9.3.
Подскажи в чем проблема скрывается.
не понял: маркер %zu в командной сторке отображается "Float size zu bytes" и все остальные типы также.
код printf("
Float Size: %zu bytes
", floatSize); Выводит Float size: zu bytes
а код printf("
Float Size: %u bytes
", floatSize); Выводит Float size: 4 bytes
Евгений Евменков при компиляции, в конце, добавь флаг -std=c99, у тебя скорее всего 4ая версия gcc.
спасибо помогло, я и думал что дело в версии компилятора. И ты говорил об этом когда переходили на .Линукс, что могут быть проблемы с компиляцией.
спасибо огромное за ответ и вот что у меня получилось neme-std=c99.exe или neme.exe итак итак хотя все добавилось ( neme-std=c99.exe) не является внутренней или внешней командой исполняемой командой или пакетным файлом
через пробел -std=c99: gcc name.c -o name -std=c99
о другое дело от души за ответы с искренним уважением
Гена, рад новому уроку ) Какая цена вопроса кстати продвинутого курса?
склоняюсь к 77$
Думаю такой курс стоит своих денег однозначно )
У МЕНЯ 2 ВОПРОС
ТЫ ДЕЛАЕШ СВОЙ САЙТ
КАК ТЫ ЕГО СОЗДАЛ?
И КАКИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ НУЖНЫ ЧТОБЫ СОЗДАТЬ САЙТ?
php, java, python, ruby - их куча.
Гена, как называется тема которая у тебя в Linux установлена?
я уже 3 раза пересмотрл масивьі но не слова там не нашшол от том как создать Массив с именами городов. ето в твоих упражнениях я искал ето в интернете и нечего толкового не нашел подскажи как ето сделать?????я нашол только как ето сделать если есть один город но не 9 штук char city[] = {"New-York", "London" "Minsk", "Kuiv", "Warsaw", "Berlin", "Tokio", "Honk-Kong", "Moscow"}; и как нужно здавать printf в таком случае...Подскажи пожалуйста???
Ты написал массив с 9 городами, но так как строка это массив символов, у нас получается массив из строк (массив из массивов), тебе нужно добавить еще одну пару скобок в имени city: char city[][20] = { ... }, где 20 - это максимальная длина строки для названия города. Кстати, на начальном этапе все таки лучше писать кол-во элементов в массиве: char city[9][20] = { ... };
ааа получилось я 3 дня пьітался ето сделать и реально получилось тьі лучшуй!!!!!!!
где конкретно флаг добавлять опиши поподробней плиз что такое флаг это галочка что ли а с u работает
флаг это дополнительный параметр после имени программы, обычно выглядит так: --flag, -f
Добавить нужно -std=c99 при компиляции: gcc name.c -o name -std=c99
Ну на конец то!!!
Привет! В последней части урока при выводе адреса массива постоянно вылетает ошибка:
error: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘float *’ [-Werror=format=]
printf("0: %p
", &array[0]);
Погуглил - нашел такое решение с заменой аргумента с float на void. Заработало. Но верно ли оно?:
void showArrayAddresses(float array[])
{
printf("
[*] Array Addresses:
");
printf("0: %p
", (void*)&array[0]);
printf("1: %p
", (void*)&array[1]);
printf("2: %p
", (void*)&array[2]);
printf("3: %p
", (void*)&array[3]);
return;
Приветствую, Михаил!) Да, такое решение вполне корректно.
@@ANTGPRO Спасибо! Отличные уроки! Продвинутый курс все-таки уже вышел? Есть интерес.
@@mikhailchunaev1138 Выйдет на следующей неделе. Будет очень много видео) Сейчас идет предзаказ, можете купить по сниженной цене, после выхода цена будет 9999 руб.
Gena ANTG Заказ оплачен! Ждём!
@@mikhailchunaev1138 Спасибо, Михаил! А мы работаем, чтобы не подвести Вас.
А уже есть платный курс?
Работаю над ним
Какая стоимость платного курса?
~77$
Что для меня непонятно, это многие слова,которые ты пишешь: какие из них по правилам,а какие из головы(придуманные).Вот и не знаю какие запоминать.
Привет! А можно установить Sublime Theme бесплатно на Ubuntu 14.04 если есть такая возможность? И как это сделать?
Бесплатная версия будет периодически просить купить лицензию. Можете скачать на официальном сайте.
Уже 16 видео, и вы до сих пор не сказали, как вводить данные (Scanf).
Когда будем проходить строки, зацепим его сразу же.
char имеет от -128 до 127
а float какие границы имеет
Это можно узнать через константы. В уроках будет.
На линукс перешел?)
какие люди!)) уже очень давно )) я на нем сейчас только и работаю
ты гений))
у меня почему то первый с .. 0 .. 4 .. 8 почему так так и не понял)
почему так не подробно???
Что именно?
Имя массива не есть указатель!
Есть. Указатель на первый элемент массива. Нужно читать книги.
Вот именно, что надо читать книги. У Гриффитсов хорошо по этому поводу написано. Во-первых, переменная массива не может указывать ни на что другое (под само имя память не выделяется, в отличии от указателя). Во-вторых адрес массива, это адрес массива (&array == array), что для указателей не так (&pointer != pointer). В-третьих, sizeof(array) - размер массива в байтах, а вот sizeof(pointer) - размер указателя. Но всё равно ваши видео хороши для начинающих =)
Евгений Архипов Запись вида: &array == array это по-вашему что?)) Вы берете адрес и сравниваете его с именем массива. Это и есть указатель(имя массива равно его адресу, в вашем же примере). А те различия, что вы назвали, относятся к ТИПу. Тип указатель и тип массив - разные типы. Но механика в массивах реализована на указателях. Это не противоречит природе массива, так как любая структура в Си имеет адрес, а значит с ней можно работать через указатель. Ну а за благодарность, отдельное спасибо!))
Указатель, это переменная, для хранения адреса. Имя массива, это НЕ указатель. Под указатель выделяется память, под имя массива память не выделяется. Вы в видео утверждаете, что имя массива, это указатель, что не верно.
Евгений Архипов Причем здесь память? Дело в адресе ) Имя массива указывает на адрес его первого элемента. Имя указателя указывает тоже на адрес того, на что мы ссылаемся. А уже как компилятор выделяет память под эти типы - это его дело.
Я могу создать массив, могу создать указатель на его первый элемент / могу на имя(это одно и то же), у них будут одинаковые адреса, это говорит о чем? Это говорит о том, что они указывают / ссылаются на один и тот же адрес. Плюс к этому, я могу работать с массивом с помощью указателей, и вообще не работать через квадратные скобки.
Имя функции, имя массива - это указатели.
сегодня четверг и за окном дождик (я не вру), это случилось!
да )) приятного просмотра! ))
у меня тоже дождь)(не шучу)
А цену курса уже озвучивал где-то?
Cobra Cyborg 77$, уже не раз ))
+Gena ANTG Когда вернешься?
Люблю массивы prices[a] == *(prices+a) == *(a+prices) == a[prices]
Lesson 16
#include
#define n 9
#define SIZE 9
char * cities[]={"Moscow","New-York","London","Minsk",
"Kiev","Warsaw","Berlin","Tokio","Hong-Kong"};
int peoples [SIZE]={11503000,8406000,8674000,1893000,
2804000,1711000,3502000,13610000,7188000};
int *pmaxp[n], *pmaxc[n];
//функция обмена адресами
void obmen (int *a[n], int i, int j)
{
int *tmp;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
void main(void)
{
int i,j
for(i=0; i
только написал бы swap уже)) а то все по-английски ))
Почему у меня 1000 строк а у вас 500?😅
21 минута где %zu у меня не работало, погуглил, %lu заработало.. хммм
Добавь флаг -std=c99 при компиляции и все будет ок
Gena ANTG спасибо!!
задачки бы еще ты придумывал бы к урокам
Скоро будет много нового )
Запуталась на этом уроке (╥﹏╥)
смотри еще 2-3 раза поможет )
Что именно не понятно?
Не сразу поняла, что ф-я ArrayAdressess явл-ся общей и не могла провести связь с массивом prices. Пересмотрев дошло.
Но остался один вопрос по поводу вывода адресов в 16-й системе. У меня почему-то нулевой элемент оканчивается на буковку "с"-то есть на 12, это нормально?
0: 0xbfcbf17c
1: 0xbfcbf180
2: 0xbfcbf184
3: 0xbfcbf188
Виктория М Что-то не так с выводом я думаю. Нужно видеть код.
Проверяй через куркулятор, режим програмист. Всё правильно.
Если будет время оцените решение задания github.com/BoykoAnton/C/blob/master/EXarrays.c
Присылайте свои решения задач, рассмотрим их в видео. Покажу, как можно улучшить код. А так, Антон, ты молодец!)) Будет больше решений рассмотрим их в видео.
Gena ANTG Спасибо) есть небольшой опыт программирования на паскале, отсюда и си легче дается, особенно при помощи ваших уроков)
Урааа, наверное, завтра родятся дети у амурских тигров и я найду второй носок :) Спасибо, Гена, что не забыл!