Xmemory c ошибка

Doppelganker

1 / 1 / 0

Регистрация: 27.04.2020

Сообщений: 59

1

25.07.2020, 16:08. Показов 3794. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день. Нужно из бинарного файла определенные значения перенести в txt файла
Функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void FindingTheDatesYouWantInBinFile(string BinFileName, string TxtFileName, char letter, int number) // поиск нужных дат в bin файле и запись их в txt файл
{
    ifstream BinFile(BinFileName, ios::binary);
    ofstream TxtFile(TxtFileName);
    date Date;
    while (BinFile.read((char*)&Date, sizeof Date))
    {
        if (Date.day < number && ThereIsLetterInWord(Date.month, letter))
        {
            TxtFile <<  Date.day << " " << Date.month << " " << Date.year << endl;
        }
    }
    BinFile.close();
    TxtFile.close();
}

При завершении работы функции дает исключение и кидает в файл xmemory. Прошелся отладчиком и все работает, даже данные в txt файл записываются.
Структура:

C++
1
2
3
4
5
6
struct date
{
    int day;
    string month;
    int year;
};



0



oleg-m1973

6578 / 4563 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.07.2020, 17:00

2

Лучший ответ Сообщение было отмечено Doppelganker как решение

Решение

Цитата
Сообщение от Doppelganker
Посмотреть сообщение

При завершении работы функции дает исключение и кидает в файл xmemory. Прошелся отладчиком и все работает, даже данные в txt файл записываются.

std::string нельзя читать из файла таким образом. Здесь нужно сделать

C++
1
2
3
4
5
6
struct date
{
    int day;
    char month[32];
    int year;
};



2



1 / 1 / 0

Регистрация: 27.04.2020

Сообщений: 59

25.07.2020, 17:01

 [ТС]

3

oleg-m1973, Есть вариант сделать именно со string? Потому что в методичке по лабораторной работе сказано делать со string



0



6578 / 4563 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

25.07.2020, 17:03

4

Цитата
Сообщение от Doppelganker
Посмотреть сообщение

oleg-m1973, Есть вариант сделать именно со string? Потому что в методичке по лабораторной работе сказано делать со string

Только читать/записывать каждое поле по-отдельности, при помощи операторов << >>.



0



1 / 1 / 0

Регистрация: 27.04.2020

Сообщений: 59

25.07.2020, 17:04

 [ТС]

5

oleg-m1973, Понял, спасибо большое



0



I have made a winform app where i have used vectors of array[n][n] type using

typedef char myarray[9][9];  
typedef vector<myarray> array3d; 

as far as i have read, this feature is provided in c++0x. I am using visual studio 2010 ultimate is the error in xmemory because of this? The ide is showing no other error exept from this (not even where the above code is)

'Target of operator new()' : array initialization needs curly braces

pointing to this code in xmemory

void construct(pointer _Ptr, _Ty&& _Val)
    {   // construct object at _Ptr with value _Val
    ::new ((void _FARQ *)_Ptr) _Ty(_STD forward<_Ty>(_Val));
    }

In a code of over 2.5 k lines how do i find where’s the problem?

EDIT:

Since the problems seem with vectors here are all the operations that i do with vectors

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

typedef char myarray[9][9];
typedef string string_array[9][9];

void function2(vector<string_array>*my_3d_string_array, int d)
{
    string::iterator it;
    int j,cl;
    it=find((*my_3d_string_array)[d][j][cl].begin(),(*my_3d_string_array)[d][j][cl].end(),3);
    (*my_3d_string_array)[d][2][3].erase(it);
}

void function(vector<string_array>*my_3d_string_array, int d)
{
    (*my_3d_string_array)[d][3][4] = 2;
    function2(my_3d_string_array,d);
}

int main()
{
    myarray matrix;
    string_array string_matrix;

    std::vector<myarray>      my_3d_array;
    std::vector<string_array> my_3d_string_array;

    // fill_matrix(matrix);
    // fill_string_matrix(string_matrix)

    int d;
    function(&my_3d_string_array, d); // passing pointer to vector to a function d is the 3rd dimention

    my_3d_array.push_back(matrix);
    my_3d_string_array.push_back(string_matrix);
}

is there a stupid error i am making here?

#include <string>
#include <vector>
#include <iostream>
#include <stdexcept>

using namespace std;

class Main

{

public:
static void main(std::vector<std::wstring>& args);

static void fun(std::vector<int>& arr, int n);

};

#include <string>
#include <vector>

int main(int argc, char** argv)
{
std::vector<std::wstring> args(argv + 1, argv + argc);
Main::main(args);
}

void Main::main(std::vector<std::wstring>& args)

