Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Buffer als nicht-Zeiger

Frage Entwicklung C und C++

Mitglied: Bulleye

Bulleye (Level 1) - Jetzt verbinden

14.06.2009, aktualisiert 12:57 Uhr, 2987 Aufrufe, 2 Kommentare

Hallo.

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

01.
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:

01.
                tBuffer[i].vPosition.x = pData[pos]; 
02.
		tBuffer[i].vPosition.y = pData[pos+1]; 
03.
		tBuffer[i].vPosition.z = pData[pos+2]; 
04.
		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...:

01.
	Vertex3d tBuffer[] =  
02.
03.
        { -1.0f,-1.0f, 0.0f, 0xff00ffff, }, 
04.
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, }, 
05.
        { -1.0f, 1.0f, 0.0f, 0x00ffffff, }, 
06.
    };
hat alles funktioniert. Dabei ist tBuffer kein Zeiger.
Als ich den Stern bei Vertex3d *tBuffer = new Vertex3d[sizeb]; weggenommen habe, kam folgende Fehlermeldung:

01.
'Initialisierung': 'Vertex3d *' kann nicht in 'Vertex3d' konvertiert werden 
02.
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.
Mitglied: 76109
14.06.2009 um 20:25 Uhr
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
01.
struct S1 { 
02.
       DD_ X;  // DD_ = unsigned Long 
03.
       DD_ Y; 
04.
       } Test1; 
05.
 
06.
Test1.X = 0x11111111;  
07.
Test1.Y = 0x88888888;
Variante 2: Belegt für 10 Datensätze bereits zugewiesenen Speicherplatz
01.
struct S2 { 
02.
       DD_ X; 
03.
       DD_ Y; 
04.
       } Test2[10]; 
05.
 
06.
Test2[0].X = 0x11111111;   
07.
Test2[0].Y = 0x88888888; 
08.
 
09.
Test2[9].X = 0x11111111;   
10.
Test2[9].Y = 0x88888888;
Variante 3: Wird nur definiert und belegt noch keinen Speicherplatz, Anzahl Datensätze unbekannt
01.
struct S3 { 
02.
       DD_ X; 
03.
       DD_ Y; 
04.
       } *Test3; 
05.
 
06.
Test3 = (S3 *) malloc(sizeof (struct S3) * 100)  // Speicherplatz für 100 Datensätze 
07.
 
08.
Test3[0].X = 0x11111111; 
09.
Test3[0].Y = 0x88888888; 
10.
 
11.
Test3[99].X = 0x22222222; 
12.
Test3[99].Y = 0x77777777; 
13.
 
14.
for (i = 0; i < 100; i++) 
15.
16.
  Test3[i].X = 0x22222222; 
17.
  Test3[i].Y = 0x77777777; 
18.
}
Zum Beitrag vom letztenmal, Struct-Daten in Datei schreiben und lesen:
01.
char path[] = "C:\\Test.Dat"; 
02.
 
03.
int handle; 
04.
 
05.
handle = open (path, Flags); 
06.
 
07.
write (handle, &Test1, sizeof (struct S1));       
08.
write (handle, &Test2[3], sizeof (struct S2));   // 4. Datensatz (0-9) 
09.
write (handle, &Test3[5], sizeof (struct S3));   // 6. Datensatz (0-99) 
10.
 
11.
write (handle, &Test2, sizeof (struct S2) * 10); // Alle Datensätze 
12.
write (handle, Test3, sizeof (struct S3) * 100); 
13.
 
14.
lseek (handle, 0, SEEK_SET); 
15.
 
16.
read (handle, &Test1, sizeof (struct S1));   
17.
read (handle, &Test2[3], sizeof (struct S2));    // 4. Datensatz (0-9) 
18.
read (handle, &Test3[5], sizeof (struct S3));    // 6. Datensatz (0-99) 
19.
   
20.
read (handle, &Test2, sizeof (struct S2) * 10);  // Alle Datensätze 
21.
read (handle, Test3, sizeof (struct S3) * 100); 
22.
 
23.
close (handle);
Gruß Dieter
Bitte warten ..
Mitglied: Guenni
29.06.2009 um 21:24 Uhr
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[0].x=-0.123;
var[0].y=1.34;
var[0].z=23.23;

printf("x=%f\ny=%f\nz=%f\n",var[0].x,var[0].y,var[0].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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...