Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.
С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона
...в паскале нет...
В Паскале, минимум, два механизма, делающих то же самое, что и юнион в Си:
1. Вариантная часть записи.
2. Директива absolute.
Цитата:
не разу не писав на Си , за 2 недели отладить...
Я, ни разу не писав ни на джаве, ни на процессинге, за пару вечеров собрал нечто, выполняющее функции многоканального USB-осциллографа и по совместительству логического анализатора для весьма специфического конкретного случая. И что? IMHO это должен суметь сделать любой, кому приходилось писать на нескольких других языках. Кое-что, конечно, сделал кривовато, что связано с незнанием тонкостей языка, но то, что сделал, работает, и я при этом ни к кому с глупыми вопросами обращался.
Пипец наглое, брехливое ЧМО, в Паскале это называется запись с вариантами!Пипец наглое, брехливое ЧМО, в Паскале это называется запись с вариантами!
если бы ты был внимателен ты б обратил внимание на хранологию перечисленных. и не сравнивал нынешний паскаль, с паскалем тех временю.
Цитата:
В Java нет union, т.к. union можно смоделировать подклассами.
то что можно смоделировать классамиЮ совершенно не относится к тому что требуется тут, в java совершенно по- барабану что и как расположено, и сколько это занимает места. там использут шаблонизаторы и прочее, совершенно не задумываясь о быстродействии - не тенет- надо сменить железо . а если вместо шаблонизатров использовать StringBuilder то можно плучит выйгрыш в 3 раза , это никого не смущает. там исползуют навороченные объект, это модно прогрессивно, ине задумывются что если испольвоать простые вещи то можно получить вместо такого времени выполнения 141101443, такое 524.
так что "можно смоделировать" и получить четко в памяти две большие разницы.
я две недели занимаюсь Cи, вы по нескольку лет. Буквально два дня назад узнал что есть struct, union - что вы стебётесь? сколько вы потратили времени на обучение?
Кое-что, конечно, сделал кривовато, что связано с незнанием тонкостей языка, но то, что сделал, работает
хорошо , что признаёшься , что сделал, кривовато, кривовато с незнанием тонкостей языка и я сделал, вот только я не хочу оставлять сделанное кривовато. и я спрашиваю специалистов как избавиться от кривоватости, потому как есть ограничения на память , быстродействие . у вас болше, намного больше , практики , нароботок - подскажите, поделитесь опытом. если для вас некоторые мои вопросы кажутся не совсем разумными - на первом этапе в новой теме это нормально.
Раз есть желание учиццо и "в залупу не лезешь", то и я тон снижу.
Помогу, где можно. В твоем случае нужно использовать адресную арифметику (мой пример), будет лучше по времени. Оптимизатору она привычна.
----
И еще: есть один язык программирования систем - это С и С++.. ОК, два ;) это уже религиозный спор: два это или один! ;)
Всё остальное - пока что баловство для веб-порталов.
Из 5-ого поколения нужно понимать Питон. Это один из лучших представителей ООП. Зная Питон можно писать на C#, но не наоборот.
Ява - просто один из миллионов инструментов, ИМХО, ничего особенного. У других может быть другое мнение.
Представитель именно научной школы о языках программирования тут - ЕвгенийП. Я - математик, Логик - профессиональный программист... Посидишь тут - поймешь, кто-есть-кто, по профессии вне форума.
typedef struct STRto9100 {
byte address;
byte command;
uint16_t reg;
uint16_t data;
uint16_t crc;
};
//STRto9100 to9100[] = {0x31, 0x32, 0x3334, 0x3536, 0x3738};
STRto9100 to9100[] = {0x01, 0x06, 0xEA10, 0x8400, 0x0000};
byte buf[8];
void setup() {
Serial.begin(230400);
byte* buff = (byte*) &buf;
getMBCRC((byte*) &to9100);
for (int i = 0; i < 8; i++) {
byte d = *(buff + i);
Serial.print(d, HEX);
Serial.print("+");
}
Serial.write(buf, 8);
}
void loop() {
}
// *buf pointer to character array that contains the characters to used calculate CRC
// bufLen number of characters to calculate CRC for
// *crc pointer to the array that contains the calculated CRC
void getMBCRC(byte *bu) { // Declare and initialize variables
buf[0] = bu[0];
buf[1] = bu[1];
buf[2] = bu[3];
buf[3] = bu[2];
buf[4] = bu[5];
buf[5] = bu[4];
unsigned long crc_0 = 0xffff;
unsigned long crc_1 = 0x0000;
byte* crc = (byte*)&crc_0;
int i, j;
for (i = 0; i < 6; i++) {
crc_0 ^= ((unsigned long)buf[i] & 0x00ff);
for (j = 0; j < 8; j++) {
crc_1 = (crc_0 >> 1) & 0x7fff;
crc_0 = crc_0 & 0x0001 ? crc_1 ^ 0xa001 : crc_1;
}
}
buf[7] = crc[1];
buf[6] = crc[0];
return;
}
много что для просмотра/провеки , итог в Serial.write выводит все как надо
но мне не нравится наличие дополнительного byte buf[8] и соответственно его заполнение.
отладить клиента ws, подключить лазерный дальномер, и всё это заставить работать вместе -получив бегущую кривую в браузере в реальном времени отражающую дальность от дачика до препятствия
Ну, блин, и дальномер подключил и с вебом связал, а вот два байта местами помеянть - ну, никак :(
выполнить код в цикле 1000 раз и померить время миллисом или микросом
в java понитно выполнение кода много раз, там оптимизатор рантайма вносит лепту, а тут? чтобы поймать с точностью более 4мкс?
Легко. Выполняете 1000 раз, меряете время, затем в том же коде меняете константу числа повторов на допустим 5000 и снова меряете время. Разницу второго и первого времени делиет на 5000-1000=4000. Возможно абсолютные цифры в каждом конкретном случае подобрать надо, но так можна точность и до такта получить. Даже с учетом погрешности таймера в 4мксек.
Ну, блин, и дальномер подключил и с вебом связал, а вот два байта местами помеянть - ну, никак :(
вопрос не просто поменять, а сделать это быстро, с минимумом памяти. я на примере java показал, что одного результата можно добиться разными способами , результаты будут отличаться до 5 порядков.
если бы ты был внимателен ты б обратил внимание на хранологию перечисленных. и не сравнивал нынешний паскаль, с паскалем тех временю.
Вывсёврёти! Ключевое слово absolute, которое делает ровно то же самое, что и union, появилась в Трубо-Паскале 6.0, это примерно 1990 год. А других паскалей с СССР тогда не было!
я вот не понимаю, ты типа программист Java, по крайней мере себя так позиционируешь, что тебе мешает пробежать гласками, по диагонали хотябы, Евангелие от Кернигана? Если ты лиарьно программист, 90% тупых вопросов отпадут сразу же после прочтения, да и волосы станут мяхкими и шелковистыми.
Вывсёврёти! Ключевое слово absolute, которое делает ровно то же самое, что и union, появилась в Трубо-Паскале 6.0, это примерно 1990 год. А других паскалей с СССР тогда не было!
вот что значить молодёжь :)
до 1990 были СМ4/Электроника100 на которых был паскаль
Был. Первые попытки разобраться чегой-то там вылазит из ПЗС-матриц (алгоритм поиска границы "объекта", алгоритм повышения контрастности границы и др.) писал на каком-то ДВК-Паскале .. 1985-86гг.. :)
если для вас такое "Евангелие от Кернигана" что-то говорит, то для меня пока только то что есть какая-то книшка. дали б полное название или где скачать
Расслабьтесь. Ардуино (которые Меги, Нано, Уно) - они все 8-и битные машинки. То есть единица измерения - 1(один) байт. соответственно, нет никакой задачи "поменять местами 2 байта", особенно в целях вывода. Вам уже отписали (видимо Вы пропустили, поэтому повторяю) - надо иной порядок - пересчитывайте указатель адреса ваших байтов в нужном порядке вывода. Это собственно и все, "самое эффективное" решение. Не надо ничего никуда перекопировать .. просто меняете порядок обхода байтиков указателем.
Брайан Керниган, Дениска Ричи: "Язык программирования Си". Только это сильно устаревший стандарт языка .. так сказать его основы.
пересчитывайте указатель адреса ваших байтов в нужном порядке вывода. Это собственно и все, "самое эффективное" решение. Не надо ничего никуда перекопировать .. просто меняете порядок обхода байтиков указателем.
Сильно устаревший - это если оригинальное переиздание и не поздние допечатки. Вам тут уже ответили, впрочем. У меня лежит ещё фиг знает какого года .. до 82-го вот точно. :)
Сильно устаревший - это если оригинальное переиздание и не поздние допечатки. Вам тут уже ответили, впрочем. У меня лежит ещё фиг знает какого года .. до 82-го вот точно. :)
И что? Какие знания позволяют тебе влезать в тему с глупостью? Ты можешь без гугля сказать, что именно отличает АНСИ Си от КР(Керниган Ричи) Си?
Просто отметится захотелось, Так сказать "ножку задрать" на кустик?
Тот Си, которым ты постоянно пользуешься для Ардуинки - это КР Си с незначительными дополнениями, типа локальных объявлений. То, что это было написано в 70-е годы - ничего не означает. Изменения последнего стандарта от 2011 года тебя очень вряд ли сильно волнуют.
Помнится, еще в FORTRAN'е были COMMON блоки, включающие в себя функциональность юнионов.
С Адой подробно не знаком, но, судя по тому, что она восходит к Паскалю, вряд ли в ней не было аналогов юниона
В Паскале, минимум, два механизма, делающих то же самое, что и юнион в Си:
1. Вариантная часть записи.
2. Директива absolute.
не разу не писав на Си , за 2 недели отладить...
Да уже все ясно и так ..
так что "можно смоделировать" и получить четко в памяти две большие разницы.
я две недели занимаюсь Cи, вы по нескольку лет. Буквально два дня назад узнал что есть struct, union - что вы стебётесь? сколько вы потратили времени на обучение?
хорошо , что признаёшься , что сделал, кривовато, кривовато с незнанием тонкостей языка и я сделал, вот только я не хочу оставлять сделанное кривовато. и я спрашиваю специалистов как избавиться от кривоватости, потому как есть ограничения на память , быстродействие . у вас болше, намного больше , практики , нароботок - подскажите, поделитесь опытом. если для вас некоторые мои вопросы кажутся не совсем разумными - на первом этапе в новой теме это нормально.
Раз есть желание учиццо и "в залупу не лезешь", то и я тон снижу.
Помогу, где можно. В твоем случае нужно использовать адресную арифметику (мой пример), будет лучше по времени. Оптимизатору она привычна.
----
И еще: есть один язык программирования систем - это С и С++.. ОК, два ;) это уже религиозный спор: два это или один! ;)
Всё остальное - пока что баловство для веб-порталов.
Из 5-ого поколения нужно понимать Питон. Это один из лучших представителей ООП. Зная Питон можно писать на C#, но не наоборот.
Ява - просто один из миллионов инструментов, ИМХО, ничего особенного. У других может быть другое мнение.
Представитель именно научной школы о языках программирования тут - ЕвгенийП. Я - математик, Логик - профессиональный программист... Посидишь тут - поймешь, кто-есть-кто, по профессии вне форума.
...квон - угарает по классам и абстрактной марксистской философии, Семен просто читает Кернигана Ритча, плачет от умиления и пьет.
получился вот такой вариант
typedef struct STRto9100 { byte address; byte command; uint16_t reg; uint16_t data; uint16_t crc; }; //STRto9100 to9100[] = {0x31, 0x32, 0x3334, 0x3536, 0x3738}; STRto9100 to9100[] = {0x01, 0x06, 0xEA10, 0x8400, 0x0000}; byte buf[8]; void setup() { Serial.begin(230400); byte* buff = (byte*) &buf; getMBCRC((byte*) &to9100); for (int i = 0; i < 8; i++) { byte d = *(buff + i); Serial.print(d, HEX); Serial.print("+"); } Serial.write(buf, 8); } void loop() { } // *buf pointer to character array that contains the characters to used calculate CRC // bufLen number of characters to calculate CRC for // *crc pointer to the array that contains the calculated CRC void getMBCRC(byte *bu) { // Declare and initialize variables buf[0] = bu[0]; buf[1] = bu[1]; buf[2] = bu[3]; buf[3] = bu[2]; buf[4] = bu[5]; buf[5] = bu[4]; unsigned long crc_0 = 0xffff; unsigned long crc_1 = 0x0000; byte* crc = (byte*)&crc_0; int i, j; for (i = 0; i < 6; i++) { crc_0 ^= ((unsigned long)buf[i] & 0x00ff); for (j = 0; j < 8; j++) { crc_1 = (crc_0 >> 1) & 0x7fff; crc_0 = crc_0 & 0x0001 ? crc_1 ^ 0xa001 : crc_1; } } buf[7] = crc[1]; buf[6] = crc[0]; return; }много что для просмотра/провеки , итог в Serial.write выводит все как надо
но мне не нравится наличие дополнительного byte buf[8] и соответственно его заполнение.
.
как можно померить время работы кода? в тиках, тактах и ли ещё как? чтоб была возиожность сравнивать варианты по скорости.
как можно померить время работы кода? в тиках, тактах и ли ещё как? чтоб была возиожность сравнивать варианты по скорости.
выполнить код в цикле 1000 раз и померить время миллисом или микросом
Ну, блин, и дальномер подключил и с вебом связал, а вот два байта местами помеянть - ну, никак :(
с точностью более 4мкс?
А оно Вам точно надо с такой точностью?
Наверняка не менее, чем 62.5ns...
Легко. Выполняете 1000 раз, меряете время, затем в том же коде меняете константу числа повторов на допустим 5000 и снова меряете время. Разницу второго и первого времени делиет на 5000-1000=4000. Возможно абсолютные цифры в каждом конкретном случае подобрать надо, но так можна точность и до такта получить. Даже с учетом погрешности таймера в 4мксек.
если бы ты был внимателен ты б обратил внимание на хранологию перечисленных. и не сравнивал нынешний паскаль, с паскалем тех временю.
Вывсёврёти! Ключевое слово absolute, которое делает ровно то же самое, что и union, появилась в Трубо-Паскале 6.0, это примерно 1990 год. А других паскалей с СССР тогда не было!
я вот не понимаю, ты типа программист Java, по крайней мере себя так позиционируешь, что тебе мешает пробежать гласками, по диагонали хотябы, Евангелие от Кернигана? Если ты лиарьно программист, 90% тупых вопросов отпадут сразу же после прочтения, да и волосы станут мяхкими и шелковистыми.
до 1990 были СМ4/Электроника100 на которых был паскаль
Был. Первые попытки разобраться чегой-то там вылазит из ПЗС-матриц (алгоритм поиска границы "объекта", алгоритм повышения контрастности границы и др.) писал на каком-то ДВК-Паскале .. 1985-86гг.. :)
если для вас такое "Евангелие от Кернигана" что-то говорит, то для меня пока только то что есть какая-то книшка. дали б полное название или где скачать
Расслабьтесь. Ардуино (которые Меги, Нано, Уно) - они все 8-и битные машинки. То есть единица измерения - 1(один) байт. соответственно, нет никакой задачи "поменять местами 2 байта", особенно в целях вывода. Вам уже отписали (видимо Вы пропустили, поэтому повторяю) - надо иной порядок - пересчитывайте указатель адреса ваших байтов в нужном порядке вывода. Это собственно и все, "самое эффективное" решение. Не надо ничего никуда перекопировать .. просто меняете порядок обхода байтиков указателем.
Брайан Керниган, Дениска Ричи: "Язык программирования Си". Только это сильно устаревший стандарт языка .. так сказать его основы.
Только это сильно устаревший стандарт языка .. так сказать его основы.
а что-то поновее,чтоб не переучиваться?
тогда Коран от Страуструпа.
Ну, во-первых, последние издания К&Р достаточно современные, но ежели желаете
что-то поновее,чтоб не переучиваться
их есть у меня - https://www.iso.org/standard/68564.html
Новее нет ничего - это последний писк.
Брайан Керниган, Дениска Ричи: "Язык программирования Си". Только это сильно устаревший стандарт языка .. так сказать его основы.
Опять Архат лужу газирует! Ну шо ж делать? ;)
Можно уточнения понятия "сильно устаревший"? на предмет "потрогать"? Что-то, что ты ежедневно используешь в коде? Кроме локальных объявлений.
Сильно устаревший - это если оригинальное переиздание и не поздние допечатки. Вам тут уже ответили, впрочем. У меня лежит ещё фиг знает какого года .. до 82-го вот точно. :)
Сильно устаревший - это если оригинальное переиздание и не поздние допечатки. Вам тут уже ответили, впрочем. У меня лежит ещё фиг знает какого года .. до 82-го вот точно. :)
И что? Какие знания позволяют тебе влезать в тему с глупостью? Ты можешь без гугля сказать, что именно отличает АНСИ Си от КР(Керниган Ричи) Си?
Просто отметится захотелось, Так сказать "ножку задрать" на кустик?
Тот Си, которым ты постоянно пользуешься для Ардуинки - это КР Си с незначительными дополнениями, типа локальных объявлений. То, что это было написано в 70-е годы - ничего не означает. Изменения последнего стандарта от 2011 года тебя очень вряд ли сильно волнуют.
У меня лежит ещё фиг знает какого года .. до 82-го вот точно. :)
Опять склероз, как было с именем Ершова и писаниной Фаэтона?