{

try
{

// declare and initialize array

std::vector<int> arr1 = { 1, 5, 10, -2, 4, -3, 6 };

int num1 = 3;

std::wcout << L»Numbers greater than » << num1 << L» in the 1st array are :» << std::endl;

// call the function to print the Number greater than 3

fun(arr1, num1);

// declare and initialize array

std::vector<int> arr2 = { 10, 7, 12, 17, 22 };

int num2 = 12;

std::wcout << L»Numbers greater than » << num2 << L» in the 2nd array are :» << std::endl;

// call the function to print the Number greater than 12

fun(arr2, num2);

}
catch (const std::runtime_error)
{

return;
}

}

void Main::fun(std::vector<int>& arr, int n)

{

for (int i = 0; i < arr.size(); i++)

{

// if the array element is greater than the value of n, then print it

if (arr[i] > n)
{

std::wcout << arr[i] << L» «;
}

}

std::wcout << std::endl;

}

Severity Code Description Project File Line Suppression State
Error C2664 ‘std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::basic_string(std::initializer_list<_Elem>,const _Alloc &)’: cannot convert argument 1 from ‘char *’ to ‘std::initializer_list<_Elem>’ Programming Project2 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xmemory 714

I am unsure exaclty where the error is or how to fix it has its in the xmemory. Not sure how to adjust argument 1 to get the code to run. Any help is appreciated.

Last edited on

I don’t see it, but its telling you that you have bad arguments to a constructor; I think its
std::vector<std::wstring> args(argv + 1, argv + argc);

if you look at your error, it will have the line number (and column) where it choked.
Its not in xmemory, that is a symptom, but one of your error messages will point to your file and a line number.

it is unusual to wrap main in an object without reason. If you have a reason, its fine. If not, its ‘java like’ and ‘weird’ in c++.

Last edited on

Problem is that

std::wstring

, a string of

wchar_t

, can’t be constructed using a pointer to

char

.

To fix the problem,
Replace every

wcout

with

cout

Replace every

wstring

with

string

Replace every

with

«

Then fix up, removing code that doesn’t do anything:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vector>
#include <iostream>

void print_elements_greater_than(std::vector<int> const& xs, int n)
{ 
  for (int x: xs) 
    if (x > n) std::cout << x << ' ';
  std::cout << '\n';
}

int main()
{
  std::vector<int> const arr1 { 1, 5, 10, -2, 4, -3, 6 };  
  int const num1 = 3;
  std::cout << "Numbers greater than " << num1 << " in the 1st array are :\n";
  print_elements_greater_than(arr1, num1);
  
  std::vector<int> const arr2 { 10, 7, 12, 17, 22 };
  int const num2 = 12;
  std::cout << "Numbers greater than " << num2 << " in the 2nd array are :\n";
  print_elements_greater_than(arr2, num2);
}

Last edited on

Or what should I use instead of main?

mbozzi’s code above works for me with VS2022. What problems are you having with it?

It’s telling me it’s in line 714 which doesn’t exist for me to view.

This is an artifact of how the C++ standard library operates. Symptoms of the error appear in the implementation of the standard library rather than your code. Line 714, of a different file.

Every mainstream compiler follows the source of the error back to your code. Keep reading the error message, always top-down, until the first time it refers to a file and line number in your code. Start there.

Generally, there is no point in trying to diagnose an error by looking at the implementation of the standard library (e.g. in

xmemory

).

Last edited on

Or what should I use instead of main?

are you asking me? Most code looks like Mbozzi’s above, a main function that creates some variables and kicks off another method (whether belonging to an object or not).
the extra object for «Main» was just visual clutter — its not «wrong» but served no purpose in c++.

Привет!

У меня есть такой код

template<typename T>
vector<T> Read(string path)
{
    ifstream myFile(path, ios::in | ios::binary);
    vector<T> arr;

    T item;
    while (myFile.read((char*)&item, sizeof(T))) {
        arr.push_back(item);
    }

    myFile.close();
    return arr;
}

и такой мейн

auto users = Read<User>("user.dat");
    for (int i = 0; i < users.size(); i++)
    {
        cout << users[i].getUsername() << " " << users[i].getPassword() << endl;
    }

При запуске переходит к файлу xmemory и говорит — нарушение прав доступа

При помощи дебага понял что все работает отлично, но при ретурне выскакивает ошибка


  • Вопрос задан

  • 314 просмотров

Скорее всего, тип User нельзя вот так вот читать и писать в файл. Подозреваю, что там содержатся std::string, которые сами в себе хранят лишь указатели на символы в строке. Поэтому, если std::string записать в файл как набор байт, то вы запишете в файл указатели. Прочитав их назад из файла, вы получите случайне адреса, не указывающие ни на что.

Вам придется писать руками ввод и вывод типа из файла.

Пригласить эксперта


  • Показать ещё
    Загружается…

21 сент. 2023, в 20:54

10000 руб./за проект

21 сент. 2023, в 20:40

20000 руб./за проект

21 сент. 2023, в 19:28

10000 руб./за проект

Минуточку внимания

Итак, немного предыстории; Я использую Virtual Studio 2017 и изучаю C ++. Я только что загрузил шаблонный проект для работы, и есть один конкретный класс, класс Enemy (его вид стрелялок сверху вниз), который вызывает очень запутанную ошибку;

Враг :: Враг (const Enemy) &) ‘: попытка сослаться на удаленную функцию

Проблема в том, что эта ошибка возникает только на компьютере, на котором я работаю. Кажется, что ошибка возникает в этом классе в файле xmemory (где журнал ошибок говорит мне, что это так), в частности в функции с четвёртого по последний:

template<class _Alloc>
struct _Default_allocator_traits
{   // traits for std::allocator
using allocator_type = _Alloc;
using value_type = typename _Alloc::value_type;

using pointer = value_type *;
using const_pointer = const value_type *;
using void_pointer = void *;
using const_void_pointer = const void *;

using size_type = size_t;
using difference_type = ptrdiff_t;

using propagate_on_container_copy_assignment = false_type;
using propagate_on_container_move_assignment = true_type;
using propagate_on_container_swap = false_type;
using is_always_equal = true_type;

template<class _Other>
using rebind_alloc = allocator<_Other>;

template<class _Other>
using rebind_traits = allocator_traits<allocator<_Other>>;

_NODISCARD static _DECLSPEC_ALLOCATOR pointer allocate(_Alloc&, _CRT_GUARDOVERFLOW const size_type _Count)
{   // allocate array of _Count elements
return (static_cast<pointer>(_Allocate<_New_alignof<value_type>>(_Get_size_of_n<sizeof(value_type)>(_Count))));
}

_NODISCARD static _DECLSPEC_ALLOCATOR pointer allocate(_Alloc&, _CRT_GUARDOVERFLOW const size_type _Count,
const_void_pointer)
{   // allocate array of _Count elements, with hint
return (static_cast<pointer>(_Allocate<_New_alignof<value_type>>(_Get_size_of_n<sizeof(value_type)>(_Count))));
}

static void deallocate(_Alloc&, const pointer _Ptr, const size_type _Count)
{   // deallocate _Count elements at _Ptr
// no overflow check on the following multiply; we assume _Allocate did that check
_Deallocate<_New_alignof<value_type>>(_Ptr, sizeof(value_type) * _Count);
}

template<class _Objty,
class... _Types>
static void construct(_Alloc&, _Objty * const _Ptr, _Types&&... _Args)
{   // construct _Objty(_Types...) at _Ptr
::new (const_cast<void *>(static_cast<const volatile void *>(_Ptr)))
_Objty(_STD forward<_Types>(_Args)...);
}

template<class _Uty>
static void destroy(_Alloc&, _Uty * const _Ptr)
{   // destroy object at _Ptr
_Ptr->~_Uty();
}

_NODISCARD static size_type max_size(const _Alloc&) _NOEXCEPT
{   // get maximum size
return (static_cast<size_t>(-1) / sizeof(value_type));
}

_NODISCARD static _Alloc select_on_container_copy_construction(const _Alloc& _Al)
{   // get allocator to use
return (_Al);
}
};

Интересно, что этого не происходит, когда я делаю объекты; Это происходит, когда я помещаю их в векторный объект, чтобы сохранить их. Любая помощь будет принята с благодарностью!

постскриптум Я надеваю тег Visual Studio 2017, потому что кажется, что эта ошибка похожа на ту, что люди описывают как «константные векторы против вектора констант». Насколько я могу судить, формулировка точно такая же.

0

Решение

Удаленная функция является конструктором копирования. Это сообщение об ошибке означает, что класс «Враг» не предназначен для копирования.

Enemy(const Enemy&) = delete;

Распределитель для вектора STL сделает копии объектов, когда вы добавите их в контейнер. Используйте указатели:

std::vector<Enemy*> enemy_ptrs;
enemy_ptrs.push_back(new Enemy());

Вектор, приведенный выше, теперь создает копии адреса, где находится объект, а не сам объект. Просто не забудьте удалить их или использовать C ++ 11 shared_ptrs.

0

Другие решения

Других решений пока нет …

Понравилась статья? Поделить с друзьями:
  • Xerox ошибка 077 909
  • Xmedia recode ошибка
  • Xerox код ошибки 016 799
  • Xerox ошибка 073 210
  • Xlsm ошибка при открытии