All streams
Search
Write a publication
Pull to refresh
2
0

User

Send message

и о прочих краеугольных случаях, которые Вы описываете, я тоже подумал — но в какой-то момент комментарий стал выглядеть черезчур уж громоздким, и потому осетра пришлось урезать.

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

А так — да, нюансов много, очень много. Но кто про них будет читать?

Это — не те нюансы.

Вы пишете код на C на уровне джуна.
Само по себе это ни о чём не говорит.

Но когда вы начинаете чваниться перед молодежью своими умениями, это уже — совсем другое дело.

В приведённом коде нет indirection operator. Семантически говоря. Это как раз один из моментов в С, с которым отцы недоработали — выражение *p имеет совершенно разную семантику в зависимости от контекста. Прежде всего — declaration vs. evaluation.

Декларация — это не expression, а в данном случае рассматривается expression.

А sizeof “работает” во время компиляции, а не исполнения, нет ни малейшей необходимости в разыменовывании, компилятору нужно лишь вывести тип операнда.

Это и есть невычислимый контекст.

Отношение к стандарту у автора тоже доставляет. Но с учётом того, что ему (ей вообще-то) всего лишь 20 лет от роду, можно и простить это лёгкое невежество.

Нельзя, поскольку усвоившим неверные сведения потом придётся переучиваться.

— Это не хвост ноль, — сказал волк и густо покраснел. — А у тебя, Красная Шапочка, ещё молоко на губах не обсохло для таких вопросов! ©

Судя по вашему коду, молоко на губах не обсохло у кое-кого другого:

  int len1 = strlen(input_str1);
  int len2 = strlen(input_str2);

Функция strlen возвращает значение беззнакового типа.
К тому же, этот тип может иметь размер, превышающий размер типа int.

В результате, могут получиться как отрицательные значения, так и значения, значительно меньшие, чем настоящий размер "чисел".

Лишь стажёры и джуны ещё могут допускать такие ошибки.

  char* result_str = malloc(res_len);
  char* ptr3 = result_str + res_len;
  *--ptr3 = '\0';

Функция malloc может вернуть NULL со всеми вытекающими последствиями.

В коде нет освобождения памяти, и дело не в оправданиях, что, мол, это — просто пример. В этом коде принципиально невозможно освободить память.

Если в последнем разряде был перенос, то функция mega_add вернёт ровно тот адрес, который вернула функция malloc.
Если же переноса не было, то функция mega_add вернёт адрес на 1 больше.

Определить в функции test, был перенос или нет, невозможно, поэтому невозможно и передать правильный адрес функции free.
Соответственно, освобождение памяти здесь принципиально невозможно.

Если добавить в mega_add вывод некоторых значений:

  int res_len = (len1 > len2 ? len1 : len2) + 1 /* для замыкающего \0 */
                  + 1 /* для потенциального переноса */;

  printf("%s: len1: %i, len2: %i, res_len: %i\n", __func__, len1, len2, res_len);
  char* ptr1 = input_str1 + len1;
  char* ptr2 = input_str2 + len2;
  char* result_str = malloc(res_len);
  printf("%s: result_str: %p\n", __func__, result_str);

и в функцию test — тоже, и ещё, оставив вывод только результата, без самих чисел:

  char *s = mega_add(input_str1,input_str2);
  printf("%s: s: %p\n", __func__, s);
  printf("Result: %s\n", s);

и переписать функцию main:

int main(void) {
  static char a[((size_t)1 << (sizeof(int) * CHAR_BIT)) - 2];

  memset(a, '9', sizeof a - 1);
  test(a, a);
  return EXIT_SUCCESS;
}

то после запуска можно увидеть:

$ ./1
mega_add: len1: -3, len2: -3, res_len: -1
mega_add: result_str: (nil)
Segmentation fault
$ 

По значению result_str видно, что функция malloc вернула NULL, потому что не смогла выделить 18 квинтиллионов байт памяти.

Последствия не замедлили последовать, потому что в коде нет проверки значения, возвращаемого функцией malloc.

Ещё два варианта main, первый:

int main(void) {
  test("9", "9");
  return EXIT_SUCCESS;
}

и второй:

int main(void) {
  test("1", "1");
  return EXIT_SUCCESS;
}

В первом случае:

$ ./1
mega_add: len1: 1, len2: 1, res_len: 3
mega_add: result_str: 0x56058cd406b0
test: s: 0x56058cd406b0
Result: 18

$ 

видно, что функция test получила в переменную s ровно тот же адрес, который был выделен функцией malloc в mega_add и запомнен там в переменной result_str.

Во втором же случае:

$ ./1
mega_add: len1: 1, len2: 1, res_len: 3
mega_add: result_str: 0x5626942f16b0
test: s: 0x5626942f16b1
Result: 2

$ 

видно, что функция test получила в переменную s адрес, на 1 больше по сравнению с тем, который был выделен функцией malloc в mega_add.

Определить, увеличенный это на 1 адрес или нет, в общем случае невозможно.
Поэтому невозможно и правильно вызвать free.

Ещё один вариант функции main:

int main2(void) {
  static char a[((size_t)1 << (sizeof(int) * CHAR_BIT - 1)) + 1];

  memset(a, '9', sizeof a - 1);
  test(a, "9");
  return EXIT_SUCCESS;
}

Результат:

$ ./1
mega_add: len1: -2147483648, len2: 1, res_len: 3
mega_add: result_str: 0x557e0b5ce6b0
test: s: 0x557e0b5ce6b1
Result: 9
$ 

Видно, что сложение числа 9 с огромным числом, состоящих из более, чем 2-х миллиардов цифр 9, в результате, дало всего лишь число 9, состоящее из одной цифры.

Рановато вам ещё перед молодёжью чваниться.

Разыменование нулевого указателя всегда приводит к неопределённому поведению

Только в вычислимых контекстах.

Здесь нет UB, несмотря на разыменование NULL-указателя:

#include <stdlib.h>

int main(void) {
	static int *p;
	return sizeof *p == sizeof(int) ? EXIT_SUCCESS : EXIT_FAILURE;
}

Давным-давно стандарт C считался набором рекомендаций, а не сводом правил.

Стандарт всегда считался истиной в последней инстанции.

У меня "думает" по русски.

Да, в режиме "Deep Research" думает по-русски, а в режиме "2.0 Flash Thinking (experimental)" — по-английски.

Колоссальная скорость генерации ответа.
Раз в 10 быстрее, чем ChatGPT/DeepSeek.
Но, правда, по мере увеличения нити обсуждения скорость заметно падает.
Но все равно остаётся высокой, лучше, чем у конкурентов.

"Думает", правда, пока только по-английски.
Но там замечание есть, что эта feature'а — экспериментальная.

"Думает" не так, как другие ИИ.
Такое впечатление, что обучен отдельно от других ИИ.

В целом, схватывает мысли очень чётко и тонко.
Если не тупит и не ошибается, отвечает точно и качественно.
Может ошибаться и в упор не видеть ошибки в простых вещах.
Однако, если пытаться всё сильнее и сильнее разжёвывать, но не выдавать ответа, догадывается самостоятельно.

Хорошо, когда — конкуренция.
Глядишь, нащупают способ и начнут зачатки интеллекта внедрять в эти интуиционные движки.

Легче согласиться пойти на завод?

Для кого — как.
Вообще, это вопрос выбора.
Но чтобы сделать его для себя правильно, важно располагать верной информацией.

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

Знаком, пытался использовать, но получалось хуже. У меня нет точного значения прибыли сколько я получу со сделки. Я выхожу из сделки по состоянию рынка.

На рынке трудно только первые 10 лет, дальше уже становится легче.

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

Вы знакомы с "оптимальным F"?

По-моему, главная проблема в вашем случае ― отсутствие теоретической базы знаний.

Проект постановления по этой ситуации подготовили Минфин, Росфинмониторинг, Банк России и ФНС.

А постановлять-то кто будет?

Не закончатся.

По короткой шкале закончатся через 200 лет, по длинной — через 400.
Не вижу там механизма конструирования названий чисел произвольного размера.

7.5 миллионов биткоинов?
Вы хотите сказать, что у него была треть всех биткоинов мира?

Для многопоточности в C и C++ предназначена библиотека posix-thread.

А где в стандартах C/C++ что-то о posix-thread?

https://en.cppreference.com/w/c/thread

https://en.cppreference.com/w/cpp/thread

Поразительно напоминает autosurfing 20-летней давности, 12dailypro и тому подобное.

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

У интуиции нет смыслов.
Именно поэтому она может откровенно начать бредить.

И это прикол всех больших языковых моделей.

Это — не прикол, это — следствие.
Следствие того, что ИИ — это искусственная интуиция, а не интеллект.

Они выдают результат который кажется правдоподобным.

Именно так и работает интуиция.

Фигура речи? Не слышали.

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

А Вы что, вышеупомянутый джун?

Похоже, вы здесь тупо развлекаетесь, обсуждаемый вопрос вас не интересует, поэтому и "простынь" вам "лень" было обсуждать, ибо там было — по теме.

Господа гусары, мне тут даже и добавить нечего...

О, это потом можно будет вывернуть особенно извращённым способом...

И тут тоже.

Нет, тут выверт с натяжкой получился.

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

Однако вы утверждали, что он так не напишет.

Но не волнуйтесь Вы так

Вы уже не первый раз ошибочно полагаете, что я волнуюсь.
И почему-то считаете, что я "прифигел" от деления на 0.

я тут всё‑таки комментарий на обороте салфетки пишу — а в реальной программе «видишь операцию деления — пиши проверку знаменателя на 0. Это была привычка, выработанная у Штирлица годами.»

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

«Слухи о моей смерти несколько преувеличены»

Причём тут смерть?

Похоже, вы общаетесь с выдуманным вами образом меня, а не со мной, выдумывая касательно меня вещи, которых в реальности не существует.

Наверное это — один из инструментов самообмана для поддержания самоиллюзии:

Время покажет — и я, как обычно, окажусь прав.

В рамках самоиллюзии — не сомневаюсь, что вам это удастся.

А сеньор пишет return(arr.sum(0, n-1) / n) — а потом только меняет n, что занимает примерно полсекунды.

А когда потом n в какой-то момент времени в будущем окажется равным 0, будет очень интересно.

Но я писал несколько не о том.

Остаток Вашей простыни даже разбирать лень.

Вот видите.

Время покажет — и я, как обычно, окажусь прав.

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

Но Вы не волнуйтесь, в будущее могут смотреть не только лишь все.

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

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

Ни к чему хорошему это не приведёт.

например, на вопрос «каким по порядку элементом в массиве [ 1, 2, 3, 3, 8 ] является число 3?» ответом является [3, 4])

Нет, не является.

Данный ответ является ответом на вопрос «какими по порядку элементами в массиве [ 1, 2, 3, 3, 8 ] являются числа 3?»

Тот же вариант вопроса, который привели вы, — неоднозначен: неясно, о каком из двух чисел 3 вопрос.

Чем-то он похож на вопрос о том, сколько дочек у Натали.

 — в том числе и пустое (как, скажем, «каким по порядку элементом в массиве [ 1, 2, 3, 3, 8 ] является число 5?»

Вопрос — неверный (некорректный).

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

В данном вопросе таким (неявным) утверждением является наличие числа 5 в качестве элемента в массиве.

Данное утверждение — ложно, поэтому вопрос — некорректен.

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

Кстати, хвастаться знакомством с ДЛ/ДТЛ, имея ввиду своё неявное превосходство за счёт накопленного опыта, — довольно глупо, потому что то, что было в то время, было очень простым и его было исчезающе мало по сравнению с тем, что есть сейчас.

Но чтобы понять, что ссылаться на это бессмысленно, требуется уже уметь учиться самостоятельно, а не чтобы кто-то учил.

В наши дни ИИ — это искусственная интуиция, а не интеллект, поэтому такие ответы она выдаёт именно потому, что ей так кажется и ни почему больше.

И именно поэтому ИИ не может объяснить свои ответы.

Собственно, человек тоже не может, обращаясь к своей интуиции, объяснить почему ему кажется именно так, а не иначе.

Совершенно никак не может. Но совершенно чётко при этом ощущает, что ему кажется именно так.

Свойство интуиции.

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

Сейчас же ИИ выдаёт лишь то, что ей кажется, не больше.

Именно поэтому у ИИ и имеют место галлюцинации, а также, порой, бесконечная тупость: интуиция — не думает, вместо этого она выдаёт ровно то, что ей кажется, и поэтому ей строго наплевать на логичность или нелогичность выдаваемого.

Какая вообще может быть логичность, когда довольно сильно кажется, что должно быть именно так, а не иначе?

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

Information

Rating
Does not participate
Registered
Activity