Как передать массив в класс
Перейти к содержимому

Как передать массив в класс

  • автор:

 

как передать массив в класс

Поискал по всему форуму так и не нашел примера как передать массив в класс.

Вот что я пишу. Но не компилируется. Напишите как надо.

  • Рациональные приемы (предложения) ускорения оптимизатора
  • Вопросы от "чайника"
  • насколько реально реализовать такую идею?

Поискал по всему форуму так и не нашел примера как передать массив в класс.

Вот что я пишу. Но не компилируется. Напишите как надо.

так тоже не компилируется

Поискал по всему форуму так и не нашел примера как передать массив в класс.

Вот что я пишу. Но не компилируется. Напишите как надо.

А без ArrayCopy никак не обойтись ?

А без ArrayCopy никак не обойтись ?

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

Так массива в классе нет.
Я в ООП не силен потому и спрашиваю.

В моем понимании если в класс передается ссылка на массив ТО почему нужно копировать в класс массива (что достаточно затратно) , если по идее можно взять указатель и получить этот же массив но уже в классе?

Надеюсь я понятно выразился.

Так массива в классе нет.
Я в ООП не силен потому и спрашиваю.

В моем понимании если в класс передается ссылка на массив ТО почему нужно копировать в класс массива (что достаточно затратно) , если по идее можно взять указатель и получить этот же массив но уже в классе?

Надеюсь я понятно выразился.

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

  • Бесплатные приложения для трейдинга
  • Форексный VPS бесплатно на 24 часа
  • 8 000+ сигналов для копирования
  • Экономические новости для анализа финансовых рынков

Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.

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

Как передать массив конструктору?

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

Вот упрощенная версия того, над чем я работаю:

Может кто-нибудь объяснить, почему это не работает и как правильно передать массив? Кроме того, я не хочу копировать массив. (И действительно ли мне нужно отступать каждую строку на 4 пробела для кода? Это довольно утомительно.)

6 ответов

В этом случае лучше всего использовать ссылку на массив:

Несколько преимуществ — без копирования массива, и компилятор будет обеспечивать, чтобы был принят правильный массив размера.

Недостатки в том, что массив, который вы инициализируете объект board , должен жить как минимум до тех пор, пока объект и любые изменения, внесенные в массив вне объекта, «отражены» в состоянии объекта. но эти недостатки возникают, если вы используете указатель на исходный массив (в основном, только копирование массива устраняет эти недостатки).

Еще один недостаток заключается в том, что вы не можете создать объект с помощью указателя на элемент массива (который является тем, что параметры функции массива «распадаются», если размер массива не указан в объявлении параметра). Например, если массив передается через параметр функции, который действительно является указателем, и вы хотите, чтобы эта функция могла создать объект board , относящийся к этому массиву.

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

Вы не можете назначать массивы, а параметр типа T[] совпадает с T* . Так

Разыменовывает указатели на state и arr и присваивает первый элемент arr первому элементу state .

Если вы хотите скопировать значения из одного массива в другой, вы можете использовать std::copy :

Альтернативно, вы должны посмотреть std::array<int> , который ведет себя точно так же, как вы предполагали, что массивы ведут себя:

Пишем свою библиотеку

В этом уроке мы научимся писать собственные библиотеки для Arduino и разберём некоторые типовые вопросы по взаимодействию кода в библиотеке и кода в скетче (в главном файле программы). Это третий урок, который относится к библиотекам: обязательно прочитайте и усвойте урок про объекты и классы из блока программирования, и урок по использованию библиотек из блока базовых уроков, а также урок про создание функций. В этом уроке мы будем использовать все наши предыдущие знания, так что рекомендую разобраться со всем, что было непонятно. Писать библиотеки очень удобно в текстовом редакторе Notepad++ (официальный сайт) – так называемом блокноте программиста. Данный блокнот распознаёт и подсвечивает синтаксис, умеет в автодополнение текста и расширенный поиск, и многое многое другое. Безумно рекомендую работать именно в нём, если вы не умеете пользоваться Microsoft Visual Studio и прочими серьёзными средами разработки. Также рекомендую к прочтению вот этот урок с сайта Arduino.ru, в нём кратко пошагово рассказывают о создании библиотеки без излишеств. Если будете компилировать пример из этой статьи – замените WProgram.h на Arduino.h.

Разбираемся с файлами

Библиотека – это в первую очередь текстовый файл с кодом, который мы можем подключить в свой скетч и использовать имеющиеся там команды. Библиотека может иметь несколько файлов или даже папок с файлами, но подключается всегда один – главный заголовочный файл с расширением .h, а он в свою очередь подтягивает остальные необходимые файлы. В общем случае библиотека имеет такую структуру (название библиотеки testLib):

  • testLib – папка библиотеки
    • examples – папка с примерами
    • testLib.h – заголовочный файл
    • testLib.cpp – файл реализации
    • keywords.txt – карта подсветки синтаксиса

    Иногда файлы .h и .cpp могут находиться в папке src. Все файлы и папки, кроме заголовочного .h, являются необязательными и могут отсутствовать, т.е. библиотека может состоять только из заголовочного файла. В таком виде библиотека лежит в папке со всеми остальными библиотеками и может быть подключена в скетч при помощи команды #include. Вообще есть два места, где программа будет искать библиотеку (именно файл библиотеки):

    • Папка со скетчем
    • Папка с библиотеками

    Соответственно команда include имеет два варианта поиска файла, название заключается в <> или “”:

     

    • #include <файл.h> – будет искать файл в папке с библиотеками
    • #include “файл.h” – попробует найти файл в папке со скетчем, если не найдёт – пойдёт искать в папку с библиотеками

    Выглядит это вот так:

    Основа библиотеки

    Давайте заполним наш файл testLib.h, нашу тестовую библиотеку, минимальным кодом для работы:

    Конструкция из директив препроцессора запрещает повторное подключение библиотеки и в целом является необязательной, но лучше не лениться и писать так. Файл библиотеки testLib.h находится в папке testLib в папке со всеми остальными библиотеками. Также мы подключаем основной файл Arduino.h для использования ардуино-функций в своём коде. Если таковых нет – его можно не подключать. Также подключаем testLib.h в наш тестовый скетч, как на скриншоте в прошлой главе. Конструкцию с #ifndef-define вы найдёте практически во всех библиотеках. На текущих версиях IDE (и, соответственно версии компилятора) можно делать так:

    Конструкция pragma once говорит компилятору, что данный файл нужно подключить только один раз, это просто короткая альтернатива #ifndef-define. Дальше будем использовать её

    Передает ли Java массив по ссылке на Method?

    Веб-разработка на Java

    Программирование и разработка

    Передает ли Java массив по ссылке на метод? Да, и это единственный способ передать массив функции в Java. В Java функция называется методом и является членом класса. Больше хороших новостей! Метод в Java может возвращать массив, и это по ссылке. Идентификатор массива является ссылкой.

    Напомним: типичный программный файл Java имеет основной класс с методом main(). Имя основного метода — main. Однако имя основного класса не является основным. Это имя, выбранное программистом. Это также имя файла. Этот основной класс может иметь другие члены (свойства и функции). Другие классы вне основного класса могут иметь свои свойства и методы. В этой статье метод main не связан с передачей и возвратом массива. В Java свойство называется полем.

    А также в этой статье показано, как передать массив методу и вернуть массив из метода по ссылке. Класс массива не нужно импортировать для этой программы.

    Метод в отдельном классе

    Передача по ссылке

    В этом разделе статьи метод получения массива находится в отдельном классе, а не в основном классе. Пример такого класса:

    Имя этого дополнительного класса — Aclass. Он имеет только один член, который является методом. Имя метода func. Он имеет только один параметр, который является объявлением массива. Он возвращает символ. Возвращаемый символ находится на третьей позиции полученного массива (индекс 2).

    В методе main() можно использовать следующий фрагмент кода:

    Первый оператор в этом сегменте кода определяет массив. Второй оператор объявляет объект obj из класса AClass. Следующий оператор вызывает метод объекта с именем массива (ссылкой) в качестве аргумента. Последний оператор выводит третий символ (индекс 2) массива, полученного вызванным методом. Выход будет C.

    Эти два сегмента кода показывают, как массив передается в метод по ссылке.

    Возврат по ссылке

    Приведенный выше класс изменен для метода, возвращающего массив по ссылке, следующим образом:

    Возвращаемое выражение в сигнатуре метода — это char[], а не просто char. Выражение return оператора return теперь является именем массива в параметре и больше не является элементом массива.

    Соответствующий сегмент кода в методе main() изменяется следующим образом:

    Тип возвращаемого значения вызова метода — массив, а не просто char. Массив по-прежнему передается в качестве аргумента так же, как и раньше. Последний оператор здесь печатает значение элемента возвращаемого массива.

    Приведенные выше две программы показывают, как массив может быть передан по ссылке и как массив может быть возвращен по ссылке.

    Метод в основном классе

    Передача по ссылке

    В этом разделе статьи метод получения массива находится в основном классе, а не в отдельном классе. Пример такого метода:

    static char func ( char [ ] chs ) <

    return chs [ 2 ] ;

    >

    Обратите внимание, что интересующий вас метод теперь является статическим, поскольку он будет вызываться из основного метода, который также является статическим и также находится в основном классе. Имя метода func. Он имеет только один параметр, который является объявлением массива. Он возвращает символ. Возвращаемый символ находится на третьей позиции полученного массива (индекс 2).

    В методе main(), который является статическим, можно использовать следующий фрагмент кода:

    Результатом будет C. Первый оператор в этом сегменте кода определяет массив. Здесь не объявляется объект, так как нет отдельного класса. Следующий оператор вызывает тот же метод класса, основной класс, с именем массива (ссылкой) в качестве аргумента. Последний оператор выводит третий символ (индекс 2) массива, полученного вызванным методом.

    Эти два сегмента кода показывают, как массив передается в метод по ссылке.

    Возврат по ссылке

    Приведенный выше метод изменен для возврата массива по ссылке следующим образом:

    static char [ ] func ( char [ ] chs ) <

    return chs ;

    >

    Возвращаемое выражение в сигнатуре метода — «static char[]», а не «static char». Выражение return оператора return теперь является именем массива в параметре и больше не является элементом массива.

    Соответствующий сегмент кода в методе main() изменяется следующим образом:

    Первым оператором здесь является объявление массива. Тип возвращаемого значения вызова метода — массив, а не просто char. Массив по-прежнему передается в качестве аргумента так же, как и раньше. Последний оператор печатает значение элемента возвращаемого массива.

    Эти две программы показывают, как массив может быть передан по ссылке и как массив может быть возвращен по ссылке.

    Заключение

    Да, и это единственный способ передать массив методу в Java: объявить параметр как массив и использовать имя массива в вызове метода. В Java функция называется методом и является членом класса. Больше хороших новостей! Метод (в Java) может возвращать массив, который также по ссылке. Идентификатор (имя) массива является ссылкой. Пусть определение метода (реализация) имеет тип массива в качестве параметра в сигнатуре метода для достижения этих целей. Выражение для оператора return в определении метода — это просто имя массива. Возвращаемое выражение для сигнатуры метода является типом массива. Принимающее выражение должно иметь тип массива в операторе вызова метода.

     

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *