Перейти к содержанию
    

Ладно, последняя попытка B)

Не все пишут на С++ и С++11

Те же библиотеки stm32 написаны на С. А ему пофиг на

int value = 10;
int * pointer;
....
pointer = value;

 

А че, редакторы нормальные отменили? У меня только мышь подводишь к переменной и сразу видно тип переменной, ошибиться нереально.

 

P.S. ИМХО, логичные и информативные названия переменных ничуть не хуже венгерской нотации работают, еще и код более "читабельный" получается.

Изменено пользователем Шаманъ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А че, редакторы нормальные отменили? У меня только мышь подводишь к переменной и сразу видно тип переменной, ошибиться нереально.

Подгружать весь проект вместо того, чтобы в блокноте бегло глянуть на кусок кода? (когда тип определен где-то в дебрях кучи *.h)

 

И да, тут уже был ответ:

Автоматизация "мартышкиного" труда еще не отменяет самого факт такого труда )))

К тому же даже в данный момент далеко не все среды (тоже обратите на тему и раздел где мы сидим) поддерживают такие вещи.....

Речь в данном случае не про внешние редакторы, а целиком про среды проектирования (Keil, Eclipse, Crossworks и др).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Назад на пальму к корням в ассмы!!! Шутка…

не куда не назад. пока единственный путь.

 

2Alechek Где я противоречу? где я в имеми переменой в своем примере вставил хоть что-то от типа переменной?

 

Вы сами себя запутали. вы обьявили новый тип LPSTREADMATA. не переменную, а тип. этот тип есть указатель на структуру STREADMATA. теперь в аргументах функции вы передаете

 

void f(LPSTREADMATA pInData) - встретив такую запись не понятно что передается? вызывается ли копирющий контруктор, делается ли копия переменной/структуры типа LPSTREADMATA. вам необходимо в имя переменной воткнуть pInData, иначе не видно, что передается указатель. вам, чтоб не запутаться, нужны наверно и в имя типа вставка LPSTREADMATA, и в имя переменной вставка pInData.

 

я не тайпдефю указатели. не делаю LPSTREADMATA и т.п. типы. я пишу

void f(STREADMATA *inData) - по такой записи я сразу вижу, что передается указатель, и более того, я вижу, что данные по указателю inData внутри функции будут изменены. т.е. функция f() меняет структуру, указатель на которую передается в качестве аргумента, внешняя структура будет изменена. а вашем стиле, без дополнительных вставок в имена типа и переменной, не понятно... будет меняться структура или нет, т.е. не понятно передается указатель или копия структуры будет создана на стеке.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подгружать весь проект вместо того, чтобы в блокноте бегло глянуть на кусок кода? (когда тип определен где-то в дебрях кучи *.h)

Используемый нынче у меня редактор умеет более-менее успешно вытягивать и без проектов такие штуки из "дебрей кучи *.h" :)

 

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

 

 

я не тайпдефю указатели. не делаю LPSTREADMATA и т.п. типы. я пишу

void f(STREADMATA *inData)

Кстати да, специальные типы с указателями это зло. Как-то с libpng возился, a там любители typedefов наплодили и указателей, и указателей на указатели - жесть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оффтоп по поводу переделки тайпдефов.... тут говнолидер - это Texas Instuments.... со своею TI-RTOS и SPL.

 

их код создание таска

Void heartBeatFxn(UArg arg0, UArg arg1)

{

}

хорошо, что идэ у них на эклипсе.... что такое Void? ctrl+ЛКМ улетаем в какой-то хидер

#define Void xdc_Void

ещё раз ctrl+ЛКМ, ултетаем в

#define xdc_Void        void

ну да ладно.... Void интуитивно понятно что это void. А вот что такое UArg arg0? ctrl+ЛКМ (ещё раз спсибо эклипсу, чтоб я без него делал?) улетаем в хидер

typedef xdc_UArg        UArg;

далее ctrl+ЛКМ - полёт по хидерам...

typedef uintptr_t       xdc_UArg;

-

uintptr_t вроде всё понятно.... u - значит unsigned, int - это int, ptr - т.е. pointer, т.е. указатель, _t - тип. делаем контрольный ctrl+ЛКМ

typedef unsigned int uintptr_t;

 

NO COMMENT!!!

 

а вы говорите заглянул по быстрому в блокнот ))))

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут говнолидер - это Texas Instuments.... со своею TI-RTOS и SPL.

Оо! Зря я наехал на libpng :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Alechek Где я противоречу? где я в имеми переменой в своем примере вставил хоть что-то от типа переменной?

Вам, чтобы видеть лучше тип, надо *, но при этом вы против некоторго символа в другом месте.

Хотя и то и другое способствует повышению скорости писания кода одновременно с уменьшеним вероятности ошибки.

 

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

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

 

Void heartBeatFxn(UArg arg0, UArg arg1)

а вы говорите заглянул по быстрому в блокнот ))))

 

вот и я о том же.

При:

Void heartBeatFxn(UArg p_arg0, UArg p_arg1)

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Именно так, границы копирования определяются адресами полей и размерами соотв. полей этой структуры, а не некими магическими числами.

 

