Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Во-первых, зачем постоянно преобразовывать указатель к uint16_t и обратно? Глупо же.
Во-вторых, сделайте, как в прошлый раз через новые типы. Только не забудьте, что у вас указатель во флэш на символ во флэш...
В-третьих, зачем копировать строку в ОЗУ? Не проще ли выводить её сразу из флэш?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

(1) Так иначе компилятор матерится.
Или вы о чём то другом. Если да то можно пример?
(3) Там небольшая прослойка API, принимает строку из ОЗУ. Дело в том, что показ строк меню - это далеко не самая главная задача устройства.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Код: Выделить всё

typedef void(*func_ptr)(void);

static void func1(void){
}

static void func2(void){
}

flash func_ptr func_array[] = {func1, func2};

func_ptr exec;

exec = func_array[1];
exec();
разве в таком коде будет ругня компилятора? в нем нет никаких преобразований типов.

Код: Выделить всё

flash char str1[] = "привет!"
flash char str2[] = "пока!";

typedef flash char * flash_str;

flash flash_str str_array[] = {str1, str2};

char ram_str[20];

copymem_load_fstr(str_array[1], ram_str);
а в этом коде? тоже без всяких преобразований...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Так работает нормально, спасибо.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

если поддержка flash компилятром сделана качественно, то промежуточные переменные могут вообще не понадобиться:

Код: Выделить всё

typedef void(*func_ptr)(void);

flash func_ptr func_array[] = {func1, func2};

func_array[1](); // просто выполняем функцию из массива
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Если распутать данное определение, то получается

Код: Выделить всё

flash flash char* str_array[] = {str1, str2};
Я правильно понял?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Лично я не настолько влюблен в Си, чтобы колупаться в его ребусах. Я делаю, как мне проще, а как оно разворачивается, мне не интересно.

С моей точки зрения корректно сделанный новый тип намного практичнее и удобнее (и понятнее) развернутой записи.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

И тем не немее, вы написали код, который корректно работает.

Мне же пока до конца не ясны некоторые нюансы вроде этого. Книга K&R и ряд статей интернета не дали ответа по данному направлению. Может посоветуете что почитать, чтобы окончательно разобраться в указателе на указатели и в каких случаях в какую память они помещаются.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Написать корректный код мне помог здравый смысл. K&R я читал бегло и понял, что там слишком много лишнего написано. В частности там описан миллион способов сделать непонятными простые вещи...например, записать в "развернутом" виде указатель на функцию, возвращающую указатель на структуру и имеющую в качестве параметра указатель на функцию с тремя параметрами и возвратом указателя...

Хотя гуру это пишут и читают походя, меня это не привлекает, и я делаю то же самое простыми способами.

Нужно, чтобы стандартный тип попал во флэш? Вводу новый тип. Надо на этот тип указатель? Снова новый тип. Надо этот указатель занести снова во флэш? Опять новый тип. Вот и все: на каждом этапе все просто и понятно, а в итоге - отличный и лёгкий код.

Я никогда не объявляю переменные-структуры без предварительного определения соответствующего типа-структуры... и так во всем: если можно написать проще - я так и делаю.

Си разрешает слишком многое, но,имхо, можно не означает нужно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

кто-либо осведомлен, почему элементы массива нумеруются с нуля а не с единицы ? :)
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Потому что это естественно. 0b00000000 - минимальное число, которое можно представить в двоичном виде. И как-то логично, чтобы считать 0b00000000 нулём, а не единицей.

(естественно, 0b10000000 (char), 0b10000000 00000000 (int), 0b10000000 00000000 00000000 00000000 (long) - эти минимальные в своих границах (байт, два байта, четыре байта) числа как бы много меньше нуля, но это в некоторой мере искусственная условность).

А с единицы массивы нумеруются в каком-нибудь Паскале, т.к. в большей мере этот язык для обучения программированию, нежели что-то действительно серьёзное. Ну вроде как малых детей учат считать с единицы, т.к. ноль - это более недоступная их пониманию категория.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

