Пытаясь делать курсовую работу, застрял вот на таком моменте:
Вот скриншот консоли на каком месте остановилась программа:
Я делаю решение системы линейных уравнений и думаю, что ошибка кроется в 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:
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
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
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
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) есть надпись — «ошибка при чтении символов строки». Причем странно, что все время все компилилось и работало, но сегодня почему-то вылезло такое. Короче, сам код:
Пробовал уже и само поле инициализировать, и способ задания имени в конструкторе менять на такой, все без толку:
0 |
0 / 0 / 0 Регистрация: 23.08.2020 Сообщений: 19 |
|
27.03.2021, 05:49 [ТС] |
2 |
Примечательно еще то, что у меня есть другие классы тоже с полем string Name и с аналогичными конструкторами, но там все с этими именами в порядке. Глюк какой, что ли…
0 |
Вездепух 10951 / 5937 / 1625 Регистрация: 18.10.2014 Сообщений: 14,905 |
|
27.03.2021, 06:09 |
3 |
смотрю через отладчик, что в поле Name (а именно — Name -> _MyPair -> Базовое представление -> _MyVal2 -> _Bx -> _Ptr) есть надпись — «ошибка при чтении символов строки». Причем странно, что все время все компилилось и работало, но сегодня почему-то вылезло такое Не понял. Где проблема? Зачем вы туда полезли смотреть? У вас что-то не работало? Если что-то не работало — то пишите, что именно. Также: где в вашем вопросе написано, какую реализацию Внутреннее представление класса Возьмите строку подлиннее, и вы увидите, что, начиная с какой-то длины (16 символов?), начнет использоваться поле Еще раз: где описание реальной проблемы, которую вы пытаетесь решить? Что не работает?
Глюк какой, что ли… Не нужно строить фантастических теорий, когда вполне естественное и логичное объяснение лежит на поверхности.
0 |
Skel 0 / 0 / 0 Регистрация: 23.08.2020 Сообщений: 19 |
||||
27.03.2021, 06:29 [ТС] |
4 |
|||
Зачем вы туда полезли смотреть? У вас что-то не работало? Да, я потом использую эту переменную Name для проверки имени на соответствие. Пользователь вводит название песни, прога проверяет все альбомы на подходящие песни и возвращает первую найденную. В альбомах по 4 песни. Как работает цикл: пока имя песни не пустое значение, то проверяй ее на соответствие, иначе переходи к следующему альбому. В первом альбоме 4 песни он проверяет нормально, но как только доходит до следующей песни (которой по факту не существует, там должен мусор лежать), там лежит «ошибка чтения символов строки», и выдает исключение bad_alloc.
содержит мусор. Это нормально. Если бы просто мусор — то да, нормально. Но туда почему-то записывается именно ошибка. Код скину в след. посте, чтоб этот не нагромождать. Добавлено через 6 минут
0 |
Вездепух 10951 / 5937 / 1625 Регистрация: 18.10.2014 Сообщений: 14,905 |
|
27.03.2021, 06:39 |
5 |
Если бы просто мусор — то да, нормально. Но туда почему-то записывается именно ошибка. Вы делаете какие-то дикие и странные фантасмагорические выводы. С чего вы взяли, что туда «записывается именно ошибка»? Никакая «ошибка» туда не записывается. Поле
и выдает исключение bad_alloc. Никакого отношения к теме
0 |
0 / 0 / 0 Регистрация: 23.08.2020 Сообщений: 19 |
|
27.03.2021, 06:40 [ТС] |
6 |
Вы делаете какие-то дикие и странные фантасмагорические выводы Однако прога перестала работать ни с того ни с сего. Пошел в отладчик и нашел такое. Раньше этого не было. Ничего я у класса песни не менял. Так ведь заметь, что в других классах с именами все в порядке, с песнями почему-то такое приключилось
0 |
Вездепух 10951 / 5937 / 1625 Регистрация: 18.10.2014 Сообщений: 14,905 |
|
27.03.2021, 06:50 |
7 |
Сообщение было отмечено Skel как решение Решение
Пошел в отладчик и нашел такое. Раньше этого не было. Нет, вы выдумываете. Это было всегда. Это совершенно нормальное поведение
Однако прога перестала работать ни с того ни с сего. Еще раз: никакого отношения к теме Перестаньте заниматься фигней и разглядывать Добавлено через 6 минут
В первом альбоме 4 песни он проверяет нормально, но как только доходит до следующей песни (которой по факту не существует, там должен мусор лежать) Чего? Это что за белиберда? Какое еще «должен мусор лежать»? Ваш цикл поиска песни написан так, что последовательность песен в альбоме обязательно (!) должна заканчиваться песней с пустым именем. Не «мусором», а песней с пустым именем (!). Если в альбоме 4 песни, то размер массива песен должен равняться 5 и последняя «фиктивная» песня должна иметь пустое имя. Если вы не соблюдете это жесткое правило, программа будет падать.
1 |
0 / 0 / 0 Регистрация: 23.08.2020 Сообщений: 19 |
|
27.03.2021, 07:13 [ТС] |
8 |
Возьмите строку подлиннее Смотри, я в конструкторе изменил поле присвоения названия песни на 20-25 букв d, вместо «» (как ты и сказал, взять строку подлиннее). И заработало. Возвращаю обратно на пустое имя — ошибка. Как так-то? Неужели мне теперь по стандарту каждой песни какое-то имя из 15+ букв задавать? Некрасиво как-то.
Чего? Это что за белиберда? Цикл безотказно работает. При встрече с мусором он его считает за пустую строку и просто переходит к след. альбому.
Если в альбоме 4 песни, то размер массива песен должен равняться 5 и последняя «фиктивная» песня должна иметь пустое имя Зачем выделять место еще для одной лишней песни? Вот если б разговор про выделение памяти под символы, то да, выделять нужно на 1 больше заявленного размера для ».
0 |
Алексей1153 фрилансер 4807 / 4402 / 939 Регистрация: 11.10.2019 Сообщений: 11,630 |
||||
27.03.2021, 07:29 |
9 |
|||
Skel, Вот ещё вариант с STL, смотри, насколько всё проще )) Не нужно три дня штурмовать форум, десять минут — и всё готово
1 |
Вездепух 10951 / 5937 / 1625 Регистрация: 18.10.2014 Сообщений: 14,905 |
|
27.03.2021, 07:33 |
10 |
Цикл безотказно работает. При встрече с мусором он его считает за пустую строку и просто переходит к след. альбому. Ым… Што???? При встрече с «мусором» происходит неопределенное поведение и ваша программа падает во все воронье горло. А то, что вам раньше казалось, что она не падала — это вы ее просто плохо тестировали.
Зачем выделять место еще для одной лишней песни? Чтобы программа не падала. Вам нужно иметь возможность определить фактический размер массива, чтобы не вылетать за его пределы. А как вы это будете делать — ваше дело. Разумнее/экономнее было бы хранить размер массива, как это делает Главное — если вы будете рассчитывать на ваше наивное «при встрече с мусором он его считает за пустую строку», то ваша программа будет просто падать.
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;
}
};