вот, только массивы в структурах могут быть открытими... (в С)

Дык, они открыты по-умолчанию и в С++ ))

 

В плюсах этот кусок делается через ссылку на некий класс, которые в своих недрах содержатся нужные данные.

А через соотв. метод этого же класса "достучаться" до его данных.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Иногда приходится...

Я не говорю по какие-то исключения - бывает всякое, я про нормальную работу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Void heartBeatFxn(UArg p_arg0, UArg p_arg1)

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

мне не видно.... пусть я слеп. Но вам видно?! УКАЗАТЕЛИ!? Одну ногу отстрелили! ))) я же раскрыл все тайпдефы. это не указатели, это unsigned int

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне не видно.... пусть я слеп. Но вам видно?! УКАЗАТЕЛИ!? Одну ногу отстрелили! ))) я же раскрыл все тайпдефы. это не указатели, это unsigned int

Мне видно, что это указатель c конкретным размером в 32 бит:

typedef uintptr_t       xdc_UArg;

 

Кстати, такое есть и в WINDOWS:

LONG_PTR A signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic.

 

This type is declared in BaseTsd.h as follows:

C++

 

#if defined(_WIN64)

typedef __int64 LONG_PTR;

#else

typedef long LONG_PTR;

#endif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uintptr_t вроде всё понятно.... u - значит unsigned, int - это int, ptr - т.е. pointer, т.е. указатель, _t - тип. делаем контрольный ctrl+ЛКМ

typedef unsigned int uintptr_t;

 

NO COMMENT!!!

Отличный пример того, как буковки в префиксах имён могут быть неверно истолкованы.

(Но вообще-то uintptr_t - это стандартный тип (из stdint.h), и его название означает "беззнаковое целое, размер которого достаточен для хранения указателя").

 

При:

Void heartBeatFxn(UArg p_arg0, UArg p_arg1)

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

Совершенно не видно. Может, p_ - это от слова "parameter". А может, просто автор любит писать p_. Или имя осталось от прошлой версии интерфейса функции, когда этот параметр был указателем, а в нынешней версии он уже давно не указатель. В любом случае придётся проверять.

Ещё один момент. Вы же в своих проектах используете сторонние библиотеки? И наверняка среди них есть такие, которые не придерживаются привычного вам соглашения о префиксах. Так что вам, с вашим подходом придётся всё время отслеживать, в каком вы сейчас коде - в своём (с привычными вам префиксами имён) или в стороннем (который, не использует таких соглашений).

Поэтому сейчас есть тенденция отказа от таких префиксов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне видно, что это указатель c конкретным размером в 32 бит:

typedef uintptr_t       xdc_UArg;

Выстрел!!! Вторую ногу отстрелили. в си/с++ нет типа uintptr_t, где-то должно быть определение... в каком-нить хидере. И оно у TI есть

 

typedef unsigned int uintptr_t;

- т.е. uintptr_t определйн как беззнаковое целочисленное, а не указатель. причем.... как может указатель быть c конкретным размером в 32 бит? указатель может быть на 32-х битное... на структуру, на void. а так-то размер любого указателя одинаковый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совершенно не видно. Может, p_ - это от слова "parameter". А может, просто автор любит писать p_. Или имя осталось от прошлой версии интерфейса функции, когда этот параметр был указателем, а в нынешней версии он уже давно не указатель. В любом случае придётся проверять.

Соглашусь. Сразу не видно. Но заставит задуматься.

Но, если стиль будет одинаков по всему этому однотипному коду (сторонняя библиотека), и с ним уже знаком, то и думать не придется.

 

Вообще, когда-то пытался использовать принцип FreeRTOS, во времена ее освоения. Понял, что бездумное повальное присвоение префиксов типа в имени переменной и, особенно, функций - путь к граблям и траблам. Поплевался достаточно при рефакторинге своего кода. :wacko:

 

Но вот выделение указателей, глобальных переменных (в т.ч. переменных класса) - это святое. Походил уже по граблям безликих переменных, набил шишек. :twak:

 

Каждый выбирает свои грабли. :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Скажем, имеем указатель на класс.

Компилятор не позволит присвоить ему абы что и не позволит присвоить сам указатель чему-то левому.

Попытка неправильного разыменования полей такого класса тоже невозможна - не получится использовать "." вместо "->"...

Отсюда простой вопрос: зачем в имени указателя на класс указывать тот факт, что он указатель?

Приведите пример, где без этого никак не обойтись.

 

Какой смысл каким-то образом выделять в имени переменных класса (правильно называть "поля" класса) их расовую принадлежность?

Приведите пример, где без этого никак не обойтись.

 

Приведите пример, где без глобальных переменных невозможно обойтись

или хотя бы приведите пример, где необходимо выделения имени глобальной переменной?

 

Походил уже по граблям безликих переменных, набил шишек.

Безликость переменной лечится нормальным и осмысленным именем, но никак не префиксами-суффиксами-аппендиксами-подчеркиваниями.

 

Каждый выбирает свои грабли
С этим трудно не солгаситься :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...