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, 3000 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 ..
Ähnliche Inhalte
Voice over IP
gelöst RTP - Wrong Sequnce Number - Firewall Buffer voll? (3)

Frage von istike2 zum Thema Voice over IP ...

Neue Wissensbeiträge
Windows 10

Windows 8.x oder 10 Lizenz-Key aus dem ROM auslesen mit Linux

Tipp von Lochkartenstanzer zum Thema Windows 10 ...

Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(38)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
POS Hardware und alternativen zu Raid 1? (21)

Frage von Brotkasten zum Thema Festplatten, SSD, Raid ...

Viren und Trojaner
Verschlüsselungstrojaner simulieren (18)

Frage von AlbertMinrich zum Thema Viren und Trojaner ...

Exchange Server
Exchange Postfach leeren - nicht löschen (9)

Frage von AndreasOC zum Thema Exchange Server ...

Ubuntu
Nextcloud 12 Antivirus App for Files (8)

Frage von horstvogel zum Thema Ubuntu ...