Opened 5 years ago

Closed 4 years ago

#396 closed ожидаются исправления (задача сдана)

WW #5

Reported by: vorobeva.polina Owned by: vorobeva.polina
Component: WW_c_io Version: 3.0
Keywords: Cc:

Description

Привет. Не совсем понимаю, как сделать более хорошую обработку аргументов командной строки - писать много if'ов не хочется, а если передавать (void*)argv[i] вместо print - происходит что-то очень странное.

Сделаны print (через apply), чтение текстовых файлов и вывод в них.

Change History (10)

comment:1 Changed 5 years ago by vorobeva.polina

Добавлен count

comment:2 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to vorobeva.polina
Type: ожидается проверкаожидаются исправления

Аргументы командной строки норм, только лучше ещё i++ делать после очередной операции. А то вдруг будет файл с именем loadtext.

Корректность 4.5/7 :

  1. Вообще в задании все аргументы стоят на фиксированных местах, так что у вас цикл сломается при загрузке из файла с именем loadtext (+0.5).

Стиль 1.5/3:

  1. В apply объявите переменную node внутри for.
  2. Удалите закомментированный код.
  3. Пробелы между бинарными операторами (пройдитесь автоформаттером).
  4. Объявите int x, y; сразу перед циклом.
  5. Не пишите пробел между %d в scanf.
  6. strcmp() == 0 - просто !strcmp()

comment:3 Changed 5 years ago by Egor Suvorov

P.S. Попытка засчитана, окончательный дедлайн - 3 ноября, 22:59.

comment:4 Changed 4 years ago by vorobeva.polina

Owner: changed from vorobeva.polina to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Не совсем поняла, почему цикл может сломаться при загрузки данных из файла loadtext... Если его передавать без расширения - ломается не цикл, а если с расширением, то все все равно будет ок.

И еще не совсем поняла пункт 1 из стиля. Если node убрать в for, то получится, что я обращаюсь еще к несуществующей переменной.

comment:5 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to vorobeva.polina
Type: ожидается проверкаожидаются исправления

Про цикл: не очень точно посмотрел, да. Происходило бы следующее: ./lab_05 loadtext loadtext count, загружаете данные из файла loadtext, а на следующей итерации цикл снова видит loadtext и пытается открыть файл с именем count. Не получается, после этого наверняка UB, когда передаём NULL в fscanf.

Про стиль: можно написать for (intrusive_node *node = head->next; ....... Посмотрите, получится ли лучше, отпишитесь в тикете.

По корректности 5.5/7:

  1. Чтение из бинарных файлов вызывает UB.
  2. make_bytes — UB, у вас не строки в стиле Си. strcpy совсем не по делу получается.

По стилю 1.5/3:

  1. Неясно, зачем проверка i == 1 при loadtext. Как минимум, её нет при loadbin, получается несимметрично.
  2. i++ для команды count не нужен. Вы так пропустите аргумент после count (который, судя по остальному коду, вы считаете допустимым).
  3. loadtext — лучше не != EOF, а == 2. Чтобы остановиться в том случае, если в файле какая-то фигня, а не продолжить добавлять левые точки.
  4. fnt --> format.
  5. Пробелов в loadbin не хватает, автоформаттер.
  6. savebin: неясно, откуда взялось число 18 в размере массивов. Неясно, зачем два отдельных массива.
  7. savetext принимает не file_name.
  8. Несимметрично: savetext — это функция для apply, а вот savebin — уже отдельная функция. Сделайте везде однообразно.

comment:6 Changed 4 years ago by vorobeva.polina

Owner: changed from vorobeva.polina to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Убрала intrusive_node в начальное условие for'а)

По корректности - у меня был очень неправильный make_bytes (я неправильно поняла условие про 6N байт), который и вызывал UB как в savebin, так и в loadbin. Вроде, исправила)

По стилю - пункты 1-5 переделаны;
В 6 я не очень понимаю, как там можно одним массивом обойтись... Поэтому использую 2;
7-8: сделала единообразно - везде отдельные функции, через apply выражены только print и count:)

comment:7 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to vorobeva.polina
Type: ожидается проверкаожидаются исправления

По корректности 5.5/7:

  1. Всё ещё возникает UB при выводе точек из бинарного файла. Исходная проблема — в loadbin. Валгринд ловит.

По стилю 2/3:

  1. Пробелы, автоформаттер.
  2. В make_bytes параметр — не строчка, входное число — скорее не n, а value (потому что не количество чего-то, а просто значение). Вместо цикла for лучше memmove.
  3. Одним массивом можно сделать, если передавать в качестве параметра make_bytes не начало массива, а середину.
  4. Добавьте пустую строку между циклом парсинга аргументов и деинициализацией.

comment:8 Changed 4 years ago by vorobeva.polina

Owner: changed from vorobeva.polina to Egor Suvorov
Type: ожидаются исправленияожидается проверка

UB вроде как исчез, valgrind у меня не ругается:)

comment:9 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to vorobeva.polina
Type: ожидается проверкаожидаются исправления

Корректность есть, 7/7.

По стилю 2/3, актуальны пробелы вокруг всяких =. Ещё:

  1. make_bytes можно вообще без memmove, просто записать напрямую в data.

comment:10 Changed 4 years ago by Egor Suvorov

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.