C++ Befehle

Fragen zu allen anderen Programmiersprachen.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Sunny hat geschrieben:memset füllt den angegebenen Speicherbereich mit dem angegebenen Byte in der angegebenen Länge aus.
@Laurin
Anscheinend hast du meine Erkläreung falsch verstanden, aber nach dem posting von Sunny dürfte alles klar sein.
mit int wert füllt
Denk daran - nur das erste Byte.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Danke für eure Hilfe, aber ich bin auf noch mehr Probleme gestoßen.

C++-Code:

Code: Alles auswählen

typedef struct _GETVERSIONOUTPARAMS {
	BYTE	bVersion;
	BYTE	bRevision;
	BYTE	bReserved;
	BYTE	bIDEDeviceMap;
	DWORD	fCapabilities;
	DWORD	dwReserved[4];
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

Code: Alles auswählen

GETVERSIONOUTPARAMS VersionParams;

if ((hSMARTIOCTL = OpenSMART()) != INVALID_HANDLE_VALUE)
    {
	memset((void*)&VersionParams, 0, sizeof(VersionParams));

	if ( DeviceIoControl(hSMARTIOCTL, DFP_GET_VERSION,
			NULL, 
			0,
			&VersionParams,
			sizeof(VersionParams),
			&cbBytesReturned, NULL) )
PB-Code:

Code: Alles auswählen

Structure GETVERSIONOUTPARAMS
  bVersion.b
  bRevision.b
  bReserved.b
  bIDEDeviceMap.b
  fCapabilities.l
  dwReserved.l[4]
EndStructure

VersionParams.GETVERSIONOUTPARAMS

hSMARTIOCTL.l = OpenSMART()
Debug hSMARTIOCTL
Debug GetLastError_() ; alles Ok

If hSMARTIOCTL
  If DeviceIOControl_(hSMARTIOCTL, #DFP_GET_VERSION, #NUL, 0, VersionParams, SizeOf(GETVERSIONOUTPARAMS), cbBytesReturned, 0)
     debug GetLastError_() ; Fehler 122
Ich bekomme immer den Error-Code 122 (zuwenig Daten übergeben bzw. Puffer zu klein).

Jemand eine Idee, woran es liegt?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Vielleicht solltest du die Funktion richtig benutzen. Also die Funktion benötigt beispielsweise ein paar Pointer als Parameter, bei dir seh ich da keine.

Code: Alles auswählen

BOOL DeviceIoControl(

    HANDLE hDevice,	// handle to device of interest
    DWORD dwIoControlCode,	// control code of operation to perform
    LPVOID lpInBuffer,	// pointer to buffer to supply input data
    DWORD nInBufferSize,	// size of input buffer
    LPVOID lpOutBuffer,	// pointer to buffer to receive output data
    DWORD nOutBufferSize,	// size of output buffer
    LPDWORD lpBytesReturned,	// pointer to variable to receive output byte count
    LPOVERLAPPED lpOverlapped 	// pointer to overlapped structure for asynchronous operation
   );	
 
So sieht's aus, also solltest du erstmal alle Parameter die einen Pointer benötigen auch so angeben. Der vorletzte Parameter zeigt dabei auf eine Variable des Typs Double Word (in PB wohl als Long handzuhaben). Du setzt da direkt eine Variable ein, keine Angabe zum Speicherbereich sondern direkt die Variable. Er will dann in den Speicherbereich, auf den die Variable pointet etwas schreiben, geht aber nicht, da die Variable frisch erstellt ist und keinen Speicherbereich beinhaltet. Daher vielleicht der Fehler, dass zu wenige Daten übergeben wurden.
Ist natürlich nur eine Vermutung und ungetestet, aber wär' ein Versuch wert.
Ist schon manchmal ganz gut wenn man Variablen nicht on-the-fly deklarieren kann sondern es sorgfältig vor Benutzung machen muss, da spart man sich manchmal Fehler ein.
Also entweder die Variable vorher deklarieren und per @ dann auf sie pointen oder einen richtigen Pointer erstellen der auf eine Variable zeigt oder aif einen allocierten Bereich von 4 Byte Größe.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

-Gelöscht -


Edit: Hat geklappt, danke für die Hilfe.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

So, wieder etwas <)

Code: Alles auswählen

bIDCmd = (VersionParams.bIDEDeviceMap >> i & 0x10) ? \
         IDE_ATAPI_ID : IDE_ID_FUNCTION;
Alles bis auf das "\" ist klar. Dient das zur Erkennung für den Compiler, dass die Sache in der nächsten Zeile weitergeht?

Mein (vorläufiger) PB-Code dazu:

Code: Alles auswählen

If VersionParams\bIDEDeviceMap >> i & $10
  bIDCmd = #IDE_ATAPI_ID
Else
  bIDCmd = #IDE_ID_FUNCTION
EndIf
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Laurin hat geschrieben:So, wieder etwas <)

Code: Alles auswählen

bIDCmd = (VersionParams.bIDEDeviceMap >> i & 0x10) ? \
         IDE_ATAPI_ID : IDE_ID_FUNCTION;
Alles bis auf das "" ist klar. Dient das zur Erkennung für den Compiler, dass die Sache in der nächsten Zeile weitergeht?
Genauso ist es und dein Code müsste korrekt sein.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Danke schön.

Seit wann proggst du denn in C++, Deeem? Auf der LAN damals hast du es glaubig noch nichht getan.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ich progg auch heut noch kein C++, allerdings versuch ich mich grad mit DirectInput (siehe "Code, Tipps und Tricks") und Direct3D auseinander zu setzen und dann muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Deeem2031 hat geschrieben:I muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)
Das kenne ich. Ich versuche mich gerade an dem S.M.A.R.T.-Feature der Festplatten. Ist auch nicht gerade einfach. Davon mal abgesehen, dass es nicht sonderlich viel Dokumentation gibt, wie man die Festplatten ansprechen kann. Ja, ja.. wir Progger eben <)
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Laurin hat geschrieben:
Deeem2031 hat geschrieben:I muss man nunmal einige C++-Codes lesen, sonst kommt man da nicht weit ;)
Ein Zitat ist eine Kopie des Orginaltextes, in der man keine Änderungen vornehmen darf, so hab ichs jedenfalls mal in Deutsch gelernt ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten