[00:53:40] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <Вы правы! Нет подобн…>
да, норм всё. бывает.
Я сам очень сильно удивился, когда расследовал один интересный баг и он, частично, был из за того, что вызов printf был заменен на puts. И это происходило даже при -O0. Как это отключить я тогда не нашел.
[00:56:43] <ada_ru> (I_vlxy_I) но я нашел где это в компиляторе делается 😊 фиксить баг у меня цели не было. надо еще раз глянуть в код, может станет ясно что опция все же есть.
[00:58:24] <ada_ru> (I_vlxy_I) (я смотрел на gcc и clang)
[01:09:35] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <да, норм всё. бывает…>
Ну это не баг, а та же самая instrict-оптимизация. Может. решение можно найти в опциях запуска компилятора. Опция типа "с99". А может его и нет. Ведь компилятор строит правильный код, который выдаёт правильное решение задачи, но за меньшую цену. И на самом деле компиляторы бывают очень умными. И часто напрасно говорят, что можно вручную построить ассемблерный код, который работает быстрее построенного оптимизированным компилятором.
[01:09:52] <ada_ru> (I_vlxy_I) ненене, там был баг наведенный этой оптимизацией
[01:10:16] <ada_ru> (I_vlxy_I) то есть сама оптимизация ок. но баг из за нее - был.
[01:11:44] <ada_ru> (I_vlxy_I) и это был лишь один компонент из нескольких 😊
[01:12:22] <ada_ru> (avkvlru) отвечает (sergey_dukov) на <У вас массив размеро…>
Positive ' Last =2147483647 , даже в самых древних компиляторах. Нечему там переполняться
[01:15:48] <ada_ru> (avkvlru) отвечает (nitrocerber) на <Хммм. Странную хрень…>
Если перенос появляется в конце строки- советую Ada.Text_IO.Put (Str(Str'First..Str'Last-1)) и если не пропадёт Ada.Text_IO.Put (Str(Str'First..Str'Last-2))
[01:16:02] <ada_ru> (avkvlru) Я думаю там всё банальнее- символ CR где-то не удалился.
[01:17:12] <ada_ru> (nitrocerber) Та не, банальный put ("abc") всё равно новую строку даст
[01:17:29] <ada_ru> (avkvlru) хм... щас проверю.
[01:17:32] <ada_ru> (nitrocerber) По ходу close её добавляет
[01:17:44] <ada_ru> (nitrocerber) Текст_ио лайно кароч)
[01:18:38] <ada_ru> (avkvlru) так... э стоп. А Вы что переопредяете консольный вывод? Или все же с файлами?
[01:18:49] <ada_ru> (avkvlru) put(f, "abc")?
[01:19:39] <ada_ru> (avkvlru) Доброе утро кстати
[01:21:44] <ada_ru> (I_vlxy_I) отвечает (avkvlru) на <Доброе утро кстати>
О! С праздником, кстати 😊 https://www.youtube.com/watch?v=Lox9qeY_BzQ
[01:23:10] <ada_ru> (avkvlru) ага.... офигеть
[01:23:13] <ada_ru> (avkvlru) у меня тоже добавил)
[01:23:35] <ada_ru> (avkvlru) а нет стоп, я пут-лайн забил)
[01:26:02] <ada_ru> (avkvlru) мда... с пут тоже самое... Причём в трёх версиях гната!
[01:26:36] <ada_ru> (I_vlxy_I) gnatGnatGNAT!
[01:27:03] <ada_ru> (avkvlru) crlf добавляет... интересно в юниксе тоже 2 символа или lf только?
[01:27:05] <ada_ru> (I_vlxy_I) отвечает (avkvlru) на <мда... с пут тоже са…>
а что вы там за квест такой решаете?
[01:27:19] <ada_ru> (I_vlxy_I) отвечает (avkvlru) на <crlf добавляет... ин…>
1 символ. нафига их там два вообще?
[01:27:31] <ada_ru> (I_vlxy_I) кто придумал в конце строки 2 символа ставить? нигде такого нет!
[01:27:46] <ada_ru> (sergey_dukov) отвечает (avkvlru) на <Positive ' Last =214…>
Но авторы библиотеки как-то умудрились. Возведите длину массива в квадрат. И это уже близко к переполнению. И при индексных операциях использовалась 32-рарядная арифметика на 64-разрядном компьютере. Два миллиарда слишком мало для операций перемножения. Ну в общем авторы библиотеки невнимательно отнеслись к реализации кодов.
[01:28:27] <ada_ru> (avkvlru) Там в момент закрытия текстового файла похоже принудительно добавляется ... сам по себе put нормально работает
[01:30:15] <ada_ru> (avkvlru) with TExt_IO,isf_res, MyConv; use Text_IO,isf_res,MyConv;
with strings_op;use strings_op;
procedure testcons is
F:File_Type;
begin
Create (F,Out_File,"tmp.tmp");
put(f,spc(5,'-'));
put(f,spc(5,'+'));
close(F);
end;
выдаёт:-----+++++CRLF
[01:31:54] <ada_ru> (I_vlxy_I) отвечает (avkvlru) на <with TExt_IO; use Te…>
m.adb:1:14: file "isf_res.ads" not found
m.adb:1:23: file "myconv.ads" not found
m.adb:2:06: file "strings_op.ads" not found
Меня послали нафиг 😞
[01:33:02] <ada_ru> (avkvlru) with TExt_IO; use Text_IO;
--with strings_op;use strings_op;
procedure testcons is
F:File_Type;
--Ch:Character;
begin
Create (F,Out_File,"tmp.tmp");
put(f,"-----");
put(f,"+++++");
-- Get(Ch);
close(F);
end;
[01:33:09] <ada_ru> (avkvlru) сорри, случайно зацепил свои библиотеки
[01:33:14] <ada_ru> (sergey_dukov) В прошлый раз мы подумали, что виноват компилятор, но я определил что это библиотека исполнения, а Максим нашёл конкретное место в библиотеке.
[01:33:34] <ada_ru> (avkvlru) ну тут от символов не зависит походу
[01:38:24] <ada_ru> (I_vlxy_I) $ hexdump tmp.tmp
0000000 2d2d 2d2d 2b2d 2b2b 2b2b 000a
000000b
[01:38:50] <ada_ru> (I_vlxy_I) вот такой результат
[01:39:04] <ada_ru> (nitrocerber) отвечает (avkvlru) на <так... э стоп. А Вы …>
В файл. Там выше где-то было
[01:39:11] <ada_ru> (I_vlxy_I) у меня gcc 9.3.0
[01:40:15] <ada_ru> (nitrocerber) А, ужк разобрались
[01:40:22] <ada_ru> (nitrocerber) Я чот засыпаю уже
[01:40:57] <ada_ru> (avkvlru) Короче фигнёй страдает Close
[01:41:13] <ada_ru> (avkvlru) если with TExt_IO; use Text_IO;
--with strings_op;use strings_op;
procedure testcons is
F:File_Type;
Ch:Character;
begin
Create (F,Out_File,"tmp.tmp");
-- set_output(f);
put(f,"-----");
put(f,"+++++");
Flush(F);
Get(Ch);
close(F);
end;
[01:41:15] <ada_ru> (I_vlxy_I) картинка https://www.ada-ru.org/files/bot/2020-05-08-x5.jpg
[01:41:17] <ada_ru> (I_vlxy_I) во. так наглядней
[01:41:25] <ada_ru> (avkvlru) прервать на Cet(CH) - то файл остаётся 10 символов
[01:41:30] <ada_ru> (I_vlxy_I) добавляет кончик строчки
[01:41:31] <ada_ru> (avkvlru) я думаю надо смотреть set_line)
[01:41:36] <ada_ru> (I_vlxy_I) длина файла - 11 байт
[01:41:39] <ada_ru> (avkvlru) клозе добавляет...
[01:41:58] <ada_ru> (avkvlru) выше пример кода- процесс убить после флуш на вводе- то будет 10 байт
[01:42:00] <ada_ru> (I_vlxy_I) мммм... а знаете что.. для ТЕКСТОВОГО файла это даже правильно
[01:42:26] <ada_ru> (I_vlxy_I) это юниксовое правило - файл ВСЕГДА должен заканчиваться символом перевода строки.
[01:43:04] <ada_ru> (avkvlru) ну... в досе такого правила нет и иногда это может быть сюпризом
[01:43:12] <ada_ru> (I_vlxy_I) открывай файл не в текстовом, а в бинарном режиме - будет тебе щщастье
[01:43:25] <ada_ru> (avkvlru) Longboi - подожди секунду, а как справиться удалось?
[01:43:33] <ada_ru> (avkvlru) Надеюсь принудительно задачу не убивали?
[01:43:44] <ada_ru> (I_vlxy_I) открывай файл не в текстовом виде просто. човы?
[01:43:59] <ada_ru> (avkvlru) Ну тогда вся библиотеке Text_IO обламывается...
[01:44:41] <ada_ru> (I_vlxy_I) c чего бы? Text_IO вроде как может и бинарные штуки воркать. через стримы
[01:44:59] <ada_ru> (avkvlru) хм... вроде нет)
[01:46:20] <ada_ru> (avkvlru) я не вижу в стриме где бы он отдавал текстовский file_type
[01:46:34] <ada_ru> (I_vlxy_I) вансек
[01:47:18] <ada_ru> (I_vlxy_I) procedure Write_PPM(Img : in Image; Filename : in String) is
Ppm : File_Type;
P : Stream_Element_Array (0 .. 2) := (0, 0, 0);
Stream : Stream_Access;
begin
Create(File => Ppm, Name => Filename, Mode => Out_File);
Stream := Text_Streams.Stream (File => Ppm);
Put_Line(Ppm, "P6");
Put(Ppm, Integer'Image(Img'Length(1)));
Put(Ppm, " ");
Put_Line(Ppm, Integer'Image(Img'Length(2)));
Put_Line(Ppm, "255");
for Pxl of Img loop
P(0) := Stream_Element(Pxl.r);
P(1) := Stream_Element(Pxl.g);
P(2) := Stream_Element(Pxl.b);
Write (Stream.all, P);
end loop;
Close(Ppm);
end Write_PPM;
[01:47:19] <ada_ru> (I_vlxy_I) пример моего говнокода
[01:47:43] <ada_ru> (I_vlxy_I) в файлик пишется как текстовый, так и бинарный треш
[01:47:56] <ada_ru> (avkvlru) о как... напрямую можно. Они чьи-то общие субтайпы... не знал
[01:48:30] <ada_ru> (avkvlru) с директом такое не прокатывало.
[01:48:37] <ada_ru> (I_vlxy_I) и никаких концов строк при закрытии.
[01:48:44] <ada_ru> (I_vlxy_I) иначе у меня покорраптился бы ppm файл
[01:49:26] <ada_ru> (I_vlxy_I) (ну и я сейчас специально перепроверил - вконце файла нет никаких концов строк. нормальный бинарный трешак там лежит, все как и надо)
[01:49:54] <ada_ru> (I_vlxy_I) поэтому то, что вы тут обсуждаете, это не бага. это спецификации кусок и так и есть правильно.
[01:52:56] <ada_ru> (avkvlru) так только у меня текст и стрим дружить никак не хотят, пытаюсь понять где прикол.
[01:54:59] <ada_ru> (I_vlxy_I) а попробуй мой говнокод закопипастить
[01:55:05] <ada_ru> (I_vlxy_I) соберется у тебя, или нет?
[01:55:42] <ada_ru> (I_vlxy_I) у меня вот такая шапка у файла:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Text_IO.Text_Streams; use Ada.Text_IO.Text_Streams;
with Ada.Streams; use Ada.Streams;
[01:58:39] <ada_ru> (avkvlru) ну у меня всё равно при закрытии добавилось 2 байта (dos)
[02:00:24] <ada_ru> (I_vlxy_I) хм. гм. странно.
[02:00:47] <ada_ru> (avkvlru) нет я не твой код юзаю, я пока свой... походу надо все же воспользоваться потоком чтобы режим переключился
[02:00:57] <ada_ru> (I_vlxy_I) наверно
[02:03:54] <ada_ru> (avkvlru) не нифига добавляется всё равно
[02:04:02] <ada_ru> (avkvlru) close неумолим... в его момент это делается
[02:04:21] <ada_ru> (avkvlru) -- with TExt_IO; use Text_IO;
-- with Ada.Streams.Stream_IO;
-- --use Ada.Streams.Stream_IO;
-- --with strings_op;use strings_op;
-- with Text_IO.Text_Streams;
-- use Text_IO.Text_Streams;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Text_IO.Text_Streams; use Ada.Text_IO.Text_Streams;
with Ada.Streams; use Ada.Streams;
procedure testcons is
F:File_Type;
Ch:Character:='z';
Stream : Stream_access;
P : Stream_Element_Array (0 .. 1) := (0, 0);
begin
Create (F,Out_File,"tmp.tmp");
Stream:= Text_Streams.Stream (f);
-- Set_Line_Length(f,1000);
-- set_output(f);
put(f,"-----");
put(f,"+++++");
Write (Stream.all, P);
--Flush(F);
-- Get(Ch);
close(F);
end;
[02:17:09] <ada_ru> (avkvlru) Короче хочешь не хочешь, а close добавит в конец текстового файла свои 2 байта(((
[02:17:28] <ada_ru> (avkvlru) а обратного преобразования stream-> file нет.
[02:17:34] <ada_ru> (I_vlxy_I) о! кстати! а если записать вхвост бинарные данные?
[02:17:41] <ada_ru> (avkvlru) а я это и делаю...
[02:17:42] <ada_ru> (I_vlxy_I) у меня ж бинарь записан в хвосте
[02:17:46] <ada_ru> (avkvlru) посмотри код
[02:17:50] <ada_ru> (I_vlxy_I) ага. вижу :-/
[02:17:54] <ada_ru> (I_vlxy_I) я ничего тогда не понимаю
[02:18:01] <ada_ru> (avkvlru) я и сначала пробую и с конца...
[02:18:54] <ada_ru> (I_vlxy_I) Вот хвост моего файла. Никаких \n или \r https://www.ada-ru.org/files/bot/2020-05-08-x6.jpg
[02:20:26] <ada_ru> (I_vlxy_I) Погодь. У тебя Create в плане Mode отличается
[02:20:51] <ada_ru> (I_vlxy_I) А, нет. не отличается...
[02:22:04] <ada_ru> (I_vlxy_I) единственный шанс объяснить происходящее - списать на особенности винды
[02:22:20] <ada_ru> (I_vlxy_I) щща попробую твой кот
[02:23:36] <ada_ru> (I_vlxy_I) не получается списать - у меня та же фигня.
[02:23:43] <ada_ru> (I_vlxy_I) надо думать :-/
[02:26:43] <ada_ru> (I_vlxy_I) еще вариант - другие опции компиляции
[02:27:13] <ada_ru> (avkvlru) хм... у меня -o2
[02:27:17] <ada_ru> (avkvlru) и всё!
[02:28:00] <ada_ru> (I_vlxy_I) именно
[02:28:13] <ada_ru> (I_vlxy_I) и там где у меня воспроизводится твоя проблема - у меня тоже больше ничего
[02:28:24] <ada_ru> (I_vlxy_I) а там где все ок, то собиралось из под gps и проекта 😊
[02:29:10] <ada_ru> (avkvlru) ну сие пиздец. простите)
[02:29:12] <ada_ru> (I_vlxy_I) проверил - не в этом дело 😞
[02:32:06] <ada_ru> (avkvlru) остаётся предположить что дело в имени файла)))
[02:33:18] <ada_ru> (avkvlru) Или же у тебя цепляется некий иной File_Type...
[02:35:34] <ada_ru> (I_vlxy_I) но с чего бы? шапка с with и use идентичная же!
[02:48:32] <ada_ru> (I_vlxy_I) нифига не понимаю
[02:49:08] <ada_ru> (I_vlxy_I) ладно, разберусь завтра.
[17:32:49] <ada_ru> (reznikmm) А вот в gcc есть
Built-in Function: int __builtin_constant_p (exp)
You can use the built-in function __builtin_constant_p to determine if a value is known to be constant at compile time and hence that GCC can perform constant-folding on expressions involving that value. The argument of the function is the value to test. The function returns the integer 1 if the argument is known to be a compile-time constant and 0 if it is not known to be a compile-time constant. A return of 0 does not indicate that the value is not a constant, but merely that GCC cannot prove it is a constant with the specified value of the -O option.
[17:34:08] <ada_ru> (Gnomus12) .tut
[17:55:00] <ada_ru> (reznikmm) О, даже работает :)
[17:55:24] <ada_ru> (I_vlxy_I) это и в аде можно юзать?
[18:01:35] <ada_ru> (I_vlxy_I) отвечает (a) на <>
Кстати, какие ощущения от кресла? удобное?
[18:18:26] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <это и в аде можно юз…>
Да, даже работает, только надо ставить прагму Inline_Always
[18:33:28] <ada_ru> (I_vlxy_I) отвечает (avkvlru) на <остаётся предположит…>
я думал-думал, я всё понял! оно тупо хитрое. и тупое.
[18:34:00] <ada_ru> (I_vlxy_I) оно добавляет в конец файла перевод строки если последней текстовой командой не было Put_Line
[18:34:39] <ada_ru> (I_vlxy_I) То есть делаем Put_Line, а потом фигарим бинарные данные, тогда в конце файла перевода строки не будет.
[18:36:06] <ada_ru> (I_vlxy_I) но любой текстовый блок, похоже, обязан заканчиваться концом строки.
[18:36:40] <ada_ru> (I_vlxy_I) теперь хотелось бы прочитать в каком месте Аццкого стандарта это требование описано 😊
[18:47:27] <ada_ru> (Gourytch) а кроме Text_IO нельзя разве нмкаких других файловых потоков юзать? Stream I/O нопремер?
[18:48:07] <ada_ru> (Gourytch) думаю он не будет подстраивать тогда. что заWRITEил - то и заврайтилось.
[18:57:48] <ada_ru> (I_vlxy_I) ну вот да. нужны какие-то альтернативы, наверное
[18:59:03] <ada_ru> (mister_alexander) отвечает (Ignatylin) на <>
Ada или Раст?
[18:59:40] <ada_ru> (mister_alexander) 10
[19:11:04] <ada_ru> (Gourytch) отвечает (mister_alexander) на <Ada или Раст?>
прям как "Адой раз или Растом в глаз?" =)
[19:11:23] <ada_ru> (mister_alexander) Есть два стула...
[19:11:52] <ada_ru> (mister_alexander) предлагаю выкинуть человека, или не человека, которые не умеет отвечать на сообщения
[19:12:03] <ada_ru> (mister_alexander) И вообще, пора повесить welcome бота
[19:26:12] <ada_ru> (a) отвечает (I_vlxy_I) на <Кстати, какие ощущен…>
Удобное. Только спустя некоторое время кажется поршень стал проседать понемногу. Соскальзывает. Смазку стираешь насухо нормально. Потом снова скользить начинает. Пока непонятно как с таким бороться.
[20:32:22] <ada_ru> (I_vlxy_I) https://github.com/eonteam/eon-tools-windows/blob/e9e6255f98f05ef3ad41d774f7cfa10a463d2280/make/lib/gcc/mingw32/8.2.0/adainclude/a-textio.adb#L156
[20:32:44] <ada_ru> (I_vlxy_I) Вот полная логика происходящего
[20:32:45] <ada_ru> (I_vlxy_I) https://github.com/eonteam/eon-tools-windows/blob/e9e6255f98f05ef3ad41d774f7cfa10a463d2280/make/lib/gcc/mingw32/8.2.0/adainclude/a-textio.adb#L2037
[20:33:01] <ada_ru> (I_vlxy_I) @nitrocerber @avkvlru
[20:55:50] <ada_ru> (I_vlxy_I) Насколько я понимаю, нужно юзать не Text_IO, а Sequential_IO
[21:37:33] <ada_ru> (reznikmm) В msys2 сломалась Ада при апдейте на gcc 10 😕
https://github.com/msys2/MINGW-packages/pull/6463
[21:39:20] <ada_ru> (reznikmm) > ld.exe: error: export ordinal too large: 65957
Что бы это могло быть?
[21:40:39] <ada_ru> (reznikmm) There are too many symbols for compiling the DLLs, b
[23:18:01] <ada_ru> (I_vlxy_I) rustRustRUST! https://habr.com/en/news/t/498794/
[23:19:06] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <> ld.exe: error: exp…>
кажется это не первый раз https://github.com/assimp/assimp/issues/1886
[23:22:09] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <rustRustRUST! https:…>
Ппц 😕. А мы?
[23:28:10] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <Ппц 😕. А мы?>
ы?
[23:29:06] <ada_ru> (reznikmm) да ну, по аде никто ничего не пишет и не переводит 😕
[23:32:46] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <да ну, по аде никто …>
а что там переводить? единственный слабенький аналог The Book по расту - это learn.adacore.com
[23:34:04] <ada_ru> (I_vlxy_I) на русском оно вот так выглядит: https://doc.rust-lang.ru/book/ch03-03-how-functions-work.html
[23:34:27] <ada_ru> (I_vlxy_I) эта штука - интерактивная. бумажная книжка это конечно хорошо, но это уже для очень тонких ценителей.
[23:34:48] <ada_ru> (I_vlxy_I) и у бумажной книги сильно урезан функционал
[23:39:13] <ada_ru> (I_vlxy_I) ААААА!!!1
Java and Ada both provide support for concurrency in the language. The C++ language has added a concurrency facility in its most recent revision, C++11, but we are assuming that most C++ programmers are not (yet) familiar with these new features. We thus provide the following mock API for C++ which is similar to the Java Thread class
[23:39:25] <ada_ru> (I_vlxy_I) /me facepalm.jpg
[23:39:47] <ada_ru> (I_vlxy_I) этим new features уже 10 лет 😃
[23:40:14] <ada_ru> (I_vlxy_I) за это время некоторые успевают уже родиться и закончить младшую школу 😊
[23:41:00] <ada_ru> (I_vlxy_I) в плюсах уже корутины вкрутили, а тут про std::thread стесняются рассказать.
[23:41:04] <ada_ru> (I_vlxy_I) и применить
[23:41:44] <ada_ru> (I_vlxy_I) ну, то есть крестовику-затейнику на learn.adacore.com читать курс Ada for C++ or Java Developer очень смешно. до боли