Dodanie obiektu do listy

0

Witam,
mam problem z dodaniem obiektu do listy.
Otrzymuję niezgodność typów i nie wiem jak sobie z tym poradzić.
W jednym module posiadam klasę

type
TAdaptiveLinearNeuron=class
public
  liczba:integer;
constructor Konstr_AdaptiveLinearNeuron(liczba2:integer;N2:integer);
  procedure Ucz();
private
  Wagi:array of double;
  ilosc_iteracji:integer; 
end;

 

W innym odwołuję się do niej:

type
 TDoubleArr2 = array of double;
 listaNeuronowAdaline = ^TlistaNeuronowAdaline;
 TlistaNeuronowAdaline = record
   Next: listaNeuronowAdaline;
   Dane: string;
   tab: TDoubleArr2;
 end;

public
 TabLista:listaNeuronowAdaline;
NowyWezel:listaNeuronowAdaline;

procedure TForm1.Inicjalizuj();
var i:integer;
begin

  for I := 0 to 4 do
  begin
   New(NowyWezel);
   TabLista^.Next := nil;
   TabLista^.tab := example;
   NowyWezel^.Next := nil;
   TabLista^.tab :=TAdaptiveLinearNeuron.Konstr_AdaptiveLinearNeuron(i,N);
  end;
end;

Błąd
Incompatible types: TDoubleArr2 and TAdaptiveLinearNeuron
Kombinuję i pewnie przekombinowałem.
Proszę o pomoc jak mogę to zrealizować?

1

Twój tab to array of double czyli dynamicznie tworzona tablica typu double do której próbujesz przypisać ... no właśnie CO? TAdaptiveLinearNeuron.Konstr_AdaptiveLinearNeuron(i,N);

Rozumiem, że TAdaptiveLinearNeuron to klasa jeśli jest to klasa to trzeba ją zadeklarować i utworzyć (wtedy odpalasz konstruktora) natomiast z tego co widzę to z tej TabLista^.tab powinieneś przypisać np liczba:integer zadeklarowaną w public? Teorytycznie widzę tam też wagi, które są zgodne z typem tab ale w sekcji private nie będziesz mógł tego użyć w innym module.

0

Chcę obiekty przypisać aby potem móc się odwoływać do nich.

Dla przykładu to samo ale napisace w C#
Deklaracja listy:

 private List<AdaptiveLinearNeuron> listaNeuronowAdaline = new List<AdaptiveLinearNeuron>();
 

Procedura

 private void InicjalizujNeuronyAdaline()
        {
            for (int i = 0; i < 10; i++)
            {
                listaNeuronowAdaline.Add(new AdaptiveLinearNeuron(i,(N)));              
            }
        }
 

To jest konstktor w klasie w drugim module

        public AdaptiveLinearNeuron(int liczba2, int w)
        {          
            //this.N = N;
           // this.Liczba = liczba;
            N = w;
            Liczba = liczba2;
            
            GenerateRandomWeight();
        }
 
0

zamiast tablicy double musisz przypisać tablicę obiektów do tab:

type
TAdaptiveLinearNeuronArray = array of TAdaptiveLinearNeuron;
end;

type
 TDoubleArr2 = array of double;
 listaNeuronowAdaline = ^TlistaNeuronowAdaline;
 TlistaNeuronowAdaline = record
   Next: listaNeuronowAdaline;
   Dane: string;
   tab: TAdaptiveLinearNeuronArray;
 end;

dodanie znacznika <code class="delphi"> - @furious programming

2

A po co używać tablic skoro chcesz stworzyć listę? Klasa TList istnieje już od bardzo dawna :P
http://www.delphibasics.co.uk/RTL.asp?Name=TList

Jak masz delphi w wersji >= 2009 to lepiej skorzystaj z TList<T>
http://docwiki.embarcadero.com/Libraries/XE7/en/System.Generics.Collections.TList

a najlepiej TObjectList<T>
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Generics_Collections_TObjectList.html

0

Mam akurat 2009.
To nie przejdzie ?

0

@krzywy Lew

Zrobiłem tak lecz otrzymuję ten sam błąd.

Incompatible types: TAdaptiveLinearNeuronArray and TAdaptiveLinearNeuron

3
procedure Przyklad;
var
	lista: TObjectList<TAdaptiveLinearNeuron>;
	i: Integer;
begin
	// tworzenie listy
	lista := TObjectList<TAdaptiveLinearNeuron>.Create;

	// dodawanie do listy
	for i := 0 to 9 to
		lista.Add(TAdaptiveLinearNeuron.Konstr_AdaptiveLinearNeuron(i,N));
		
	// dostęp do obiektu
	lista[0].liczba := 5;

	// kasowanie elementu z listy
	List.Delete(0);
	
	// zwalnianie listy
	FreeAndNil(lista);
end;

Domyślna wartość w konstrukorze TObjectList<T>.Create(True) sprawia, że lista sama automatycznie zwalania usuwane obiekty jak chcesz sam je zwalniać to zmień True na False.

0

W 2009 otrzymuję komunikat:
Undeclared identifier TObjectList<>

//EDIT Nie zauważyłem, że muszę dodać do uses Generics.Collections

1 użytkowników online, w tym zalogowanych: 0, gości: 1