Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 23.04.2020
Сообщений: 7

Передать класс (объект) во внешнюю функцию

23.04.2020, 17:41. Показов 2243. Ответов 6

Студворк — интернет-сервис помощи студентам
Имеем класс свойств, на основе которого созданы несколько экземпляров класса.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
classdef species
       
properties
    mass;                    
    charge;                 
    spwt;                    
    
    np;                      
    np_alloc;                
    part;                   
 
end
К экземплярам класса необходимо применить функцию, изменяющую свойства экземпляра (аргументы x,v подтягиваются из другой функции). Вопрос, как написать функцию AddParticle, в которой один из входных аргументов будет классом, чтобы затем в программе вызывать функцию с входными аргументами в виде экземпляров.

Matlab M
1
2
3
4
5
6
7
8
function [ ??? ] = AddParticle(species, x,v)
 
    species.part.x = x;
    species.part.v = v;
        
    np+np+1;
 
end
На языке C++ это реализовано следующим образом
C++
1
2
3
4
5
6
7
8
9
void AddParticle(Species *species, double x, double v)
{
    species->part[species->np].x = x;
    species->part[species->np].v = v;
        
    species->np++;
}
 
AddParticle(&electrons,x,v)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2020, 17:41
Ответы с готовыми решениями:

Как передать массив в функцию и класс в объект?
Задача- треугольники у нас, заданы точками которые классы. Надо создать массив из них и вычислить какие из них какого вида и найти маx и...

Как передать метод класса во внешнюю функцию?
Необходимо чтобы пользователь выбрал метод класса и передал его в качестве аргумента функции

Как передать аргумент в внешнюю функцию к которой обращение из другой фунеции
function f1(x) { //как добавить в это поле видимости y который = 5 (let end = f2(f1,5);) return alert('f1:'+x+y); }; ...

6
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
23.04.2020, 17:53
1604C6F22, создайте метод класса:
Matlab M
1
2
3
4
5
6
7
methods               
    function AddParticle(species, x, v)
        species.part.x = x;
        species.part.v = v;        
        species.np = species.np + 1;
    end
end
1
0 / 0 / 0
Регистрация: 23.04.2020
Сообщений: 7
24.04.2020, 13:44  [ТС]
Однако, когда я буду использовать этот метод класса во внешней функции, то все значения будут записываться в одну ячейку. В приведённом примере на C++, это реализовано через указатель
C++
1
species->part[species->np].x = x
когда я добавляю индексацию к вашему ответу

Matlab M
1
2
3
4
5
  function AddParticle(species, x, v)
        species.part(species.np).x = x;
        species.part(species.np).v = v;        
        species.np = species.np + 1;
    end
получаю ошибку в этой строке "Structure assignment to non-structure object."
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
24.04.2020, 14:28
1604C6F22, посмотрите:
Класс:
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
classdef species < handle
    
    properties
        mass;
        charge;
        spwt;
        
        np;
        np_alloc;
        part;
        
    end
    
    methods
        
        function obj = species()
            obj.mass = [];
            obj.charge = [];
            obj.spwt = [];
            obj.np = 0;
            obj.np_alloc = [];
            obj.part = [];
        end
        
        function AddParticle(species, x, v)
            species.part.x = x;
            species.part.v = v;
            species.np = species.np + 1;
        end
    end    
end


Вызов:
Matlab M
1
2
3
4
5
6
7
clear; clc;
 
sp1 = species();
sp2 = species();
 
AddParticle(sp1, 1, 2);
AddParticle(sp2, 3, 4);
1
0 / 0 / 0
Регистрация: 23.04.2020
Сообщений: 7
24.04.2020, 16:59  [ТС]
Полностью согласен, но повторюсь я вызываю AddParticle внутри функции, а не вручную присваиваю ей значения

Вызов:
Matlab M
1
2
3
4
5
6
7
8
9
10
p=0;
while p<NUM_IONS
    
        x = domain.x0 + p*delta_ions;
        v = 0;                           
        AddParticle(species,x,v);
        p=p+1;
        
end
clear p;
По итогу, структура Part экземпляра класса содержит всего 2 поля по одной ячейке x,v.
В примере на С++ с указателем получается массив x, v размером [0;NUM_IONS]
Миниатюры
Передать класс (объект) во внешнюю функцию  
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
24.04.2020, 17:32
Лучший ответ Сообщение было отмечено 1604C6F22 как решение

Решение

1604C6F22, небольшие правки. Просто сразу сложно понять, что вы хотите в итоге получить. Вы вызываете функцию AddParticle с параметром species. Вы создали объект класса species и назвали его species? Если так, то плохой подход, который не даст желаемого результата.
Класс
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
classdef species < handle
    
    properties
        mass;
        charge;
        spwt;
        
        np;
        np_alloc;
        part;
        
    end
    
    methods
        
        function obj = species()
            obj.mass = [];
            obj.charge = [];
            obj.spwt = [];
            obj.np = 0;
            obj.np_alloc = [];
            obj.part.x = [];
            obj.part.v = [];
        end
        
        function AddParticle(obj, x, v)
            obj.part.x(end+1) = x;
            obj.part.v(end+1) = v;
            obj.np = obj.np + 1;
        end
    end    
end


Запуск
Matlab M
1
2
3
4
5
6
7
8
9
10
11
clear; clc;
 
sp1 = species();
 
p = 0;
while p < 10    
        x = p^2;
        v = 0;                           
        AddParticle(sp1,x,v);
        p = p+1;      
end
0
0 / 0 / 0
Регистрация: 23.04.2020
Сообщений: 7
24.04.2020, 19:03  [ТС]
Спасибо, это работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2020, 19:03
Помогаю со студенческими работами здесь

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Передать объект в класс
Доброго времени суток Есть класс MySqlDB, где находятся методы управления базой данных. Создаем его объект $MySql = new MySqlDB(); ...

Как передать ссылку на объект в класс
Здравствуйте! Подскажите, пожалуйста, почему не работает: log.h class LogClass { public: bool InitializeLog(); void...

Как из main передать объект в класс
В классе main я создал объект класса Company public class Main { public static void main(String args) { Company...

Не могу передать объект в функцию
Добрый день. Не получается получить доступ к атрибутам объекта User из функции Galerey. Что я делаю не так? import requests, re,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru