Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Bulleye

Bulleye (Level 1) - Jetzt verbinden

14.06.2009, aktualisiert 12:57 Uhr, 3021 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
C und C++
Vektoren und Zeiger
gelöst Frage von How-ToC und C++3 Kommentare

Hallo zusammen, kann mir jemand den Unterschied zwischen - vector<MeineKlasse *> meinVektor; und - vector<MeineKlasse> * meinVektor; erklären? Irgendwie ...

Exchange Server

Schemaerweiterung Exchange 2013 will sich nicht zeigen

gelöst Frage von prosperoExchange Server6 Kommentare

Liebe Gemeinde, so sind sie, die Neuen! Gleich im ersten Post nur Probleme und Geheule ;) Ich ärgere mich ...

Outlook & Mail

Buffer Overflow Exeption (BEX)-Fehler bei Outlook2013

gelöst Frage von musicdanOutlook & Mail1 Kommentar

Hi, ich habe seit kurzem einen Fehler, sodass Outlook abstürzt, sobald ein Kalendereintrag getätigt wird. Win7 Pro / SP1 ...

Windows Server

DNS Host Eintrag soll auf eine andere IP Zeigen

gelöst Frage von pixel0815Windows Server3 Kommentare

Hallo zusammen, fragt nicht wieso ich sowas machen möchte - es ist nur für den Übergang. Wir hatten einen ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 1 StundeErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 3 StundenWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgborn vor 3 StundenMicrosoft3 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1025 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall15 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)15 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Server-Hardware
Server für Exchange 2016, Kaufberatung
Frage von MazenauerServer-Hardware10 Kommentare

Guten Tag werte Gemeinde, Vorab: Ich dachte es gab mal einen separaten Bereich für solche Anfragen, habe ich leider ...