Buffer als nicht-Zeiger
Hallo.
Ich habe das Problem, dass ich einen Buffer als Zeiger deklarieren muss:
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:
Als ich die Initialisierung mit direkten Werten versucht habe...:
hat alles funktioniert. Dabei ist tBuffer kein Zeiger.
Als ich den Stern bei Vertex3d *tBuffer = new Vertex3d[sizeb]; weggenommen habe, kam folgende Fehlermeldung:
Kennt jemand eine Lösung für dieses Problem?
Danke im vorraus.
Lg.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118131
Url: https://administrator.de/forum/buffer-als-nicht-zeiger-118131.html
Ausgedruckt am: 24.12.2024 um 16:12 Uhr
2 Kommentare
Neuester Kommentar
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
Variante 2: Belegt für 10 Datensätze bereits zugewiesenen Speicherplatz
Variante 3: Wird nur definiert und belegt noch keinen Speicherplatz, Anzahl Datensätze unbekannt
Zum Beitrag vom letztenmal, Struct-Daten in Datei schreiben und lesen:
Gruß Dieter
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;
struct S2 {
DD_ X;
DD_ Y;
} Test2[10];
Test2.X = 0x11111111;
Test2.Y = 0x88888888;
Test2[9].X = 0x11111111;
Test2[9].Y = 0x88888888;
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;
}
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
Hi Bulleye,
"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
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:
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