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

406
07 апреля 2017, 23:59

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

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

А делаю я решение системы линейных уравнений и думаю ошибка кроется в 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] = '\0';
                }
            }
        }
    }
    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;
}
Answer 1

Написана какая-то белиберда

unsigned short kolvostrok = 0;
...
float *masOtvet = new float[kolvostrok];

Это выделение памяти под массив размера 0.

После чего делается чтение данных в

cin >> kolvostrok;
...
for (unsigned short i = 0; i < kolvostrok; i++)
{
   cin >> masOtvet[i];
   ...

где kolvostrok уже не 0. Разумеется, все будет падать из-за попытки записывать что-то за пределы массива нулевого размера.

Зачем вы вообще пытаетесь выделять массив нулевого размера? Может надо было сначала прочитать конкретное значение переменной kolvostrok и только после этого выделять память для masOtvet?

Кстати, а вот это что за сюрреализм

delete [kolvoperem * 2*16] StrBufMas

? Майкрософтовский компилятор поддерживает этот синтаксис (игнорируя значение выражения), но вам-то оно зачем сдалось?

Answer 2

Если кому интересно проблема РЕШЕНА.
Нужно было z сделать строкой и вот так:

char *strt = new char[10];  
for( unsigned char z = 1; z < kolvostrok + 1; z++ )   
{
itoa(z, strt, 10);  
    cout << "Введите коэфициенты неизвестных уравнения "  
         << strt << " через ;" << endl;  
    cout << "(если в уравнении не полное кол-во переменных, то вместо них поставить нули): "<< endl;   
    cin >> StrBufMas;           
READ ALSO
Динамическое добавление html в dom с помощью JS

Динамическое добавление html в dom с помощью JS

Есть такой кодВ данном случае я вручную создаю каждую ячейку,заполняю ее и вставляю в ряд

243
Почему такой большой bundle.js?

Почему такой большой bundle.js?

изучаю reactjs на этом примере: https://metanitcom/web/react/5

212
выбор элемента из СКРИПТА js

выбор элемента из СКРИПТА js

Есть такой код который рисует график торговМне нужно выбрать с него Элементы текущих позиций валюты

306