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ändertCaption = 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 zweiteUm 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 falsch1 - 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