Ошибка при чтении символов строки c string

Пытаясь делать курсовую работу, застрял вот на таком моменте:

...

Вот скриншот консоли на каком месте остановилась программа:

...

Я делаю решение системы линейных уравнений и думаю, что ошибка кроется в cout и cin, а именно в буфере ввода. Как я понял из информации в интернете, это происходит из-за того, что в нём остаётся символ n и от этого все проблема, но это не точно.

Когда убираешь <<z<< и остаётся просто: "Введите коэффициенты неизвестных уравнения через ;" << endl; — то программа продолжает работать и после ввода
коэффициентов, и вывода следующего cout опять та же ошибка. Уже пробовал всякие
cin.sync() и cin.clear(), но ничего не изменилось. Помогите пожалуйста и объясните как исправить.

#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include<locale.h>
#include<curand.h>
#include<curand_kernel.h>
#include<time.h>
#include <stdlib.h>
#include <string>
#include <cstdio>

using namespace std;

__global__ void vichislenie( int *index, float *mas, int *kolvoperem )
{
    int indexGPU = threadIdx.x + *kolvoperem - 1 ;
    //for
    //while (index < 33792)
    //{
    /*if (*number < mas1[index])
        *otvchislo = 0;*/
    //index += blockDim.x * gridDim.x;
    //}
}
/*float *randomer(float *mas)

{
for (unsigned short i = 0; i < 33792; i++)
    mas[i] = 0.01 * (rand() % 10100);


return mas;
}*/




int main( void )
{
    setlocale( LC_ALL, "RUS" );
    unsigned short kolvostrok = 0;
    int kolvoperem = 0;
    int index = 0;
    float *masOtvet = new float[kolvostrok];
    cout << "Введите кол-во неизвестных переменных:  ";
    cin >> kolvostrok;
    cout << "Введите кол-во уравнений:  ";
    cin >> kolvoperem;
    cout << "Введите правые части уравнений:  ";

    for( unsigned short i = 0; i < kolvostrok; i++ ) {
        cin >> masOtvet[i];
        cin.sync();
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        //int dummy; my_cin(dummy);
    }

    index = kolvostrok * kolvoperem;
    float *masKoefic = new float[index];

    for( unsigned short i = 0; i < index ; i++ ) {
        masKoefic[i] = 0.0;
    }

    char *str = new char[kolvoperem * 2 * kolvostrok * 16];

    for( unsigned short i = 0; i < ( strlen( str ) ); i++ ) {
        str[i] = ' ';
    }

    unsigned short schetchik = 1;
    unsigned short schetchik1 = 0;
    char *StrBufMas = new char[kolvoperem * 2 * 16];

    for( int z = 1; z < kolvostrok + 1; z++ ) {
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        cout << "Введите коэфициенты неизвестных уравнения "
             << z << " через ;" << endl;
        cout << "(если в уравнении не полное кол-во переменных, то вместо них поставить нули): "
             << endl;
        cin >> StrBufMas;
    }

    //scanf("%s", *StrBufMas);
    schetchik1 = 1;

    for( unsigned short i = 0; i < kolvoperem * 2 * kolvostrok * 16; i++ ) {
        if( ( str[i + 1] ) == ' ' ) {
            if( schetchik1 == 1 ) {
            }
            else {
                break;
            }

            for( unsigned short i = 0; i < strlen( StrBufMas ); i++ ) {
                str[i + schetchik] = StrBufMas[i];

                if( i == ( strlen( StrBufMas ) ) - 1 ) {
                    schetchik = schetchik + strlen( StrBufMas ) + 1;
                    schetchik1 = 0;
                }
            }
        }
    }

    /*size_t t = 6;
    char s1[10] = " tttrrrrr";
    char *s2 = new char[1];
    strcpy(s2, (s1-t));*/
    delete [kolvoperem * 2 * 16] StrBufMas, StrBufMas = NULL;
    schetchik = 0;
    schetchik1 = 0;
    char StrBufMas1[16] = "";

    for( unsigned short i = 0; i < strlen( str ) - 1; i++ ) {
        if( ( str[i] == ' ' ) || ( str[i] == ';' ) ) {
            //i -= 1;
        }
        else {
            schetchik++;
            schetchik1++;

            /*char *StrBufMas = new char[schetchik1];
            StrBufMas[schetchik1 - 1] = str[i];*/
            //strcat(StrBufMas1, &str[i]);
            if( ( str[i + 1] == ' ' ) || ( str[i + 1] == ';' ) ) {
                strncpy( StrBufMas1, &str[i - schetchik1 + 1], schetchik1 );
                masKoefic[i - schetchik] = atof( StrBufMas1 );
                //StrBufMas1 = ;
                //delete[schetchik1] StrBufMas;
                schetchik1 = 0;

                for( unsigned char j = 15; j > 0; j-- ) {
                    StrBufMas1[j] = '';
                }
            }
        }
    }

    float *masAll = new float[index - 1 + kolvostrok];
    schetchik = 0;
    schetchik1 = 1;

    for( unsigned short i = 0; i < index - 1 + kolvostrok; i++ ) {
        if( i == ( index + schetchik ) / kolvostrok ) {
            masAll[i] = masOtvet[i - ( i * schetchik1 )];
            schetchik1++;
            schetchik = schetchik + index + kolvostrok;
        }
        else {
            masAll[i] = masKoefic[i];
        }
    }

    float *dev_mas;
    int *dev_index;
    int *dev_kolvoperem;
    cudaMalloc( ( void ** )&dev_index, sizeof( int ) );
    cudaMalloc( ( void ** )&dev_mas, sizeof( float ) );
    cudaMalloc( ( void ** )&dev_kolvoperem, sizeof( int ) );
    cudaMemcpy( dev_index, &index, sizeof( int ), cudaMemcpyHostToDevice );
    cudaMemcpy( dev_mas, &masKoefic, index * sizeof( float ),
                cudaMemcpyHostToDevice );
    cudaMemcpy( dev_kolvoperem, &kolvoperem, sizeof( int ),
                cudaMemcpyHostToDevice );
    vichislenie << <1, kolvoperem >> > ( dev_index, dev_mas, dev_kolvoperem );
    //n = atoi(S.c_str())
    /*float number;
    cout << "Введите число k:  ";
    cin >> number;

    int otvchislo = 1;
    int *dev_otvchislo;
    float *dev_number;

    unsigned short i = 256;
    while (i != 0)
    {
    cudaMalloc((void**)&dev_otvchislo, sizeof(int));
    cudaMalloc((void**)&dev_number, sizeof(float));

    cudaMemcpy(dev_otvchislo, &otvchislo, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_number, &number, sizeof(float), cudaMemcpyHostToDevice);

    float mas[33792];
    float *dev_mas1;
    randomer(mas);
    cudaMalloc((void**)&dev_mas1, 33792 * sizeof(float));
    cudaMemcpy(dev_mas1, &mas, 33792 * sizeof(float), cudaMemcpyHostToDevice);

    vichislenie << <128, 128 >> > (dev_number, dev_otvchislo, dev_mas1);

    cudaMemcpy(&mas, dev_mas1, 33792 * sizeof(float), cudaMemcpyDeviceToHost);
    cudaMemcpy(&otvchislo, dev_otvchislo, sizeof(int), cudaMemcpyDeviceToHost);

    cudaFree(dev_mas1);
    cudaFree(dev_number);
    cudaFree(dev_otvchislo);

    i -= 1;
    }


    if (otvchislo == 1)
    {
    unsigned char otv[4] = "да";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }
    else
    {
    unsigned char otv[4] = "нет";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }*/
    system( "pause" );
    return 0;
}

I have the following block of code:

for( CarsPool::CarRecord &record : recs->GetRecords())
{
  LVITEM item;
  item.mask = LVIF_TEXT;
  item.cchTextMax = 6;

  item.iSubItem = 0;
  item.pszText = (LPSTR)(record.getCarName().c_str()); //breakpoint on this line.
  item.iItem = 0;
  ListView_InsertItem(CarsListView, &item);

  item.iSubItem = 1; 
  item.pszText = TEXT("Available");
  ListView_SetItem(CarsListView, &item);

  item.iSubItem = 2;
  item.pszText = (LPSTR)CarsPool::EncodeCarType(record.getCarType());
  ListView_SetItem(CarsListView, &item);
}

The information from Visual Studio Debugger is here:

enter image description here

Why isn’t the program able to read the characters from string?

A test has shown me that it works in this way:

MessageBox(hWnd, (LPSTR)(record.getCarName().c_str()), "Test", MB_OK);

asked Sep 22, 2013 at 17:07

Victor's user avatar

3

getCarName likely returns a temporary. After the assignment the temporary object is destroyed and the pointer item.pszText points to invalid memory. You must ensure that the string object is valid during the call to ListView_InsertItem.

std::string text(record.getCarName());
item.iSubItem = 0;
item.pszText = const_cast<LPSTR>(text.c_str());
item.iItem = 0;
ListView_InsertItem(CarsListView, &item);

The const_cast is an artifact of the fact that the Windows API uses the same structure to set and retrieve information. When invoking ListView_InsertItem the structure is immutable, however there is no way to reflect that in the language.

answered Sep 22, 2013 at 17:26

IInspectable's user avatar

IInspectableIInspectable

46.3k8 gold badges84 silver badges179 bronze badges

1

It looks like you’re trying to use the value of a C++ «string» in a C/Win32 call.

stdstring.c_str() is the correct way to do it.

… BUT …

You should strcpy() the string to a temp variable, then make the Win32 call with the temp variable.

answered Sep 22, 2013 at 17:18

paulsm4's user avatar

paulsm4paulsm4

113k16 gold badges137 silver badges189 bronze badges

1

Skel

0 / 0 / 0

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

Сообщений: 19

1

Ошибка при чтении символов строки при создании объекта класса

26.03.2021, 17:42. Показов 2241. Ответов 9

Метки c++, класс, Строки (Все метки)


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

У меня имеется класс Song, в котором присутствуют поля имени песни (Name) и длительности песни (Duration). Также в этом классе есть конструктор, заполняющий поля стандартными значениями. При создании такого объекта в main() смотрю через отладчик, что в поле Name (а именно — Name -> _MyPair -> Базовое представление -> _MyVal2 -> _Bx -> _Ptr) есть надпись — «ошибка при чтении символов строки». Причем странно, что все время все компилилось и работало, но сегодня почему-то вылезло такое. Короче, сам код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Song
{
private:
    std::string Name;
    int Duration;
 
public:
    Song()
    {
        this->Name = "";
        this->Duration = 0;
    }
}
 
int main()
{
Song* song = new Song;
 
/* ... */
}

Пробовал уже и само поле инициализировать, и способ задания имени в конструкторе менять на такой, все без толку:

C++
1
this->Name = {}



0



0 / 0 / 0

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

Сообщений: 19

27.03.2021, 05:49

 [ТС]

2

Примечательно еще то, что у меня есть другие классы тоже с полем string Name и с аналогичными конструкторами, но там все с этими именами в порядке. Глюк какой, что ли…



0



Вездепух

Эксперт CЭксперт С++

10951 / 5937 / 1625

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

Сообщений: 14,905

27.03.2021, 06:09

3

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

смотрю через отладчик, что в поле Name (а именно — Name -> _MyPair -> Базовое представление -> _MyVal2 -> _Bx -> _Ptr) есть надпись — «ошибка при чтении символов строки». Причем странно, что все время все компилилось и работало, но сегодня почему-то вылезло такое

Не понял. Где проблема? Зачем вы туда полезли смотреть? У вас что-то не работало? Если что-то не работало — то пишите, что именно.

Также: где в вашем вопросе написано, какую реализацию std::string вы использовали? Компилятор? Отладчик?

Внутреннее представление класса std::string зависит от реализации и может быть оптимизировано массой разных способов, особенно для коротких или пустых строк. Вполне возможно, что для такой — пустой — строки через этот указатель и не должно быть видно никаких осмысленных символов. Да, и я тоже вижу, что у меня в Visual Studio в таком примере поле ... _Bx -> _Ptr содержит мусор. Это нормально.

Возьмите строку подлиннее, и вы увидите, что, начиная с какой-то длины (16 символов?), начнет использоваться поле ... _Bx -> _Ptr.

Еще раз: где описание реальной проблемы, которую вы пытаетесь решить? Что не работает?

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

Глюк какой, что ли…

Не нужно строить фантастических теорий, когда вполне естественное и логичное объяснение лежит на поверхности.



0



Skel

0 / 0 / 0

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

Сообщений: 19

27.03.2021, 06:29

 [ТС]

4

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

Зачем вы туда полезли смотреть? У вас что-то не работало?

Да, я потом использую эту переменную Name для проверки имени на соответствие. Пользователь вводит название песни, прога проверяет все альбомы на подходящие песни и возвращает первую найденную. В альбомах по 4 песни. Как работает цикл: пока имя песни не пустое значение, то проверяй ее на соответствие, иначе переходи к следующему альбому. В первом альбоме 4 песни он проверяет нормально, но как только доходит до следующей песни (которой по факту не существует, там должен мусор лежать), там лежит «ошибка чтения символов строки», и выдает исключение bad_alloc.

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

содержит мусор. Это нормально.

Если бы просто мусор — то да, нормально. Но туда почему-то записывается именно ошибка. Код скину в след. посте, чтоб этот не нагромождать.

Добавлено через 6 минут
У меня еще есть класс Band (это сама группа, но она не так важна, там лишь метод сравнения песен лежит, который нужен).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
class Song
{
private:
    std::string Name;
    int Duration;
 
public:
    Song()
    {
        this->Name = "";
        this->Duration = 0;
    }
std::string GetSongName()
    {
        return this->Name;
    }
};
 
class Album
{
private:
    std::string Name;
    int ReleaseYear;
    Song* Songs;
 
public:
    Album()
    {
        this->Name = "";
        this->ReleaseYear = 1900;
        this->Songs = { };
    }
 
Song* GetAlbumSongs()
    {
        return this->Songs;
    }
};
 
class Band
{
private:
    std::string Name;
    std::string Description;
    Album* Albums;
 
public:
    Band()
    {
        this->Albums = {};
        this->Description = "";
        this->Name = "";
    }
Album* GetBandAlbums()
    {
        return this->Albums;
    }
 
Song* FindSong(std::string songTitle, int albCount)
    {
        int b = 0;
        int g = 0;
 
        for (int i = 0; i < albCount; ++i)
        {
            b = 0;
            while (this->GetBandAlbums()[i].GetAlbumSongs()[b].GetSongName() != "") // проверка, пока имя песни не пустое значение
            {
 
                if this->GetBandAlbums()[i].GetAlbumSongs()[b].GetSongName() == songTitle) // сравнение имени песни
                {
                    return this->GetBandAlbums()[i].GetAlbumSongs();
                }
                ++b;
 
            }
        }
 
        return nullptr;
    }
}



0



Вездепух

Эксперт CЭксперт С++

10951 / 5937 / 1625

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

Сообщений: 14,905

27.03.2021, 06:39

5

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

Если бы просто мусор — то да, нормально. Но туда почему-то записывается именно ошибка.

Вы делаете какие-то дикие и странные фантасмагорические выводы. С чего вы взяли, что туда «записывается именно ошибка»? Никакая «ошибка» туда не записывается.

Поле ... _Bx -> _Ptr в отладочном режиме содержит 0x6161616161616161 или 0xcdcdcdcdcdcdcd00, т.е. какое-то явно специально выбранное бессмысленно-мусорное указательное значение. А сообщение об «ошибке» вам пишет уже отладчик. Никуда это сообщение не «записывается».

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

и выдает исключение bad_alloc.

Никакого отношения к теме ... _Bx -> _Ptr эта ошибка не имеет. Вы накосячили где-то совсем в другом месте.



0



0 / 0 / 0

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

Сообщений: 19

27.03.2021, 06:40

 [ТС]

6

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

Вы делаете какие-то дикие и странные фантасмагорические выводы

Однако прога перестала работать ни с того ни с сего. Пошел в отладчик и нашел такое. Раньше этого не было. Ничего я у класса песни не менял. Так ведь заметь, что в других классах с именами все в порядке, с песнями почему-то такое приключилось



0



Вездепух

Эксперт CЭксперт С++

10951 / 5937 / 1625

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

Сообщений: 14,905

27.03.2021, 06:50

7

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

Решение

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

Пошел в отладчик и нашел такое. Раньше этого не было.

Нет, вы выдумываете. Это было всегда. Это совершенно нормальное поведение std::string.

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

Однако прога перестала работать ни с того ни с сего.

Еще раз: никакого отношения к теме ... _Bx -> _Ptr ваше «перестала работать» не имеет. Вы накосячили где-то совсем в другом месте.

Перестаньте заниматься фигней и разглядывать ... _Bx -> _Ptr, а ищите у себя косяки: вылет за пределы массива, обращение к удаленной памяти и т.п.

Добавлено через 6 минут

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

В первом альбоме 4 песни он проверяет нормально, но как только доходит до следующей песни (которой по факту не существует, там должен мусор лежать)

Чего? Это что за белиберда? Какое еще «должен мусор лежать»?

Ваш цикл поиска песни написан так, что последовательность песен в альбоме обязательно (!) должна заканчиваться песней с пустым именем. Не «мусором», а песней с пустым именем (!). Если в альбоме 4 песни, то размер массива песен должен равняться 5 и последняя «фиктивная» песня должна иметь пустое имя. Если вы не соблюдете это жесткое правило, программа будет падать.



1



0 / 0 / 0

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

Сообщений: 19

27.03.2021, 07:13

 [ТС]

8

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

Возьмите строку подлиннее

Смотри, я в конструкторе изменил поле присвоения названия песни на 20-25 букв d, вместо «» (как ты и сказал, взять строку подлиннее). И заработало. Возвращаю обратно на пустое имя — ошибка. Как так-то? Неужели мне теперь по стандарту каждой песни какое-то имя из 15+ букв задавать? Некрасиво как-то.

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

Чего? Это что за белиберда?

Цикл безотказно работает. При встрече с мусором он его считает за пустую строку и просто переходит к след. альбому.

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

Если в альбоме 4 песни, то размер массива песен должен равняться 5 и последняя «фиктивная» песня должна иметь пустое имя

Зачем выделять место еще для одной лишней песни? Вот если б разговор про выделение памяти под символы, то да, выделять нужно на 1 больше заявленного размера для ».
UPD. Хм, точно, выделил на 1 больше размер массива — все теперь работает и с пустым значением строки. Спасибо большое!



0



Алексей1153

фрилансер

4807 / 4402 / 939

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

Сообщений: 11,630

27.03.2021, 07:29

9

Skel, Вот ещё вариант с STL, смотри, насколько всё проще )) Не нужно три дня штурмовать форум, десять минут — и всё готово

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
#include <optional>
 
class Song
{
public:
    std::string Name;
    int Duration{};
};
 
class Album
{
public:    
    std::string Name;
    std::vector<Song> Songs;
    int ReleaseYear{1900};
};
 
class Band
{
public:    
    std::string Name;
    std::string Description;
    std::vector<Album> Albums;
 
    std::optional<Song> FindSong(const std::string_view songTitle)const
    {
        for(const auto& Album:Albums)
        {
            for(const auto& song:Album.Songs)
            {
                if(song.Name==songTitle)
                {
                    return song;
                }
            }
        }
 
        return {};
    }
};
 
int main()
{
    Song s;
    s.Name="Hello";
    
    Album a;
    a.Name="Fallen";
    a.Songs.push_back(s);
    
    Band b;
    b.Name="Evanescence";
    b.Albums.push_back(a);
    
    if(auto song=b.FindSong("Hello"))
    {
        std::cout<<"song name: "<<song->Name<<'n';
    }
}



1



Вездепух

Эксперт CЭксперт С++

10951 / 5937 / 1625

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

Сообщений: 14,905

27.03.2021, 07:33

10

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

Цикл безотказно работает. При встрече с мусором он его считает за пустую строку и просто переходит к след. альбому.

Ым… Што????

При встрече с «мусором» происходит неопределенное поведение и ваша программа падает во все воронье горло. А то, что вам раньше казалось, что она не падала — это вы ее просто плохо тестировали.

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

Зачем выделять место еще для одной лишней песни?

Чтобы программа не падала. Вам нужно иметь возможность определить фактический размер массива, чтобы не вылетать за его пределы. А как вы это будете делать — ваше дело.

Разумнее/экономнее было бы хранить размер массива, как это делает std::vector, а не цеплять в конце массива дополнительную фиктивную песню с пустым именем. Но и так тоже можно. А еще разумнее было бы просто использовать std::vector.

Главное — если вы будете рассчитывать на ваше наивное «при встрече с мусором он его считает за пустую строку», то ваша программа будет просто падать.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

27.03.2021, 07:33

10

Пытаясь делать курсовую работу, застрял вот на таком моменте:

...

Вот скриншот консоли на каком месте остановилась программа:

...

Я делаю решение системы линейных уравнений и думаю, что ошибка кроется в cout и cin, а именно в буфере ввода. Как я понял из информации в интернете, это происходит из-за того, что в нём остаётся символ n и от этого все проблема, но это не точно.

Когда убираешь <<z<< и остаётся просто: "Введите коэффициенты неизвестных уравнения через ;" << endl; — то программа продолжает работать и после ввода
коэффициентов, и вывода следующего cout опять та же ошибка. Уже пробовал всякие
cin.sync() и cin.clear(), но ничего не изменилось. Помогите пожалуйста и объясните как исправить.

#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include<locale.h>
#include<curand.h>
#include<curand_kernel.h>
#include<time.h>
#include <stdlib.h>
#include <string>
#include <cstdio>

using namespace std;

__global__ void vichislenie( int *index, float *mas, int *kolvoperem )
{
    int indexGPU = threadIdx.x + *kolvoperem - 1 ;
    //for
    //while (index < 33792)
    //{
    /*if (*number < mas1[index])
        *otvchislo = 0;*/
    //index += blockDim.x * gridDim.x;
    //}
}
/*float *randomer(float *mas)

{
for (unsigned short i = 0; i < 33792; i++)
    mas[i] = 0.01 * (rand() % 10100);


return mas;
}*/




int main( void )
{
    setlocale( LC_ALL, "RUS" );
    unsigned short kolvostrok = 0;
    int kolvoperem = 0;
    int index = 0;
    float *masOtvet = new float[kolvostrok];
    cout << "Введите кол-во неизвестных переменных:  ";
    cin >> kolvostrok;
    cout << "Введите кол-во уравнений:  ";
    cin >> kolvoperem;
    cout << "Введите правые части уравнений:  ";

    for( unsigned short i = 0; i < kolvostrok; i++ ) {
        cin >> masOtvet[i];
        cin.sync();
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        //int dummy; my_cin(dummy);
    }

    index = kolvostrok * kolvoperem;
    float *masKoefic = new float[index];

    for( unsigned short i = 0; i < index ; i++ ) {
        masKoefic[i] = 0.0;
    }

    char *str = new char[kolvoperem * 2 * kolvostrok * 16];

    for( unsigned short i = 0; i < ( strlen( str ) ); i++ ) {
        str[i] = ' ';
    }

    unsigned short schetchik = 1;
    unsigned short schetchik1 = 0;
    char *StrBufMas = new char[kolvoperem * 2 * 16];

    for( int z = 1; z < kolvostrok + 1; z++ ) {
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        cout << "Введите коэфициенты неизвестных уравнения "
             << z << " через ;" << endl;
        cout << "(если в уравнении не полное кол-во переменных, то вместо них поставить нули): "
             << endl;
        cin >> StrBufMas;
    }

    //scanf("%s", *StrBufMas);
    schetchik1 = 1;

    for( unsigned short i = 0; i < kolvoperem * 2 * kolvostrok * 16; i++ ) {
        if( ( str[i + 1] ) == ' ' ) {
            if( schetchik1 == 1 ) {
            }
            else {
                break;
            }

            for( unsigned short i = 0; i < strlen( StrBufMas ); i++ ) {
                str[i + schetchik] = StrBufMas[i];

                if( i == ( strlen( StrBufMas ) ) - 1 ) {
                    schetchik = schetchik + strlen( StrBufMas ) + 1;
                    schetchik1 = 0;
                }
            }
        }
    }

    /*size_t t = 6;
    char s1[10] = " tttrrrrr";
    char *s2 = new char[1];
    strcpy(s2, (s1-t));*/
    delete [kolvoperem * 2 * 16] StrBufMas, StrBufMas = NULL;
    schetchik = 0;
    schetchik1 = 0;
    char StrBufMas1[16] = "";

    for( unsigned short i = 0; i < strlen( str ) - 1; i++ ) {
        if( ( str[i] == ' ' ) || ( str[i] == ';' ) ) {
            //i -= 1;
        }
        else {
            schetchik++;
            schetchik1++;

            /*char *StrBufMas = new char[schetchik1];
            StrBufMas[schetchik1 - 1] = str[i];*/
            //strcat(StrBufMas1, &str[i]);
            if( ( str[i + 1] == ' ' ) || ( str[i + 1] == ';' ) ) {
                strncpy( StrBufMas1, &str[i - schetchik1 + 1], schetchik1 );
                masKoefic[i - schetchik] = atof( StrBufMas1 );
                //StrBufMas1 = ;
                //delete[schetchik1] StrBufMas;
                schetchik1 = 0;

                for( unsigned char j = 15; j > 0; j-- ) {
                    StrBufMas1[j] = '';
                }
            }
        }
    }

    float *masAll = new float[index - 1 + kolvostrok];
    schetchik = 0;
    schetchik1 = 1;

    for( unsigned short i = 0; i < index - 1 + kolvostrok; i++ ) {
        if( i == ( index + schetchik ) / kolvostrok ) {
            masAll[i] = masOtvet[i - ( i * schetchik1 )];
            schetchik1++;
            schetchik = schetchik + index + kolvostrok;
        }
        else {
            masAll[i] = masKoefic[i];
        }
    }

    float *dev_mas;
    int *dev_index;
    int *dev_kolvoperem;
    cudaMalloc( ( void ** )&dev_index, sizeof( int ) );
    cudaMalloc( ( void ** )&dev_mas, sizeof( float ) );
    cudaMalloc( ( void ** )&dev_kolvoperem, sizeof( int ) );
    cudaMemcpy( dev_index, &index, sizeof( int ), cudaMemcpyHostToDevice );
    cudaMemcpy( dev_mas, &masKoefic, index * sizeof( float ),
                cudaMemcpyHostToDevice );
    cudaMemcpy( dev_kolvoperem, &kolvoperem, sizeof( int ),
                cudaMemcpyHostToDevice );
    vichislenie << <1, kolvoperem >> > ( dev_index, dev_mas, dev_kolvoperem );
    //n = atoi(S.c_str())
    /*float number;
    cout << "Введите число k:  ";
    cin >> number;

    int otvchislo = 1;
    int *dev_otvchislo;
    float *dev_number;

    unsigned short i = 256;
    while (i != 0)
    {
    cudaMalloc((void**)&dev_otvchislo, sizeof(int));
    cudaMalloc((void**)&dev_number, sizeof(float));

    cudaMemcpy(dev_otvchislo, &otvchislo, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_number, &number, sizeof(float), cudaMemcpyHostToDevice);

    float mas[33792];
    float *dev_mas1;
    randomer(mas);
    cudaMalloc((void**)&dev_mas1, 33792 * sizeof(float));
    cudaMemcpy(dev_mas1, &mas, 33792 * sizeof(float), cudaMemcpyHostToDevice);

    vichislenie << <128, 128 >> > (dev_number, dev_otvchislo, dev_mas1);

    cudaMemcpy(&mas, dev_mas1, 33792 * sizeof(float), cudaMemcpyDeviceToHost);
    cudaMemcpy(&otvchislo, dev_otvchislo, sizeof(int), cudaMemcpyDeviceToHost);

    cudaFree(dev_mas1);
    cudaFree(dev_number);
    cudaFree(dev_otvchislo);

    i -= 1;
    }


    if (otvchislo == 1)
    {
    unsigned char otv[4] = "да";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }
    else
    {
    unsigned char otv[4] = "нет";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }*/
    system( "pause" );
    return 0;
}

Ive been asked to write a function that merges two sorted (ascii sorted) strings without duplicates.
For example, for string1 = aabcd, and string2 = abbcdg, the end result string should be abcdg.
For some reason, the end result string doesnt allocate well, or so I think.. its not working anyway and its giving me weird characters instead of what its supposed to give.
The value of stringToReturn is always 0xfffffffe «Error reading characters of string», and inside it says «Unable to read memory»

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "bohan.h"

int main() {
char* string1;
char* string2;
char* mergedString;
string1 = (char*)malloc(MAX_TEXT + 1);
if (string1 == NULL)
    return;
string2 = (char*)malloc(MAX_TEXT + 1);
if (string2 == NULL)
    return;
printf("Please enter string no. 1: ");
scanf("%s", string1);
printf("Please enter string no. 2: ");
scanf("%s", string2);
mergedString = merge_strings(string1, string2);
printf("%s n", mergedString);

free(string1);
free(string2);
free(mergedString);
}

bohan.c:

#include <stdio.h>
#include <stdlib.h>
#include "bohan.h"

int checkNumberOfChars(char* text) {
int sum = 0;
if (text == NULL)
    return 0;
while (*text != '')
{
    sum++;
    text++;
}
return sum;
}

char* merge_strings(char* text1, char* text2) {
int i;
int hasChanged;
char* stringToReturn;
if (text1 == NULL && text2 == NULL)
    return NULL;
stringToReturn = (char *)malloc(checkNumberOfChars(text1) + checkNumberOfChars(text2) + 1);
if (stringToReturn == NULL)
    return NULL;
for (i = 1; i <= MAX_ASCII; i++) {
    hasChanged = FALSE;
    if (*text1 != '' || *text2 != '') {
        if (*text1 != '') {
            if (i == *text1) {
                *stringToReturn = i;
                stringToReturn++;
                hasChanged = TRUE;
                while (*text1 == i)
                    text1++;
            }
        }
        if (*text2 != '') {
            if (i == *text2) {
                if (!hasChanged) {
                *stringToReturn = i;
                stringToReturn++;
                }
                while (*text2 == i)
                    text2++;
            }
        }
    }
    else
        break;
}
return stringToReturn;
}

bohan.h:

#ifndef DEF
#define TRUE 1
#define FALSE 0
#define MAX_TEXT 100
#define MAX_ASCII 255

int checkNumberOfChars(char *text);
char *merge_strings(char *text1, char *text2);

#endif DEF

Ive been asked to write a function that merges two sorted (ascii sorted) strings without duplicates.
For example, for string1 = aabcd, and string2 = abbcdg, the end result string should be abcdg.
For some reason, the end result string doesnt allocate well, or so I think.. its not working anyway and its giving me weird characters instead of what its supposed to give.
The value of stringToReturn is always 0xfffffffe «Error reading characters of string», and inside it says «Unable to read memory»

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "bohan.h"

int main() {
char* string1;
char* string2;
char* mergedString;
string1 = (char*)malloc(MAX_TEXT + 1);
if (string1 == NULL)
    return;
string2 = (char*)malloc(MAX_TEXT + 1);
if (string2 == NULL)
    return;
printf("Please enter string no. 1: ");
scanf("%s", string1);
printf("Please enter string no. 2: ");
scanf("%s", string2);
mergedString = merge_strings(string1, string2);
printf("%s n", mergedString);

free(string1);
free(string2);
free(mergedString);
}

bohan.c:

#include <stdio.h>
#include <stdlib.h>
#include "bohan.h"

int checkNumberOfChars(char* text) {
int sum = 0;
if (text == NULL)
    return 0;
while (*text != '')
{
    sum++;
    text++;
}
return sum;
}

char* merge_strings(char* text1, char* text2) {
int i;
int hasChanged;
char* stringToReturn;
if (text1 == NULL && text2 == NULL)
    return NULL;
stringToReturn = (char *)malloc(checkNumberOfChars(text1) + checkNumberOfChars(text2) + 1);
if (stringToReturn == NULL)
    return NULL;
for (i = 1; i <= MAX_ASCII; i++) {
    hasChanged = FALSE;
    if (*text1 != '' || *text2 != '') {
        if (*text1 != '') {
            if (i == *text1) {
                *stringToReturn = i;
                stringToReturn++;
                hasChanged = TRUE;
                while (*text1 == i)
                    text1++;
            }
        }
        if (*text2 != '') {
            if (i == *text2) {
                if (!hasChanged) {
                *stringToReturn = i;
                stringToReturn++;
                }
                while (*text2 == i)
                    text2++;
            }
        }
    }
    else
        break;
}
return stringToReturn;
}

bohan.h:

#ifndef DEF
#define TRUE 1
#define FALSE 0
#define MAX_TEXT 100
#define MAX_ASCII 255

int checkNumberOfChars(char *text);
char *merge_strings(char *text1, char *text2);

#endif DEF

Я пытаюсь создать программу универмага для своего школьного проекта.
Я создал массив классов для продуктов, который для начала включает их названия, цены, наличие и количество приобретенных товаров.
Но почему то выскакивает ошибка
«Исключение по адресу 0x68665139 (vcruntime140d.dll) в Test project.exe:
0xC0000005: место записи нарушения прав доступа 0x86A1ECD8. »

Кроме того, я получаю сообщение об ошибке, называемое ошибкой чтения символов строки после выполнения.

Вот мой код:

#include<iostream>
#include<string>


using namespace  std;

class product {
 private:
    int stock;       //items in stock
    int add_stock;   //added stock
    int purchased;   //purchased items(reduces stock)
    string name;     //name of item
    float price;    //price of item

    public:

//fuctions to input all private variables
void setstock(int x) {
    stock = x;
}
void setaddstock(int x) {
    add_stock = x;
}
void setpurchased(int x) {
    purchased = x;
}
void setname(string x) {
    name = x;
}
void setprice(float x) {
    price = x;
}

//functions to output all private variables
int getstock() {
    return stock;
}
int getaddstock() {
    return add_stock;
}
int getpurchased() {
    return purchased;
}
string getname() {
    return name;
}
float getprice() {
    return price;
}

//function that restocks the items
void restock() {
    stock += purchased;
}

//function that deducts purchased items from stock
void destock() {
    if (stock >= purchased) {
        stock -= purchased;
    }
    else {                                                              //in case the purchase demand exceeds items in stock
        cout << "nSorry we only have " << stock << "amount of leftn";
    }
}
};




int main() {
int purchased;
product stuff[10];              //class array
int choice, total_qty = 0;      //choice-> to choose between products, 
total_qty-> total number of products purchased
char yesno;                     //to choose if user wants to buy anything 
else (for do loop)
float total_price = 0;          //total amount of money to be paid 


// declaring product name and price 

 stuff[1].setname  ("Coconut biscuits");                         
stuff[1].setprice  (12.0);
stuff[2].setname  ("Wai Wai noodles");                      stuff[2].setprice  (20.0);
stuff[3].setname  ("Cadbury Dairy Milk");                   stuff[3].setprice  (45.5);
stuff[4].setname  ("Lays");                                 stuff[4].setprice  (50.0);
stuff[5].setname  ("Rara Noodles");                         stuff[5].setprice  (18.5);
stuff[6].setname  ("Khajurko Puff");                        stuff[6].setprice  (50.0);
stuff[7].setname  ( "Nanglo Doughnut");                     stuff[7].setprice  (15.0);
stuff[8].setname  ( "Nanglo whole-wheat bread");            stuff[8].setprice  (65.0);
stuff[9].setname  ("Dabur Real fruit juice");               stuff[9].setprice  (30.0);
stuff[10].setname ("Coca-Cola");                            stuff[10].setprice (35.5);


// declairing the number of items in stock and setting purchased = 0 for easy calculation  
for (int i = 1; i <= 10; i++) {
    stuff[i].setstock     (100);
    stuff[i].setpurchased (0);
}


// displays the menu, make purchase, repeat
cout << "What would you like to buy?nnn";

do {

    for (int i = 1; i <= 10; i++) {
        cout << i << ". " << stuff[i].getname() << "nn";      //displays menu in format: 1. Biscuit
    }

    cout << "Enter your choice: ";
    cin >> choice;

    cout << "nnHow many of it would you like to buy?";
    cin >> purchased;
    stuff[choice].setpurchased(purchased);

    stuff[choice].destock();                            //function for destocking


    cout << "nnWould you like to buy other items?";
    cin >> yesno;

} while (yesno == 'y' || yesno == 'Y');

cout << "nnn";               //line spacing, nothing cool here


//this for loop calculates total quantity and price as well as  displays the receipt
for (int i = 1; i <= 10; i++) {
    total_qty += stuff[i].getpurchased();                                   //total quantity
    total_price += stuff[i].getpurchased() * stuff[i].getprice();                   //total price


    //only displays if stuff is purchased
    if (stuff[i].getpurchased() > 0) {

        //format: 1. Biscuit 4 10 40 
        cout << i << " " << stuff[i].getname() << " " << stuff[i].getpurchased() << " " << stuff[i].getprice() << " " << stuff[i].getpurchased()*stuff[i].getprice() << "n";
    }
}

// displays total price and quantity
cout << "ntotal quantity: " << total_qty;
cout << "ntotal price: " << total_price;



return 0;
}

Заливаю объект класса Example в файл с помощью file.write, после чего пытаюсь вылить его в другой объект с помощью file.read.

Code(заливаю в файл объект):

ofstream file("mytxt.txt", ofstream::app);
for (int i = 0; i < 5; i++) {
    Example* Pups = new Example();
    Pups->age = "Возраст строкой, ДА-ДА";
    file.write((char*)& Pups, sizeof(Example));
    MyWonderfulVector.push_back(*Pups);
}
file.close();

Code(Выливаю объект с файла):

    ifstream file1;
Example Pups1;
file1.open("mytxt.txt", ios_base::in);
while(file1.read((char*)& Pups1, sizeof(Example))){
    Pups1.Print();

}
file1.close();

При считывании объекта из файла его свойство string age не читается, и внутри age оказывается:
<Ошибка при чтении символов строки>

Как мне это исправить? Спасите!
Сам класс Example:

class Example {
public:
    Example() {
        string age = "Привет";
    }
    string age;
    string Print() {
        return age;
    }


};

Понравилась статья? Поделить с друзьями:
  • Ошибка при чтении сим карты
  • Ошибка при чтении сертификата 10053 арм фсс
  • Ошибка при чтении сектора на диске acronis
  • Ошибка при чтении сектора жесткого диска акронис
  • Ошибка при чтении сектора 2048