как выделить блок памяти в c++ [закрыт]

151
03 мая 2019, 01:20

вот так выглядит все задание полностью - Основной поток создает два других потока приостановленными и после их создания запускает первый. Первый из них выделяет блок памяти размеров 200Кб, заполняет его случайными числами и запускает второй потом, который записывает сгенерированные случайные числа в файл, освобождает выделенную память и завершается

вот так у меня есть на данный момент

#include "pch.h" 
#include <iostream> 
#include <windows.h> 
#include "conio.h" 
#include <vector> 
//#include "stdafx.h" 

using namespace std; 
const int Length =200 * 1024; 
unsigned char *buffer = new unsigned char[Length]; 
int num; 

DWORD WINAPI thread2(LPVOID); 
DWORD WINAPI thread3(LPVOID); 
int main() 
{ 
// create threats 
HANDLE thread = CreateThread(NULL, 0, thread2, NULL, 0, NULL); 
HANDLE thread1 = CreateThread(NULL, 0, thread3, NULL, 0, NULL); 
// stop threads 
SuspendThread(thread); 
SuspendThread(thread1); 

ResumeThread(thread); 
_getch(); 
return 0; 
} 
DWORD WINAPI thread2(LPVOID t) 
{ 
for (int i = 0; i< Length; i++) 
{ 
buffer[i] = (int)rand() % Length + 1; 
} 
for (int i = 0; i < Length; i++) 
{ 
cout « (int)buffer[i] « " "; 
cout « endl; 
} 
delete[]buffer; 

//cout « "wwwwwwwwwwwwwwwwwwww"; 
return 0; 
} 
DWORD WINAPI thread3(LPVOID n ) 
{ 
return 0; 
}
Answer 1

Хорошо вначале открыть книжку и стать чуточку сильнее.

Вначале я посмотрел на это

byte *buffer = new byte [200*1024];

нормально выделили памяти, 200 килобайт (правда производители дисков скажут, что здесь 204.8 килобайта). Правда тип std::byte доступен только с 17 плюсов, а значит не каждый школьный компилятор его возьмет. Но может тут просто обычный #define byte char

Но потом я увидел это

int *Arr = new int[*buffer];

buffer - это указатель на массив, а *buffer это *(buffer+0), то есть buffer[0]. То есть, выделяем ещё один массив int, размер которого записан в первом элементе массива. Очень интересно. Дело в том, что сам то buffer[0] ещё не инициализированный, поэтому, код может выделить любое кол-во байт (в определенном диапазоне конечно).

Смотрим дальше

for(int i=-; i< *buffer; i++)

явно переписывалось с какого ксерокса. Выражение int i=-; не валидное. И скорее всего имелось ввиду int i=0;.

Но на этом это выражение не завершилось. Смотрим в вторую половину i< *buffer - пока i меньше значения нулевого элемента (неинициализированного массива). Ой. Это полный ой. Но опустив глаза на следующий цикл, мне кажется, что под *buffer автор имел ввиду размер массива. Тогда все стает на свои места. Даже эта строка num = rand()% *buffer +1; обретает смысл. Но оно и подсказывает, что byte это не std::byte. И rand по всей видимости какой то не такой

опустимся вниз. Там нас ждет delet[]Arr;. явно недописанная буква e. Ок. Правда оно в цикле, но какая теперь разница:) теперь можно написать как надо.

Просто поправленная, но все равно ужасная версия

using namespace std;
const int LEN = 200*1024;
unsigned char *buffer = new unsigned char [LEN];
int num;
for(int i=0; i< LEN; i++)
{
  buffer[i] = (int)rand()% LEN +1;
}
for(int i = 0; i< LEN; i++)
{
  cout << buffer[i] << " ";
  cout << endl;
}
delete[]buffer;

Вывод: Откройте книгу или конспект. Почитайте.

А потоки.. А нет в программе потоков. Но судя по вопросу, ищется что то вида Consumer-producer. Но это немножко более сложный код. Например, где то так.

READ ALSO
Решение задачи с Yandex.Контест

Решение задачи с Yandex.Контест

Не могу решить эту задачу, не проходит по времени

131
Разный порядок операторов

Разный порядок операторов

Почему эта программа не выдаёт ошибок для 1 и 2 строки, но выдаёт их для 3 и 4?

167
Отправка сообщений websocket

Отправка сообщений websocket

Пишу веб сокет сервер на языке javaЕсть ксласс с обработчиком событий: открытие, закрытие соединения, ошибки, и сообщения

167