Пытаясь делать курсач застрял вот на таком моменте:
Вот скрин кансоли на каком месте остановилась прога:
А делаю я решение системы линейных уравнений и думаю ошибка кроется в 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;
}
Написана какая-то белиберда
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
? Майкрософтовский компилятор поддерживает этот синтаксис (игнорируя значение выражения), но вам-то оно зачем сдалось?
Если кому интересно проблема РЕШЕНА.
Нужно было 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;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть такой кодВ данном случае я вручную создаю каждую ячейку,заполняю ее и вставляю в ряд
Есть такой код который рисует график торговМне нужно выбрать с него Элементы текущих позиций валюты