WiseLord писал(а):А с единицы массивы нумеруются в каком-нибудь Паскале, т.к. в большей мере этот язык для обучения программированию, нежели что-то действительно серьёзное. Ну вроде как малых детей учат считать с единицы, т.к. ноль - это более недоступная их пониманию категория.
в паскале массивы индексируются в пределах, какие заданы программистом - хоть с нуля, хоть с 312, хоть с -257 - в зависимости от того, как более удобно описать имитируемые объекты реального мира. в реальном мире никто никогда нигде не считает, например, автомобили с нуля :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Если рассматривать с точки зрения машины, то будет примерно следующее.
Пусть байтовый массив находится в памяти по адресу N. Чтобы адресовать самый первый элемент(байт), надо выставить адрес N+0. Второй байт - N+1 и т.д. Таким образом, обращение к элементу массива - есть фактически указание смещения относительно его начала(первого элемента).
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

FreshMan писал(а):кто-либо осведомлен, почему элементы массива нумеруются с нуля а не с единицы ? :)
Это не номера - это смещения. Это консистентно с арифметикой указателей. Это соответствует представлению данных в памяти. Это удобно в конце концов. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):кто-либо осведомлен, почему элементы массива нумеруются с нуля а не с единицы ? :)
Siarzhuk писал(а):Это не номера - это смещения. Это консистентно с арифметикой указателей. Это соответствует представлению данных в памяти. Это удобно в конце концов. ;-)
uk8amk писал(а):Если рассматривать с точки зрения машины, то будет примерно следующее.Пусть байтовый массив находится в памяти по адресу N. Чтобы адресовать самый первый элемент(байт), надо выставить адрес N+0. Второй байт - N+1 и т.д. Таким образом, обращение к элементу массива - есть фактически указание смещения относительно его начала(первого элемента).
удобно или нет - дело исключительно привычки, а вот по поводу смещения - просто только для байтовой адресации, а для данных, размер которых не равен байту, все уже не совсем так просто. попытка назвать внутреннее представление данных с "естественным" разбивается о человеческий мир материальных вещей, где исключительно все нумеруется с 1.

однако, это не имеет отношения к сути: связь между индексом и адресом устанавливается компилятором, и чисто теоретически абсолютно все равно, как именно нумеровать элементы - дело заключается в двух вещах: стандарт языка и привычка программиста.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):а вот по поводу смещения - просто только для байтовой адресации, а для данных, размер которых не равен байту, все уже не совсем так просто.
Нет, именно смещение. Арифметика указателей принимает во внимание размер указуемых объектов. Нет никакой разницы содержится ли в массиве байты или сложные структуры - инкрементируя указатель на первый элемент массива вы получаете указатель на следующий элемент.

Код: Выделить всё

struct S {
  int a;
} a[10];

struct S* p = a;

for (i = 0; i < 10; i++, p++)
  p->a = i;

// равнозначно следующему циклу
for (i = 0; i <10; i++)
  a[i].a = i;

Кроме того манипулируя типом указателя можно работать с данными гораздо компактнее.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):Арифметика указателей принимает во внимание размер указуемых объектов. Нет никакой разницы содержится ли в массиве байты или сложные структуры - инкрементируя указатель на первый элемент массива вы получаете указатель на следующий элемент.
очевидные вещи говорите - и чо?
Siarzhuk писал(а):Кроме того манипулируя типом указателя можно работать с данными гораздо компактнее.
вообще не ясно, как одно связано с другим.

все эти рассказы про арифметику указателей не отвечают на кардинальный вопрос: почему в массиве домов мы должны первый дом нумеровать нулем?! если мы считаем ноги, то покажите мне кошачью ногу номер 0! :)))
в данном контексте проще - однозначно "нумеровать с 1"!

