Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C++] memset

  1. #1

    [C++] memset

    Salve,

    nel seguente non capisco qual'è lo scopo di usare la memset() (codice rosso)

    codice:
    #include <windows.h>
    #pragma comment (lib, "winmm.lib")
    #include <mmsystem.h>
    #include <iostream>
    using namespace std;
    const int BUFFER_LEN = 32768;
    
    LPSTR file = "C:\\Users\\giangaetano\\Desktop\\mmio\\file.wav";
    
    void main()
    {
    	WAVEFORMATEX wf;
    	wf.cbSize          = 0;
    	wf.wFormatTag      = WAVE_FORMAT_PCM;
    	wf.nChannels       = 1;
    	wf.wBitsPerSample  = 16;
    	wf.nSamplesPerSec  = 8000;
    	wf.nBlockAlign     = wf.nChannels * (wf.wBitsPerSample / 8);
    	wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;
    
    	WAVEHDR buffer;
    	ZeroMemory(&buffer, sizeof(buffer));
    	buffer.dwBufferLength = BUFFER_LEN;
    	buffer.lpData         = (LPSTR) malloc(BUFFER_LEN);
    ]
    	// creating a file using mmio
    	HMMIO hfile;
    	hfile = mmioOpen(file, NULL, MMIO_CREATE | MMIO_READWRITE );
    
    	MMCKINFO mmckinfo;
    	MMCKINFO mmckinfoSubchunk;
    	MMCKINFO mmckinfoData;
    
    	memset(&mmckinfo, 0, sizeof(mmckinfo));
    	memset(&mmckinfoSubchunk, 0, sizeof(mmckinfoSubchunk));
    	memset(&mmckinfoData, 0, sizeof(mmckinfoData));
    
    	//step 1 create riff chunk
    	mmckinfo.fccType = mmioFOURCC('W','A','V','E');
    	mmioCreateChunk(hfile, &mmckinfo, MMIO_CREATERIFF);
    	
    	//step 2 create fmt chunk
    	//creating fmt chunk also includes writing formatex to this chunk
    	mmckinfoSubchunk.ckid   = mmioFOURCC('f','m','t',' ');
    	mmckinfoSubchunk.cksize = sizeof(WAVEFORMATEX);
    
    	mmioCreateChunk(hfile, &mmckinfoSubchunk, 0);
    	mmioWrite(hfile, (char*)&wf, sizeof(wf));
    	mmioAscend(hfile, &mmckinfoSubchunk, 0);
    
    	//step 3 creating data chunk
    	//creating this chunk includes writing actual voice data
    	mmckinfoData.ckid=mmioFOURCC('d','a','t','a');
    	mmckinfoData.cksize = wf.nAvgBytesPerSec;
    	mmioCreateChunk(hfile, &mmckinfoData, 0);
    	mmioWrite(hfile, (char*)&buffer.lpData, BUFFER_LEN);
    	mmioAscend(hfile, &mmckinfoData, 0);
    	mmioAscend(hfile, &mmckinfo, 0);
    
    	mmioClose( MMIO_READ, MMIO_FHOPEN);
    
    	system("pause");
    }
    inoltre nel codice verde vedo che viene usata la ZeroMemory per riempire di 0x00 bytes il buffer...è una buona pratica o si può anche evitare?

    Cmq se non usa la memset con un buffer di 32768 bytes mi viene creato un file da 32KB mentre se uso la memset mi viene creato un file da 46KB...come mai?

    grazie
    Alla batteria dai retta ballA

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La memset e la ZeroMemory sono funzioni simili (del C e di Windows) e servono per impostare tutti i byte della struttura ad un valore noto (a zero in questo caso) per essere sicuri che il loro contenuto non contenga valori casuali che possono creare problemi in seguito.

    E' quindi bene utilizzarli.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.