bulleye
Goto Top

Buffer als nicht-Zeiger

Hallo.

Ich habe das Problem, dass ich einen Buffer als Zeiger deklarieren muss:

Vertex3d *tBuffer = new Vertex3d[sizeb];

Abgesehen von der verwendeten Struct kann ich den Elementen des Buffers keine float-Werte
hinzufügen (Vertex3d besteht aus X,Y,Z, die jeweils als Float deklariert sind).
Dabei kommt zwar keine Fehlermeldung, allerdings zeigt sich auch kein Ergebnis.

Initialisiert wird dieser Buffer über folgenden Code:

                tBuffer[i].vPosition.x = pData[pos];
		tBuffer[i].vPosition.y = pData[pos+1];
		tBuffer[i].vPosition.z = pData[pos+2];
		tBuffer[i].color = D3DCOLOR_XRGB((int)pData[pos+3],(int)pData[pos+4],(int)pData[pos+5]);

Als ich die Initialisierung mit direkten Werten versucht habe...:

	Vertex3d tBuffer = 
    {
        { -1.0f,-1.0f, 0.0f, 0xff00ffff, },
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
        { -1.0f, 1.0f, 0.0f, 0x00ffffff, },
    };

hat alles funktioniert. Dabei ist tBuffer kein Zeiger.
Als ich den Stern bei Vertex3d *tBuffer = new Vertex3d[sizeb]; weggenommen habe, kam folgende Fehlermeldung:

'Initialisierung': 'Vertex3d *' kann nicht in 'Vertex3d' konvertiert werden  
1>        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig


Kennt jemand eine Lösung für dieses Problem?

Danke im vorraus.

Lg.

Content-ID: 118131

Url: https://administrator.de/forum/buffer-als-nicht-zeiger-118131.html

Ausgedruckt am: 24.12.2024 um 16:12 Uhr

76109
76109 14.06.2009 um 20:25:21 Uhr
Goto Top
Hallo Bulleye!

Es ist zwar schon 15-20 Jahre her, wo ich das letzte mal "C" rumgespielt habe, aber vielleicht helfen Dir die 3 Beispiele ja irgendwie weiter.

Variante 1: Belegt für 1 Datensatz bereits zugewiesenen Speicherplatz
struct S1 {
       DD_ X;  // DD_ = unsigned Long
       DD_ Y;
       } Test1;

Test1.X = 0x11111111; 
Test1.Y = 0x88888888;
Variante 2: Belegt für 10 Datensätze bereits zugewiesenen Speicherplatz
struct S2 {
       DD_ X;
       DD_ Y;
       } Test2[10];

Test2.X = 0x11111111;  
Test2.Y = 0x88888888;

Test2[9].X = 0x11111111;  
Test2[9].Y = 0x88888888;
Variante 3: Wird nur definiert und belegt noch keinen Speicherplatz, Anzahl Datensätze unbekannt
struct S3 {
       DD_ X;
       DD_ Y;
       } *Test3;

Test3 = (S3 *) malloc(sizeof (struct S3) * 100)  // Speicherplatz für 100 Datensätze

Test3.X = 0x11111111;
Test3.Y = 0x88888888;

Test3[99].X = 0x22222222;
Test3[99].Y = 0x77777777;

for (i = 0; i < 100; i++)
{
  Test3[i].X = 0x22222222;
  Test3[i].Y = 0x77777777;
}
Zum Beitrag vom letztenmal, Struct-Daten in Datei schreiben und lesen:
char path = "C:\\Test.Dat";  

int handle;

handle = open (path, Flags);

write (handle, &Test1, sizeof (struct S1));      
write (handle, &Test2[3], sizeof (struct S2));   // 4. Datensatz (0-9)
write (handle, &Test3[5], sizeof (struct S3));   // 6. Datensatz (0-99)

write (handle, &Test2, sizeof (struct S2) * 10); // Alle Datensätze
write (handle, Test3, sizeof (struct S3) * 100);

lseek (handle, 0, SEEK_SET);

read (handle, &Test1, sizeof (struct S1));  
read (handle, &Test2[3], sizeof (struct S2));    // 4. Datensatz (0-9)
read (handle, &Test3[5], sizeof (struct S3));    // 6. Datensatz (0-99)
  
read (handle, &Test2, sizeof (struct S2) * 10);  // Alle Datensätze
read (handle, Test3, sizeof (struct S3) * 100);

close (handle);

Gruß Dieter
Guenni
Guenni 29.06.2009 um 21:24:11 Uhr
Goto Top
Hi Bulleye,

Ich habe das Problem, dass ich einen Buffer als Zeiger deklarieren muss:
Als ich den Stern bei Vertex3d *tBuffer = new Vertex3d[sizeb]; weggenommen habe, kam folgende Fehlermeldung:

"Nur" den Stern weglassen führt zu der Fehlermeldung, weil der Operator new nicht auf diesen Typ anwendbar ist.

Der Operator new macht das, was sonst(auch) die Funktion malloc macht: einen Speicherbereich für einen Zeiger

auf einen Datentyp zu reservieren. Der Datentyp der Member der Strukur, nämlich float, gibt aber den benötigten

Speicher bereits vor, deshalb ist es nicht nötig, diesen zu reservieren. Als Beispiel:


char c; Variable c kann genau ein Zeichen aufnehmen.

char c[100];
Variable c kann 100 Zeichen aufnehmen. Der benötigte Speicher ist bei der Deklaration bereits reserviert.

char *c; Zeiger auf einen Speicherbereich vom Typ char. Um diesen mit Werten zu füllen, muß der erforderliche Platzbedarf ermittelt

und reserviert werden. Das macht new: char *c = new char[size]


Dem entsprechend kannst du new = . . . einfach weglassen . . .


#include "stdafx.h"

#include "var.h"
Hier ist die Strukturdefinition tBeispiel hinterlegt

#define ARRAYSIZE 100 Oder wieviele auch immer

int _tmain(/*int argc, _TCHAR* argv*/){

tBeispiel var[ARRAYSIZE];

var.x=-0.123;
var.y=1.34;
var.z=23.23;

printf("x=%f\ny=%f\nz=%f\n",var.x,var.y,var.z);
Variablen ausgeben
getchar();
return 0;
}


. . . und es ist es kein Problem, ein Array für eine Variable vom Typ Struktur anzulegen

und zu initialisieren.

Gruß
Günni