если бы изобретатель языка счел нужным взять за основу логику человека, массивы нумеровались бы с 1-го элемента, и это никак не изменило бы ничего. он счел возможным поступить иначе...

поэтому с моей точки зрения единственно правильный ответ на вопрос "почему с нуля" заключается в сакраментальном "потому что". такой язык Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):однако, это не имеет отношения к сути: связь между индексом и адресом устанавливается компилятором, и чисто теоретически абсолютно все равно, как именно нумеровать элементы - дело заключается в двух вещах: стандарт языка и привычка программиста.
Суть в том и состоит что стандарт языка С предлагает использовать понятия физически существующей организации данных а не возводить дополнительный уровень адресации на ровном месте. Вот из этой естественности концепций и проистекают уже упомянутые удобство* использования и непротиворечивость остальным концепциям.

* Ну если конечно ещё можно говорить о каком-то удобстве средства разработки уходящего корнями в 60-ые годы прошедшего века. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):Суть в том и состоит что стандарт языка С предлагает использовать понятия физически существующей организации данных а не возводить дополнительный уровень адресации на ровном месте.
в том то и дело, что физически адресное пространство строго линейное и адресуется исключительно машинными словами. форматирование данных по типам, структурам и массивам - это уже более высокий уровень абстракции (мы уходим от машинных слов к "челвекоудобным" понятиям), поэтому ваше утверждение не совсем корректно.

вот по поводу стандарта - соглашусь полностью, но это и есть мой вариант ответа: сказано с 0, значит с 0 - и без вопросов! :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):а вот по поводу смещения - просто только для байтовой адресации, а для данных, размер которых не равен байту, все уже не совсем так просто.
ARV писал(а):
Siarzhuk писал(а): Нет, именно смещение. Арифметика указателей принимает во внимание размер указуемых объектов. Нет никакой разницы содержится ли в массиве байты или сложные структуры - инкрементируя указатель на первый элемент массива вы получаете указатель на следующий элемент.
очевидные вещи говорите - и чо?
А это был ответ на ваше "не совсем так просто". С примером, что размер элемента значения не имеет и всё абсолютно идентично что для байтов, что для сложных структур.
ARV писал(а):
Siarzhuk писал(а):Кроме того манипулируя типом указателя можно работать с данными гораздо компактнее.
вообще не ясно, как одно связано с другим.
Приводя указатель к требуемым типам данным не нужно заморачиваться размерами структур а просто использовать адресную арифметику. Задача отслеживания размеров структур ложится на компилятор - что упрощает поддержку и доработку программы в будущем.
ARV писал(а):все эти рассказы про арифметику указателей
Это не рассказы - это объективная и непротиворечивая концепция представления данных.
ARV писал(а):не отвечают на кардинальный вопрос: почему в массиве домов мы должны первый дом нумеровать нулем?!
Потому что номер дома лучше хранить без привязки к индексу а как поле описывающей его структуры. Интересно что вы будете делать если гады-уплотнители на месте парка перед вашими окнами вопрут какой-нибудь дом "1б".
ARV писал(а):если мы считаем ноги, то покажите мне кошачью ногу номер 0! :)))
в данном контексте проще - однозначно "нумеровать с 1"!
Не ну коты - это другое дело на них никакие правила и языки не распространяются - контекст у них завсегда и везде повсюду свой.
ARV писал(а):если бы изобретатель языка счел нужным взять за основу логику человека, массивы нумеровались бы с 1-го элемента, и это никак не изменило бы ничего.


Помилуйте, там и так достаточно костылей чтобы вводить ещё один абсолютно ненужный "один пишем ноль в уме".
ARV писал(а):он счел возможным поступить иначе...

поэтому с моей точки зрения единственно правильный ответ на вопрос "почему с нуля" заключается в сакраментальном "потому что". такой язык Си.
Ну супротив религиозного сознания не попрёшь. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

Вернуться в «Разные вопросы по МК»