Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2022, 04:24   #1
Kcritic
Новичок
Джуниор
 
Регистрация: 12.05.2022
Сообщений: 1
По умолчанию Matlab. Ошибка в коде.

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



Код:
% Написать программу, состоящую из трёх функций: главная функция с тестовыми данными и две локальные функции:
% - преобразование произвольной структуры (которая может содержать вложенные структуры) в файл в формате JSON.
% - преобразование файла в формате JSON в структуру MatLab/Octave.
% Не реализовывать весь стандарт (т.к. он огромен), а всего лишь базовую запись в файл и чтение обратно в MatLab/Octave.
% Программа должна учитывать отступы в соответствии с уровнем вложенности структур.
% Учесть, что числа должны храниться как числа (без кавычек), а строки как строки (в кавычках).
% Пример структуры:
% person = struct('firstName', 'Иван', 'lastName', 'Иванов', 'phoneNumber', '812 123-1234');
% person.address = struct('streetAddress', 'Московское ш., 101, кв.101', 'city', 'Ленинград', 'postalCode', 101101);
% Пример записи в JSON:
%
% {
%    "firstName": "Иван",
%    "lastName": "Иванов",
%    "phoneNumber": "812 123-1234",
%    "address": {
%        "streetAddress": "Московское ш., 101, кв.101",
%        "city": "Ленинград",
%        "postalCode": 101101
%    }
% }
% По возможности реализовать различные проверки на валидность JSON.



% Главная функция.
function format_json_new(stucture,varargin)
% Тестовые данные.
person = struct('firstName', 'Иван', 'lastName', 'Иванов', 'phoneNumber', '812 123-1234');
person.address = struct('streetAddress', 'Московское ш., 101, кв.101', 'city', 'Ленинград', 'postalCode', 101101);
person.orientation = 'getero';
person.hobby = struct('Sport', 'Voleyball', 'achievement', 'Master', 'Victories', 124);
person.character = struct('Introversion', 'ExtraVert', 'Temperament', 'Chorelic', 'IQ', 120);
position=0;
count_nesting=0;
count_if=0;
if nargin==0
    % Реализация тестовых данных.
    matlab_to_json_new(person,position,count_nesting,count_if);
else
    % Релализация введённых данных.
    matlab_to_json_new(stucture,position,count_nesting,count_if);
end
end



% Локальная функция перевода формата matlab/octave в json.
function matlab_to_json_new(structure,position,count_nesting,count_if)
% Cоздаем счётчик вложенности структур рекурсивной функции.
count_nesting=count_nesting+1;
% Загружаем исходные данные в массивы ячеек полей и их значений.
fields=fieldnames(structure);
for index=1:length(fields)
    values_fields{index,:}=getfield(structure,fields{index,:}); %#ok<AGROW>
end
% Проверяем какие из полей являются структурами.
N=0;
for index=1:length(values_fields)
    if isstruct(values_fields{index,:})==1
        position_structure(index,:)=1; %#ok<AGROW>
    else
        position_structure(index,:)=0; %#ok<AGROW>
    end
    if position_structure(index,:)==1
        N=N+1;
    end
end
% Массив ячеек полей структур.
array_position_structure=[];
for index=1:length(values_fields)
    if position_structure(index,:)==1
        array_position_structure(index,:)=index; %#ok<AGROW>
    end
end
array_position_structure(array_position_structure==0)=[];
for index=1:N
    massive_structure{index,:}=values_fields{array_position_structure(index,:),:}; %#ok<AGROW>
end
% Создаем в формате записи файл, в котором будет содержаться json запись.
file_json=fopen("format_json.txt","r+");
% Заполнение файла format_json.txt.
fseek(file_json,position-1,"bof");
fprintf(file_json,'{\n');
for index=1:count_nesting*3
    massive_space(1,index)=char(32); %#ok<AGROW>
end
for index=1:length(fields)
    fprintf(file_json,massive_space);
    % Заполняем значения только полей заданных строками.
    if position_structure(index,:)==0
        fprintf(file_json,['"',fields{index,:},'": "',values_fields{index,:},'"']);
        fprintf(file_json,'\n');
    else
        fprintf(file_json,['"',fields{index,:},'": ']);
        fprintf(file_json,'\n');
    end
end
if count_nesting~=1
    for index=1:(count_nesting-1)*3
        massive_space_two(1,index)=char(32); %#ok<AGROW>
    end
    fprintf(file_json,massive_space_two);
end
fprintf(file_json,'}\n');
% Закрываем файл.
fclose(file_json);
% Открываем файл в формате записи и чтения.
file_json=fopen("format_json.txt","r+");
% Заполняем значения полей, которые не являются структурами.
fseek(file_json,0,"bof");
% Вводим счётчик строк.
count_line=0;
% Счётчик условий структур.
while feof(file_json)~=1
    line=fgetl(file_json);
    % Пропуск первой и последней строки, т.к. в строках только фигурные скобки.
    if length(line)<2
        continue
    end
    count_line=count_line+1;
    % Находим поля заданные структурами.
    disp(count_line);
    if position_structure(count_line,:)==1
        position=ftell(file_json);
        count_if=count_if+1;
        % Локальная функция, которая сохраняет все последующие строки в
        % резервный файл.
        position_carriage=ftell(file_json);
        save_line(position_carriage);
        del_line(position_carriage);
        disp(massive_structure);
        disp(count_if);
        matlab_to_json_new(massive_structure{count_if,:},position,count_nesting);
        file_end=fopen("format_json_backup_end.txt","r");
        fclose(file_json);
        file_json=fopen("format_json.txt","a");
        fseek(file_end,0,"bof");
        fseek(file_json,0,'eof');
        while feof(file_end)~=1
            line_end=fgetl(file_end);
            fprintf(file_json,line_end);
            fprintf('\n');
        end
        fclose(file_json);
        file_json=fopen("format_json.txt","r+");
    end
end
% % Закрываем файл.
fclose(file_json);
end



% Локальная функция сохранения последующих данных, начиная с положения каретки файла, в резервный файл.
function save_line(position_carriage)
file=fopen("format_json.txt","r");
% Создание резервного файла.
backup=fopen("format_json_backup_end.txt","w");
fseek(file,position_carriage,"bof");
while feof(file)~=1
    line=fgetl(file);
    fprintf(backup,line);
    fprintf(backup,'\n');
end
% Закрытие резервного файла.
fclose(backup);
fclose(file);
end



% Локальная функция удаления последующих данных, начиная с положения
% каретки файла.
function del_line(position_carriage)
file=fopen("format_json.txt","r");
% Создание резервного файла.
backup=fopen("format_json_backup_start.txt","w");
fseek(file,0,"bof");
while feof(file)~=1
    if ftell(file)==position_carriage
        break
    end
    line=fgetl(file);
    fprintf(backup,line);
    fprintf(backup,'\n');
end
% Закрытие резервного файла.
fclose(backup);
fclose(file);
end
Kcritic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Ошибка. Компилируется, но не запускается. Ошибка duplicate class. Проблема не в коде. nevender Общие вопросы по Java, Java SE, Kotlin 2 13.02.2016 13:24
MATLAB.Модель нейрона.Где ошибка? Tolian92 Помощь студентам 0 03.06.2015 23:52
MatLab. Объясните, пожалуйста, места в коде Shouldercannon Помощь студентам 2 14.12.2014 22:55
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58