Array Struct als Zeiger in Funktion .. helppp ;)



  • struct daten
    {
    	unsigned short no;
    	unsigned char classi;
    };
    typedef daten _daten[100];
    
    struct leer
    {
    	unsigned short no;
    	unsigned char classi;
    	int zaehler;
    };
    typedef leer _leer[100];
    
    void func(_leer *a, _daten b, int count)
    {
    	for (int i=0;i<count;i++)
    	{
    		a[i]->no = b[i].no;
    		a[i]->classi = b[i].classi;
    		a[i]->zaehler = i + 1;
    	}
    }
    
    int main (void)
    {
    	_leer x,*xx;
    	xx = &x;
    
    	_daten y;
    	int count;
    	char buf[256];
    
    	y[0].no = 1;
    	y[0].classi = 2;
    
    	y[1].no = 4;
    	y[1].classi = 5;
    
    	y[2].no = 7;
    	y[2].classi = 8;
    
    	count = 3;
    
    	for (int i=0;i<count;i++)
    	{
    		sprintf(buf,"%d - %d",y[i].no,y[i].classi);
    		cout << buf;
    	}
    
    	cout << "--------------------------";
    
    	func(xx,y,count);
    
    	for (int i=0;i<count;i++)
    	{
    		sprintf(buf,"%d - %d - %d", x[i].no, x[i].classi, x[i].zaehler);
    		cout << buf;
    	}
    
           return 1;
    }
    

    x[0] ist richtig aber x[1] und x[2] mist .. und prog crasht beim beenden.
    sieht wer meinen fehler?



  • Ausgabe Y und darunter X

    1 - 2
    4 - 5
    7 - 8
    --------------------------
    1 - 2 - 1
    3552 - 25 - 0
    64480 - 18 - 1848842363
    


  • Achso .. ich brauch es als Pointer da die Funktion func in einer DLL liegt ..
    also Lösungen wie:
    void func(_leer a, _daten b, int count)
    bzw
    void func(_leer &a, _daten b, int count)

    func(x,y,count);

    sind zwar richtig, aber in diesem Falle nicht zu gebrauchen 🙄



  • 1. Da fehlen includes
    2. da fehlt ein using namespace std;
    3. Gib dir mal sizeof(*xx) aus.



  • Eigentlich ist das ein CBuilder5 prog ^^
    Habe nur bissle am was geändert 😉

    Caption = sizeof(*xx); // 800 zeigt er an



  • Was lernen wir daraus?

    xx ist ein pointer auf ein Array von 100 leer elementen.

    xx[0] zeigt auf das erste solcher arrays.
    xx[1] auf das zweite

    Um das zweite Element im Array auf das xx zeigt zu erhalten schreibst du:

    (*xx)[1]



  • Wau das klappt 🙂
    Danke. Aber nun gehts in die nächste Runde.

    die func() ist eine Delphi DLL funktion .. momentan habe ich sie fest im quellcode

    in Pascal sieht sie so aus

    precord1 = ^trecord1;
      trecord1 = record
        no:word;
        classi:byte;
        zaehler:integer;
      end;
      trecordarray1 = array [0..99] of trecord1;
      precordarray1 = ^trecordarray1;
    
      trecord2 = record
        no: word;
        classi: byte;
      end;
      trecordarray2 = array [0..99] of trecord2;
    
    function func(record1:precordarray1; record2:trecordarray2; count:integer): integer; stdcall;
    var
      i: integer;
    begin
      for i:=0 to count do
      begin
        record1[i].no := record2[i].no;
        record1[i].classi := record2[i].classi;
        record1[i].zaehler := i + 1;
      end;
      result:=0;
    end;
    

    Wenn ich meine func() aufrufe geht alles ... mach ich die DLL func() dann zerstört er scheinbar den Speicher.

    func(xx,y,count); // DLL func();
    
    	for (int i=0;i<100;i++)
    	{
    		x[i].unno = 0;
    		x[i].classification = 0;
    		x[i].zaehler = 0;
    	}
    	char dammy[200];
    	for (int i=0;i<count;i++)
    	{
    		sprintf(dammy,"%d x %d x %d", x[i].unno, x[i].classification,x[i].zaehler);
    		Memo1->Lines->Add(dammy);
    	}
    

    Ausgabe

    1 - 2 - 3
    4 - 5 - 6
    7 - 8 - 9
    --------------------------
    ÿ
    ÿ
    ÿ
    

    Kein Speicherabstürz mehr beim beenden des Programmes .. aber unten hätten alles "0 x 0 x 0" stehen müssen ..

    Wenn ich x[] nicht 0 setze dann stehen in x[] auch werte.
    Caption = x[1].unno; // zeigt eine 7 an
    Allerdings ist [0] richtig und was x[2] sein müsste ist [1] und x[2] ist total falsch

    1 - 2 - 3
    4 - 5 - 6
    7 - 8 - 9
    --------------------------
    1 x 2 x 1
    7 x 8 x 2
    96 x 0 x 3
    

    Also wenn einer dafür die Lösung kennt ich ich nen Bier aus 🙂



  • Achja, rauskommen müsste

    1 - 2 - 3
    4 - 5 - 6
    7 - 8 - 9
    --------------------------
    1 x 2 x 1
    4 x 5 x 2
    7 x 8 x 3
    

Anmelden zum Antworten