Size: a a a

2020 August 01

IT

Ilya Tagunov in Deus Volt!
Arthur Melkumov
Подскажите, насколько допустима адресная арифметика с указателями типа void*? Вроде в Си без приведения типа такое делать нельзя, но все таки интересно. Вопрос возник в ходе изучения функций без определенного количества параметров (типа кастомного printf для вывода символов на дисплей)
По стандарту нельзя. Но в некоторых компиляторах можно. Но лучше так не делать.
источник

AM

Arthur Melkumov in Deus Volt!
Dima Leonov
Так просто по байтно перебирает
Можно еще приводить к структуре, тогда на байты памяти наложатся типы
Окей, тогда не понятно почему происходит такое?:
  StackLocation =  ((void **)StackLocation) + 1; //прибавляет к адресу 4 байта
  StackLocation =  ((void *)StackLocation) + 1; //прибавляет к адресу 1 байт
источник

a

aum in Deus Volt!
ну он в первом случае использует адрес как размер
источник

a

aum in Deus Volt!
в 64 битке будет +8 видимо
источник

a

aum in Deus Volt!
но это все равно криво
источник

IT

Ilya Tagunov in Deus Volt!
Arthur Melkumov
Окей, тогда не понятно почему происходит такое?:
  StackLocation =  ((void **)StackLocation) + 1; //прибавляет к адресу 4 байта
  StackLocation =  ((void *)StackLocation) + 1; //прибавляет к адресу 1 байт
Потому что первый случай - это указатель на указатель, а размер указателя определён.
источник

AM

Arthur Melkumov in Deus Volt!
Хм, то есть выходит размер указателя для всех типов(char, int, long long) один - и уже численно зависит от системы на которой работает программа?
источник

a

aum in Deus Volt!
по стандарту если правильно помню, выравнивание определяется максимальным размером примитива компилятора
источник

a

aum in Deus Volt!
вроде, в последнем было 8 байт указано, поправьте, если ошибаюсь
источник

IT

Ilya Tagunov in Deus Volt!
Arthur Melkumov
Хм, то есть выходит размер указателя для всех типов(char, int, long long) один - и уже численно зависит от системы на которой работает программа?
Для обычных типов - да. Есть ещё всякие указатели на методы класса в C++, вот там может быть другой размер.
источник

AM

Arthur Melkumov in Deus Volt!
Ага, понял. Спасибо
источник

В

Василий in Deus Volt!
Ilya Tagunov
Для обычных типов - да. Есть ещё всякие указатели на методы класса в C++, вот там может быть другой размер.
Есть пример ?
источник

DN

Dmitry Noskov in Deus Volt!
Василий
Есть пример ?
#include <iostream>

struct S;
void (S::*foo_ptr)(void);
void (*bar_ptr)(void);  
   
int main()
{
   int a = sizeof(foo_ptr);
   int b = sizeof(bar_ptr);
   std::cout << "non-static member function pointer: " << a << std::endl;
   std::cout << "function pointer: " << b << std::endl;
}
источник

В

Василий in Deus Volt!
Dmitry Noskov
#include <iostream>

struct S;
void (S::*foo_ptr)(void);
void (*bar_ptr)(void);  
   
int main()
{
   int a = sizeof(foo_ptr);
   int b = sizeof(bar_ptr);
   std::cout << "non-static member function pointer: " << a << std::endl;
   std::cout << "function pointer: " << b << std::endl;
}
А можно выхлоп ещё ? Комп далеко
источник

DN

Dmitry Noskov in Deus Volt!
Василий
А можно выхлоп ещё ? Комп далеко
non-static member function pointer: 16
function pointer: 8
gcc 11, x64
источник

В

Василий in Deus Volt!
Dmitry Noskov
non-static member function pointer: 16
function pointer: 8
gcc 11, x64
Так, поковыряю на досуге. Спасибо
источник

D

Damir in Deus Volt!
Добрый вечер! Подскажите пожалуйста в чем может быть проблемка, пытаюсь  настроить VSC, чтобы прошивать МК. Делал вроде все как Илья в ютубе вещает. Хочу просто зажечь светодиод на плате.  Вот что на выхлопе в VSC
источник

D

Damir in Deus Volt!
через сеггер просто собранный файлик вроде как норм пишется, но светодиод не горит
источник

D

Damir in Deus Volt!
5 раз перепроверил не совсем ли олень и на той ли ноге диод, вроде на той🤷‍♂️
источник

VK

Valentin Kornienko in Deus Volt!
Василий
Так, поковыряю на досуге. Спасибо
Все просто
источник