LINUX.ORG.RU

Вопрос про правильность оформления/написания кода

 


0

3

Здравствуйте.

Вот есть буфер...

char str[20] = {0,}; 

И мне нужно записать в этот буфер что-то, но не в начало, в допустим в середину. Можно сделать так...

memcpy(str + 10, source, 5);

А можно так...

memcpy(&str[10], source, 5);

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


Компилятору пофиг, а человеку первое читать проще — меньше шума закорючек (&, [, ]).

bormant ★★★★★
()

У тебя что коллег нет?

А меня учили писать код так, как будто после меня его будет психически неуравновешенный человек склонный к жёсткому мщению на пустом месте, и он точно знает где искать автора с его семьёй. Подумай, что будет больше раздражать такого человека? Первый вариант, где символов меньше, или второй?

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

anonymous
()

Конечно второе.
В первом нужно держать в голове что размерность элемента массива 1 байт, да и вообще легко ошибиться.
И вообще, с указателями нужно обращаться по-указателе'вски, а массивами - по-массивс'ки, кроме редких случаев когда друое дает существенный профит.

Kroz ★★★★★
()

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

anonymous
()
Ответ на: комментарий от Eddy_Em

проще прочитать... И понятней

«Разыменовываем адрес+10, получая элемент по этому адресу, а потом обратно берём его адрес». Сразу понятно, что писал новичок.

anonymous
()
Ответ на: комментарий от Kroz

В первом нужно держать в голове что размерность элемента массива 1 байт

Кажется кто-то не знаком с арифметикой указателей.

И вообще, с указателями нужно обращаться по-указателе'вски, а массивами - по-массивс'ки

В других языках, а в С и 10[str], и str + 10, и 10 + str валидный код, понятный и очевидный.

П.С. плюсую предыдущего анонимуса.

anonymous
()
// вместо магических чисел магические слова
// для большей магичности слов можно писать транслитерацией
#define BUF_SIZE 20
#define N 5

char str[BUF_SIZE] = {0,}; 

// каждое действие отдельной строкой
// меньше конфликтов в командной разработке (при слиянии кода)
// заодно резко подрастает "производительность труда" в строках кода

// раз сказал "середина", то будь добр, явно пропиши эту "середину"
// долой магические числа, да здравствует магическая логика
size_t center = BUF_SIZE / 2;

char* dest = str + center;

// вдруг кому-то больше нравиться так
char* dest = &str[center];

// но это не важно, так как следующая комнада будет неизменна

// тут пишем банальщину
memcpy(dest, source, N);
anonymous
()
Ответ на: комментарий от anonymous

// вместо магических чисел магические слова
#define N 5

Ну ахренеть логика.

#define BUF_OFFSET_XXX (BUF_SIZE/2)
где XXX - наименование подо что этот кусок.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
memcpy(&str[10], source, 5*sizeof(*str));

Как я понимаю, никто не гарантирует, что чар равно байт в длину на любой платформе.

dsxl
()
Ответ на: комментарий от dsxl

Как я понимаю, никто не гарантирует, что чар равно байт в длину на любой платформе.

sizeof(char) == 1 на любой платформе, базовое понятие же.

anonymous
()
Ответ на: комментарий от vodz

#define N 5

Ну ахренеть логика.

Напомнил анекдот (шаблон)

Сталин: первое - ..., ..., ... и ... раcстрелять.
Сталин: второе - мавзолей перекрасить в зелёный цвет
...: почему в зеленый?
Сталин: так и думал, что по первому вопросу возражений не будет
anonymous
()
Ответ на: комментарий от anonymous

sizeof(char) == 1 на любой платформе

А в стандарте - нет. Даже какие-то CHAR_BIT и int_least8_t зачем-то понавыдумывали. Вот лохи, да?

dsxl
()
Ответ на: комментарий от anonymous

А в стандарте написано, что в байтах. Правда, там же написано, что sizeof(char) всегда возвращает 1, а memcpy копирует не байты, а characters. В общем, я был не прав, так что извини.

Осталось разобраться теперь как копировать массивы остальных типов.

dsxl
()
Ответ на: комментарий от anonymous

BUF_SIZE заменить на sizeof, а то привет переполнения.

Пример, пожалуйста.

И вообще, такое объявление смещения — это именно указание, что вот с такого-то элемента начинается вот то-то. Все проблемы переполнения тут стилистически никому не вперлись. Если есть подозрение, что подправят что-то одно, а часть выйдет за диапазон, то и добавляйте ниже:

#if (BUF_SIZE/2) == 0
# error "buffer too small"
#endif

vodz ★★★★★
()
Ответ на: комментарий от dsxl

Ага, написано что character «fits in a byte».

Но в любом случае нужно писать 5*sizeof(*str) ведь завтра str могут переделать в вайд чары.

dsxl
()
Ответ на: комментарий от dsxl

на самом деле, да. я видела контроллеры, на которых всё по 32 бита (часто встречается в софтовых CPU для FPGA). там просто меньше не бывает. поэтому в обычном понимании там sizeof(char) равен 4. но на контролллерах и сишечка бывает урезанной. там нельзя сказать, что поддерживается стандарт в полном объёме. а насчёт стандарта - его ведь могут и переписать. лучше всё-таки не надеяться на дефолты или определять magic numbers через макросы, как минимум.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

А на этих контроллерах memcpy принимает размер в байтах или 4х-байтных чарах? А память адресуется в байтах?

dsxl
()
Ответ на: комментарий от dsxl

память-то на шине 32 бита и все типы кратны 32. но вся арифметика в байтах такой и остаётся. и там по-другому никак.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.