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, 2990 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
Heiß diskutierte Inhalte
DSL, VDSL
gelöst DSL 200m verlängern (16)

Frage von Angela44 zum Thema DSL, VDSL ...

Windows Server
SBS 2011 Standard virtualisieren (11)

Frage von HeinrichM zum Thema Windows Server ...

LAN, WAN, Wireless
Per Script auf UniFi-controller zugreifen und WPA2-Key ändern (11)

Frage von Winfried-HH zum Thema LAN, WAN, Wireless ...

Exchange Server
gelöst DHCP Sever MS Server 2012 Problem (10)

Frage von Florian86 zum Thema Exchange Server ...