inventor 0 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба uint8_t buf[32] = "abcdefgh"; почему можно и так? uart_tx_buf(uart1, &buf, strlen(buf)); и так? uart_tx_buf(uart1, buf, strlen(buf)); вроде второй вариант выглядит более верно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба А как выглядит прототип uart_tx_buf? и что там внутри Небось там uart_tx_buf( ...., void * ptr, ....), иначе компилятор заругается матом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 12 minutes ago, Forger said: А как выглядит прототип uart_tx_buf? и что там внутри Небось там uart_tx_buf( ...., void * ptr, ....), иначе компилятор заругается матом нет, принимает u8* как второй параметр. не void* static char buf[512]; va_list list; int l = 0; xSemaphoreTake(log_mtx, portMAX_DELAY); ***** HAL_UART_Transmit(uart, &buf, strlen(buf), 1000); HAL_UART_Transmit(uart, "\n\r", 2, 1000); IAR: Error[Pe167]: argument of type "char (*)[512]" is incompatible with parameter of type "uint8_t *" log_utils.c 61 Eclipse: 18:19:56 Build Finished. 0 errors, 10 warnings. (took 3s.445ms) И как правильно? адрес и buf и &buf одинаковый почему компиляторы по разному это воспринимают? int main() { char buf[32]; printf("addr &buf: %p\r\n", &buf); printf("addr buf: %p\r\n", buf); return 0; } addr &buf: 0019FF1C addr buf: 0019FF1C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 22 minutes ago, inventor said: почему компиляторы по разному это воспринимают? Потому что по сути это - разные вещи. Правильно будет : uart_tx_buf(uart1, &buf[0], strlen(buf)); или uart_tx_buf(uart1, buf, strlen(buf)); Учите матчасть, в частности С ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 22.06.2021 в 18:36, Forger сказал: Потому что по сути это - разные вещи. Правильно будет : uart_tx_buf(uart1, &buf[0], strlen(buf)); или uart_tx_buf(uart1, buf, strlen(buf)); Учите матчасть, в частности С ;) Это я понимаю, не понятно почему говногцц не даёт в этом месте ошибку Имя массива - это указатель на адрес его первого элемента. Да, это именно так, данный факт следует принять как аксиому. Вы можете убедиться в этом выполнив такое выражение: printf("%p = %p\n", arrI, &arrI); Отсюда следует, что имя массива – это ничто иное, как указатель. (Хотя это немного особенный указатель, о чем будет упомянуто ниже.) (С) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 22 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 4 minutes ago, inventor said: Это я понимаю, не понятно почему говногцц не даёт в этом месте ошибку Мой компилятор ругается на несоответствие типов, кроме случае, если ожидает void * Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 1 час назад, inventor сказал: адрес и buf и &buf одинаковый почему компиляторы по разному это воспринимают? Адрес одинаковый, но типы разные. ИАР об этом и говорит. По стандарту имя массива является адресом его первого элемента (одного). buf = uint8_t * (указатель на байт) &buf = char (*)[512] (указатель на массив из 512 байт) Проверка типов это основа основ. GCC видимо в данном случае позволяет больше вольности, что не есть хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 59 минут назад, inventor сказал: Имя массива - это указатель на адрес его первого элемента Неправильно. Имя массива является указателем на его первый элемент. А не на адрес первого элемента. Ибо указатель на адрес чего-либо - это уже указатель на указатель. Подробней тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба А если так передать: &0[buf] Что скажет компилятор? Имя массива это адрес его первого элемента. Вот так правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 165 22 июня, 2021 Опубликовано 22 июня, 2021 · Жалоба 36 минут назад, inventor сказал: А если так передать: &0[buf]... Тоже правильно. [] - бинарная операция, ей пофигу в каком порядке аргументы. Но устоялось именно &buf[0]. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 40 23 июня, 2021 Опубликовано 23 июня, 2021 · Жалоба 3 часа назад, inventor сказал: А если так передать: &0[buf] Что скажет компилятор? Имя массива это адрес его первого элемента. Вот так правильно. Имя массива, как и имя переменной, не могут начинаться с цифры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 23 июня, 2021 Опубликовано 23 июня, 2021 · Жалоба 3 часа назад, Xenia сказал: Имя массива, как и имя переменной, не могут начинаться с цифры. А это не имя переменной, это целое число (Integer constant). https://en.cppreference.com/w/c/language/operator_member_access "By definition, the subscript operator E1[E2] is exactly identical to *((E1)+(E2))" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 23 июня, 2021 Опубликовано 23 июня, 2021 · Жалоба 15 часов назад, inventor сказал: Отсюда следует, что имя массива – это ничто иное, как указатель. Все неправы. Правильно будет: "имя массива может быть неявно приведено к указателю на его первый элемент". Когда-то очень давно Александр Редчук очень подробно расписывал разницу, но сейчас уже не вспомню даже - на каком из форумов. Добавлено: все-таки на этом форуме: Почитайте, интересно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 23 июня, 2021 Опубликовано 23 июня, 2021 · Жалоба 17 hours ago, inventor said: Это я понимаю, не понятно почему говногцц не даёт в этом месте ошибку Особенно непонятно, что говногцц предупреждение в этом месте таки выдаёт: https://godbolt.org/z/oKx4djrcr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 23 июня, 2021 Опубликовано 23 июня, 2021 · Жалоба 13 hours ago, Xenia said: Имя массива, как и имя переменной, не могут начинаться с цифры. так можно, хотя и вид не очень понятный int a[20]; a[0] = 1; 1[a] = 2; 2[a] = 3; итд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться