Существует ли способ сохранить переменную через движение?

Чтобы получить доступ к ss1, вам нужен указатель внутри вашего абстрактного класса на дочерний объект. Указатель может иметь любое расширение типа, которое вы хотите определить. Поскольку у вашего связанного списка есть два разных расширения типа, вы должны объявить два дочерних указателя в вашем абстрактном классе.

module class_type

  implicit none
  class(*), pointer :: fnzo => null()


  type, abstract :: gen

     real :: ss
     integer :: sdsd
     class(gen), pointer    :: next =>null()
     type(final1), pointer  :: child
  end type

  type, extends(gen) :: final1

     real :: ss1

  end type final1

  type, extends(gen) :: final2

     real :: x1(10)

  end type final2


end module class_type



program test_class

  use class_type

  implicit none

  class(gen), pointer  :: test
  type(final1), target    :: test1

  allocate(test, source=test1)

  test1% ss1 = 20.0
  test% child => test1

  write(*,*) test1% ss1

  write(*,*) test% child% ss1

end program test_class

Когда вы скомпилируете и выполните, вы увидите:

   20.00000    
   20.00000
73
задан Contango 6 April 2019 в 09:11
поделиться

4 ответа

Команда go используется для разделения кода на отдельные пакеты. Если это именно то, что вы хотите сделать, то вам следует использовать его, но это означает, что пакеты фактически разделены, и вы не можете совместно использовать переменные между ними.

В вашем случае решение простое; вы можете просто удалить операторы go , они не нужны в этом коде.

Боковое примечание: вы не можете использовать переменную в операторе use , она должна быть имя базы данных.

31
ответ дан 24 November 2019 в 12:16
поделиться

Можно использовать NOEXEC, следуют, он ступает ниже:

таблица

#temp_procedure_version(procedure_version varchar(5),pointer varchar(20))

Create вставляет версии процедуры и указатель на версию во временную таблицу #temp_procedure_version

- пример procedure_version указатель

вставляет в temp_procedure_version, значения (1.0, 'первая версия')

вставляют в temp_procedure_version, значения (2.0, 'окончательная версия')

тогда получают версию процедуры, можно использовать, где условие как в следующем утверждении

Выбор @ProcedureVersion=ProcedureVersion от #temp_procedure_version, где pointer='first version'

IF (@ProcedureVersion='1.0')
    BEGIN
    SET NOEXEC OFF  --code execution on 
    END
ELSE
    BEGIN 
    SET NOEXEC ON  --code execution off
    END 

- вставляют версию 1.0 процедуры здесь

, Создает версию 1.0 процедуры как.....

SET NOEXEC OFF -- execution is ON

Выбор @ProcedureVersion=ProcedureVersion от [1 112], где указатель ='final версия'

IF (@ProcedureVersion='2.0')
    BEGIN
    SET NOEXEC OFF  --code execution on 
    END
ELSE
    BEGIN 
    SET NOEXEC ON  --code execution off
    END 

Создают версию 2.0 процедуры как.....

SET NOEXEC OFF -- execution is ON

- отбрасывают временную таблицу #temp_procedure_version

Drop таблицы

0
ответ дан 24 November 2019 в 12:16
поделиться

Не уверен, поможет ли это

declare @s varchar(50)
set @s='Northwind'

declare @t nvarchar(100)
set @t = 'select * from ' + @s + '.[dbo].[Customers]'

execute sp_executesql @t
1
ответ дан 24 November 2019 в 12:16
поделиться

Используйте временную таблицу:

CREATE TABLE #variables
    (
    VarName VARCHAR(20) PRIMARY KEY,
    Value VARCHAR(255)
    )
GO

Insert into #variables Select 'Bob', 'SweetDB'
GO

Select Value From #variables Where VarName = 'Bob'
GO

DROP TABLE #variables
go
110
ответ дан 24 November 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: