|
RavilSHai 0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
||||
|
1 |
||||
Ошибка при чтении символов строки16.02.2014, 21:13. Показов 13773. Ответов 12 Метки нет (Все метки)
Связана ли данная ошибка с этим:
__________________
0 |
|
4013 / 2615 / 475 Регистрация: 28.04.2012 Сообщений: 8,414 |
|
|
16.02.2014, 21:26 |
2 |
|
Что за ошибка-то? Телепаты в отпуске.
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 21:49 [ТС] |
3 |
|
Что за ошибка-то? Телепаты в отпуске. Упс
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 21:50 [ТС] |
4 |
|
Вот скрин Миниатюры
0 |
|
Модератор
8756 / 6546 / 887 Регистрация: 14.02.2011 Сообщений: 22,962 |
|
|
16.02.2014, 22:00 |
5 |
|
(notebook+i)->resolutions=(char*)malloc(m); сколько места выделяешь?
strcpy((notebook+i)->resolutions,s); короче когда выскакивает такая штука жмешь продолжить Добавлено через 1 минуту
notebook=(format *)malloc(n*sizeof(format));
(notebook+i)->resolutions=(char*)malloc(m); почему не проверяешь, может тебе система памяти не дала?
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 22:31 [ТС] |
6 |
|
ValeryS
0 |
|
ValeryS Модератор
8756 / 6546 / 887 Регистрация: 14.02.2011 Сообщений: 22,962 |
||||
|
16.02.2014, 22:47 |
7 |
|||
|
А я не знаю как проверить? то что malloc возвращает сравнить с 0
0 |
|
RavilSHai 0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
||||
|
16.02.2014, 23:18 [ТС] |
8 |
|||
|
ругается что нельзя присваивать bool Добавлено через 3 минуты
0 |
|
ValeryS Модератор
8756 / 6546 / 887 Регистрация: 14.02.2011 Сообщений: 22,962 |
||||||||
|
16.02.2014, 23:32 |
9 |
|||||||
|
ругается что нельзя присваивать bool со скобками не перемудрил?
Добавлено через 4 минуты
может проблема в этом участке?! так на вскидку не вижу
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 23:40 [ТС] |
10 |
|
Так требует преподаватель, ну в смысле она показывала нам как должна быть прога написана
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 23:44 [ТС] |
11 |
|
Вот где он ругается Миниатюры
0 |
|
Модератор
8756 / 6546 / 887 Регистрация: 14.02.2011 Сообщений: 22,962 |
|
|
16.02.2014, 23:53 |
12 |
|
смотри что возвращает предыдущая строка
m=strlen(s);
0 |
|
0 / 0 / 4 Регистрация: 26.10.2012 Сообщений: 82 |
|
|
16.02.2014, 23:58 [ТС] |
13 |
|
готово Миниатюры
0 |
Пытаясь делать курсовую работу, застрял вот на таком моменте:
Вот скриншот консоли на каком месте остановилась программа:
Я делаю решение системы линейных уравнений и думаю, что ошибка кроется в 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;
}
Имеется проблема, связанная с gets(), о которой следует знать: используя gets(), можно перейти границы массива, с которым она вызывалась. Это возможно, поскольку не существует способа указать gets(), где находится граница массива.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct bd
{
char *model;
char *perfomace;
int price;
};
struct format
{ char *resolutions;
int freak;
int memory;
struct bd notefun;
};
void main (void)
{
struct format *notebook;
int i,n,m;
char s[909];
printf ("Input size notebooks: ");
scanf ("%d", &n);
notebook=(format *)malloc(n*sizeof(format));
for (i=0; i<n; i++)
{
printf ("nInput resolutions: ");
scanf ("%d", &m);
getchar ();
gets (s);
m=strlen(s);
(notebook+i)->resolutions=(char*)malloc(m);
strcpy((notebook+i)->resolutions,s);
printf ("nInput freak: ");
scanf ("%d", &(notebook+i)->freak);
printf ("nInput memory: ");
scanf ("%d", &(notebook+i)->memory);
printf ("nInput data notebook:");
printf ("n model:");
getchar();
gets (s);
m=strlen(s);
(notebook+i)->notefun.model=(char*)malloc(m+1);
strcpy((notebook+i)->notefun.model,s);
printf ("n perfomace:");
getchar();
gets (s);
m=strlen(s);
(notebook+i)->notefun.perfomace=(char*)malloc(m+1);
strcpy((notebook+i)->notefun.perfomace,s);
printf ("n price:");
scanf ("%d", &(notebook+i)->notefun.price);
}
for (i=0; i<n; i++)
{
printf ("%s %d %d %s %s %d", i+1, (notebook+i)->resolutions,(notebook+i)->freak, (notebook+i)->memory, (notebook+i)->notefun.model,
(notebook+i)->notefun.perfomace, (notebook+i)->notefun.price);
}
}
- описание проблемы
- Дополнение связанных точек знаний:
описание проблемы
При вызове функции вторичный указатель используется в качестве параметра функции и передается массив строковых указателей, но при доступе возникает ошибка времени выполнения, которая конкретно выражается как «ошибка 0xCCCCCCCC при чтении символов строки».
Первая реакция заключается в том, что строка забыла инициализировать, но как только проверка окажется неправильной, я инициализировал ее. Как может возникнуть такая проблема, а затем с помощью одноэтапной отладки было обнаружено, что массив указателей, на который указывает вторичный указатель, передающий значение, находится за пределами границ. Фрагмент кода выглядит следующим образом:
while ((string = *strings++) != NULL) {
while (*string != '') {
if (* string ++ == ‘a’) // Место ошибки, здесь string = 0xcccccccc, Ошибка при чтении строковых символов
...
}
}
VS считает, что элемент указателя строки за пределами границ неинициализирован, поэтому он выполнит инициализацию по умолчанию.*strings++ Когда цикл оценивается, содержимое элемента вне границ0xccccccccВместо тогоNULL , Таким образом, суждение недействительно, и осуществляется доступ к недоступной памяти.
Тогда при оценке граница массива должна быть ограничена количеством элементов массива, а неNULL ценность.
Дополнение связанных точек знаний:
0xcccccccc : Used by Microsoft’s C++ debugging runtime library to mark uninitialised stack memory
0xcdcdcdcd : Used by Microsoft’s C++ debugging runtime library to mark uninitialised heap memory
0xfeeefeee : Used by Microsoft’s HeapFree() to mark freed heap memory
Для 0xcccccccc и 0xcdcdcdcd в режиме отладки VC заполнит все указатели в неинициализированной памяти стека значением 0xcccccccc, когда строка выглядит как «hot, hot …». Все указатели в неинициализированной памяти кучи будут заполнены 0xcdcdcdcd, когда строка будет выглядеть как «tuntuntuntun …».
Так почему отладчик это делает? Версия VC для DEBUG автоматически инициализирует неинициализированный указатель на0xccccccccили0xcdcdcdcd, Вместо того, чтобы просто позволить использовать случайное значение, то есть для облегчения нашей отладки программы. Если начальное значение дикого указателя не определено, то каждый раз при отладке одной и той же программы могут появляться разные результаты. Например, эта программа вылетает в следующий раз. Но он может работать нормально, что, очевидно, очень неблагоприятно для нас, чтобы исправить ошибку, поэтому цель автоматической инициализации — дать нам возможность сразу подтвердить, что мы используем неинициализированный дикий указатель (на самом деле, я все еще думаю, что инициализацияNULLОтносительно доволен).
Для 0xfeeefeee он используется для отметки памяти, которая была освобождена в куче. Обратите внимание, что если память, на которую указывает указатель, освобождается, адрес самой переменной по-прежнему остается адресом ранее указанной памяти, если он не был изменен. Если указатель является указателем на класс, а класс содержит переменную-указатель, после освобождения памяти (для классов C ++ обычно выполняется операция удаления) переменной-указателю в классе будет присвоено значение 0xfeeefeee. Если вы обнаружите, что в процессе отладки кода есть указатель со значением 0xfeeefeee, это означает, что соответствующая память была освобождена и в нашем коде возникла проблема.
Это специфичный для VS механизм, и указатели могут быть инициализированы значением NULL в других компиляторах.
Эти ошибки выдаются при чтении имени файла из параметра.
«невозможно прочитать память» «ошибка чтения символов строки»
Если строка определена как введенный пользователем текст или как жесткая клавиша, то она работает нормально. Но, если часть имени файла читается из файла, соединяется и затем передается через параметр, эти ошибки выдаются.
Я пробовал как с, так и без .c_str()
После удаления некоторых пустых мест в текстовом файле, это теперь работает в Windows, но не в Linux?
void batch_helper()
{
//batch
vector <string> field_reports;
ifstream field_report_batch;
field_report_batch.open("OCR_batch.txt");
string line;
while (true) { //fill stack with batches
getline(field_report_batch, line);
if (line.empty() || !field_report_batch || field_report_batch.fail())
break;
field_reports.push_back(line);
}
field_report_batch.close();
for (unsigned int i = 0; i < field_reports.size(); i++) {
parse_file("timesheets_we" + field_reports[i] + "_batch_export.csv"); //this does not work
//parse_file("timesheets_we20121221_batch_export.csv"); //this works
}
}void parse_file(const string timecard_WE)
{
//count records
int timecard_count = 0;
string line;
//test input file
ifstream timecard_test;
timecard_test.open(timecard_WE.c_str());
getline(timecard_test, line); //burn header
while (true){
getline(timecard_test, line); //read in row_n
if (!timecard_test || timecard_test.fail())
break;
timecard_count++;
}
timecard_test.close();
line.clear();
}
Похожая проблема, опубликованная в stackoverflow: Вот, проблема заключалась в скрытом пустом месте или беспорядочном конце строки символа. Я проверил на наличие пробелов, но пока не нашел их.
Я попробую это:
while (true) {
if (line.back() == 'r' || line.back() == 'n') {
test_log << "pop: " << line.back() << "rn";
line.pop_back();
}
}
полученный файл
20120615
поп:
20120622
поп:
20120629
поп:
20120706
поп:
20120713
поп:
20120720
поп:
20120727
поп:
20120803
поп:
20120810
поп:
20120817
поп:
20120824
поп:
20120831
поп:
20120907
поп:
20120914
поп:
20120921
поп:
20120928
поп:
20121005
поп:
20121012
поп:
20121019
поп:
20121026
поп:
20121102
поп:
20121109
поп:
20121116
поп:
20121123
поп:
20121130
поп:
20121207
поп:
20121214
поп:
20121221
поп:
timesheets_we20120615_batch_export.csv BREAK
timesheets_we20120622_batch_export.csv BREAK
timesheets_we20120629_batch_export.csv BREAK
timesheets_we20120706_batch_export.csv BREAK
timesheets_we20120713_batch_export.csv BREAK
timesheets_we20120720_batch_export.csv BREAK
timesheets_we20120727_batch_export.csv BREAK
timesheets_we20120803_batch_export.csv BREAK
timesheets_we20120810_batch_export.csv BREAK
timesheets_we20120817_batch_export.csv BREAK
timesheets_we20120824_batch_export.csv BREAK
timesheets_we20120831_batch_export.csv BREAK
timesheets_we20120907_batch_export.csv BREAK
timesheets_we20120914_batch_export.csv BREAK
timesheets_we20120921_batch_export.csv BREAK
timesheets_we20120928_batch_export.csv BREAK
timesheets_we20121005_batch_export.csv BREAK
timesheets_we20121012_batch_export.csv BREAK
ПЕРЕРЫВЫ в файле журнала — это конец файловых разрывов.
0
Решение
Решение простое и состоит из двух частей:
ЧАСТЬ I
в текстовом файле, из которого я читаю частичные имена файлов и затем объединяю их в полное имя, после некоторого текста было пустое место. Я открыл файл, «выбрать все», а затем вручную удалил конечные пробелы.
ЧАСТЬ II:
это исправлено пока (верно)
{ if (line.back() == 'r' || line.back() == 'n') line.pop_back();}
комбинированное решение:
while (true) { if (line.back() == 'r' || line.back() == 'n' || line.back() == ' ') line.pop_back();}
0

