[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Написано же, используй константу.
    Code:
    const int nMaxThreads = 1000;
    int nThreads = StrToInt(Edit1->Text); 
    Thread *thr[nMaxThreads];
    for(int i=0;i<nThreads;i++){
    thr[i] = new Thread(false);
    }
    
     
  2. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Всем привет. Проблема в следующем.
    Code:
    #include <iostream>
    #include <cmath>
    #include <fstream>
    using namespace std;
    
    
    void Diagonal(double **A, int NumberOfEquation) {
    	double *temp_massiv;
    	int i, j;
    	double max, replace;
    
    	temp_massiv = new double[NumberOfEquation];
    	for(i = 0;i < NumberOfEquation;i++){
    		max = A[i][0];									
    		for(j = 0;j < NumberOfEquation;j++){
    			if(A[i][i] != 0) continue;					
    			else{
    				if(A[i][j] >= max) max = A[i][j];		
    				temp_massiv[i] = max;					
    			}
    		}
    	}
    	for(i = 0;i < NumberOfEquation;i++){				
    		for(j = 0;j < NumberOfEquation;j++){			
    			if(A[i][j] == temp_massiv[i]){
    				replace = A[i][i];
    				A[i][i] = A[i][j];
    				A[i][j] = replace;
    			}
    		}
    	}
    	delete []temp_massiv;
    }
    
    
    int SimpleIteration(double **A, double *B, int NumberOfEquation, double *solution, double fault_input) {
    	int i, j, step = 1;
    	double *TempSolution;
    
    	TempSolution = new double[NumberOfEquation];
    	double fault = fault_input + 1;
    	
    	for(i = 0;i < NumberOfEquation;i++) {
    		for(j = 0;j < NumberOfEquation;j++) {
    			if(i != j) {
    				A[i][j] = -A[i][j] / A[i][i];
    			}
    		}
    		B[i] = B[i] / A[i][i];
    		A[i][i] = 0;
    	}
    	
    	for(i = 0;i < NumberOfEquation;i++) {
    		solution[i] = B[i];
    	}
    	
    	
    	while(fault > fault_input && step <= 1000) {
    		for(j = 0;j < NumberOfEquation;j++) {
    			TempSolution[j] = 0;
    		}
    		for(i = 0;i < NumberOfEquation;i++) {
    			for(j = 0;j < NumberOfEquation;j++) {
    				TempSolution[i] = TempSolution[i] + A[i][j]*solution[j];
    			}
    			TempSolution[i] = TempSolution[i] + B[i];
    		}
    		fault = 0.0;
    		for(j = 0;j < NumberOfEquation;j++) {
    			fault = fault + (solution[j] - TempSolution[j])*(solution[j] - TempSolution[j]);
    		}
    		fault = sqrt(fault);
    		for(j = 0;j < NumberOfEquation;j++) {
    			solution[j] = TempSolution[j];
    		}
    		step++;
    	}
    	delete []TempSolution;
    	return step;
    }
    
    void file_input_output(){
    	int i, j, row = 0, column = 0;
    	double **A, *B, *solution, **temp_matrix, fault_input;
    	char k[128];
    	//вычисляем размерность введенной расширенной матрицы системы
    	ifstream in("input_data.txt");
    	while(true) {
    		in.read(k, 1);
    		if(k[0] == ' ') column++;
    		if(k[0] == '\n'){
    			row++;
    			column++;
    		}
    		if(in.eof()){
    			row++;
    			column++;
    			break;
    		}
    	}
    	column = column/row;
    	in.close();
    	//выделяем память под матрицу коэффициентов при неизвестных
    	A = new double*[row];
    	for(i = 0;i < row;i++){
    		A[i] = new double[row];
    	}
    	//выделяем память под вектор свободных членов
    	B = new double[row];
    	//выделяем память под вспомогательную матрицу
    	temp_matrix = new double*[row];
    	for(i = 0;i < column;i++){
    		temp_matrix[i] = new double[row];
    	}
    	//выделяем память под вектор неизвестных
    	solution = new double[row];
    	//считываем матрицу во временный массив
    	ifstream fin("input_data.txt");
    	for(i = 0;i < row;i++){
    		for(j = 0;j < column;j++){
    			fin >> temp_matrix[i][j];
    		}
    	}
    	fin.close();
    	//из временного массива выбираем нужные элементы
    
    	//для матрицы коэффициентов при неизвестных
    	for(i = 0;i < row;i++){
    		for(j = 0;j < column - 1;j++){
    			A[i][j] = temp_matrix[i][j];
    		}
    	}
    	//для вектора свободных членов
    	for(i = 0;i < row;i++){
    		for(j = column - 1;j > column - 2;j--){
    			B[i] = temp_matrix[i][j];
    		}
    	}
    	Diagonal(A, row);
    	cout << "Введите точность вычислений: ";							
    		cin >> fault_input;
    	int steps = SimpleIteration(A, B, row, solution, fault_input);
    	if(steps > 1000) {
    		cout << "Ошибка!!! Возможные причины:\n";
    		cout << "1)Слишком большое количество итераций.\n";
    		cout << "2)Какие-либо строки(столбцы) линейно зависимы.\n";
    	}
    	else {
    		ofstream out("solution.txt");									
    		out << "Решение СЛАУ:\n";
    		for(j = 0;j < row;j++) {
    			out << solution[j] << "\n";
    		}
    		out << "Количество итераций: " << steps;
    		cout << "Результат вычислений записан в файл 'solution.txt'.\n";
    		out.close();
    		system("solution.txt");
    	}
    	//очищаем выделенную память, здесь все нормально
    	for(i = 0;i < row;i++) {
    	    delete []A[i];
    	}
    	delete []A;
    	delete []B;
    	delete []solution;
    	//а вот на этом месте,при очистки памяти выделенной под временный
    	//массив, прога при работе выдает ошибку(компилится все норм)
    	for(i = 0;i < column;i++){
    		delete []temp_matrix[i];
    	}
    	delete []temp_matrix;
    }
    
    int main() {
    	cout << "Данная программа предназначена для решения СЛАУ методом простых итераций.\n";
        file_input_output();
    	system("pause");
    	return 0;
    }
    
    Вот сама ошибка, среда VS2010.
    Code:
    Debug Assertion Failed!
    ...
    Expression:_CrtIsValidHeapPointer(pUserData)
    ...
    Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.
     
  3. Linkus

    Linkus Member

    Joined:
    20 Dec 2008
    Messages:
    168
    Likes Received:
    15
    Reputations:
    -1
    приведи пример входного файла
     
  4. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Code:
    10 1 1 12
    2 10 1 13
    2 2 10 14
    Все элементы записаны через пробел, лишних нет(пробелов).Количество сторок и столбцов в функции file_input_output() вычисляется верно, проверял.И, кстати, когда открывается файл "solution.txt" решение в нем верное записано.
    P.S. какими функциями можно проверить состояние памяти, как например MemAvail и MaxAvail в паскале?
     
    #5304 qwert135, 28 May 2010
    Last edited: 28 May 2010
  5. Linkus

    Linkus Member

    Joined:
    20 Dec 2008
    Messages:
    168
    Likes Received:
    15
    Reputations:
    -1
    а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS
     
  6. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Вот таже хрень, точность можно любую, к тому примеру, который я написал, достаточно 0.0001 , и прога выдаст точное решение (1 1 1).Можно конечно убрать
    Code:
    for(i = 0;i < column;i++){
    		delete []temp_matrix[i];
    	}
    	delete []temp_matrix;
    и все будет норм работать, но хотелось разобраться, да и память замусоривать нехорошо))
    Вот блин, ща попробовал в CodeBlocks скомпилить и запустить, и о чудо, там все норм.
     
    #5306 qwert135, 28 May 2010
    Last edited: 28 May 2010
  7. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3

    это бред если column!=row
     
    #5307 Irdis, 28 May 2010
    Last edited: 28 May 2010
  8. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Пробовал, тоже самое.Кстати,еще вот это сообщение VS выводит
    Code:
    Windows has triggered a breakpoint in SLAU.exe.
    
    This may be due to a corruption of the heap, which indicates a bug in SLAU.exe or any of the DLLs it has loaded.
    
    This may also be due to the user pressing F12 while SLAU.exe has focus.
    
    The output window may have more diagnostic information.
     
  9. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Сори, не туда посмотрел, ту ты прав. Все равно таж ошибка.
     
    #5309 qwert135, 28 May 2010
    Last edited: 28 May 2010
  10. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    разберитесь где у вас column а где row...
    я пытался понять, но сложилось такое впечатление, что они перепутаны в каждой второй строке.
    вот кстати как делаются матрицы:
     
  11. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Все, разобрался.Спасибо всем за помощь. У меня получалась матрица(в примере) 3х4, а я выделял память для 4х3))).Тогда следующий вопрос-почему CodeBlocks эт пропустил?))
     
  12. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Особенно большое СПАСИБО
    P.S. какими функциями можно проверить состояние памяти, как например MemAvail и MaxAvail в паскале?
     
    #5312 qwert135, 28 May 2010
    Last edited: 28 May 2010
  13. Besi

    Besi Member

    Joined:
    3 Nov 2009
    Messages:
    0
    Likes Received:
    8
    Reputations:
    5
    посоветуйте книгу(с++) потоки и сети можно 2 разные книги)
    буду благодарен
     
  14. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Как лучше организовать потоки в бруте: 1 поток = 1 пароль, 1 поток = 10 паролей или др?

    И можно ли передать потоку 2 параметра (структуры использовать не хочется)?

    PS: брут серверов
     
    #5314 WNZRS, 28 May 2010
    Last edited: 28 May 2010
  15. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    ну уж точно не 1 поток на 1 пароль. так у тебя поток может создаваться дольше чем идёт проверка одного пасса. всё зависит от скорости. делай значение переменным и пробуй изменять. смотри как прога реагирует. лично я бы так делал.
     
    1 person likes this.
  16. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Можно, если использовать TThread из VCL или написать свой класс для работы с потоками.
     
  17. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Code:
    procedure klickkor(korX:integer;korY:integer);  // p - пауза в секукндах var Pt: TPoint; begin Pt.x := korX; Pt.y := korY;   {Преобразуем Pt к координатам экрана}   Pt := ClientToScreen(Pt);   {Преобразуем Pt к "mickeys" (аболютным координатам курсора мышки}   Pt.x := Round(Pt.x * (65535 / Screen.Width));   Pt.y := Round(Pt.y * (65535 / Screen.Height));   {Переместим курсор мыши}   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);   {Имитируем нажатие левой кнопки мыши}   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);   {Имитируем отпускание левой кнопки мыши}   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0); end;
    однако вылазит ошибка
    Code:
    Unit1.pas(225): Incompatible types: 'HWND' and 'TPoint
    Что я не так делаю?
     
    #5317 STLcRash, 29 May 2010
    Last edited: 29 May 2010
  18. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    название топика читаешь криво
     
  19. qwert135

    qwert135 New Member

    Joined:
    22 Nov 2009
    Messages:
    53
    Likes Received:
    0
    Reputations:
    0
    Народ, переведите плиз следующий код из С++ на С, а именно потоковый вывод через printf(), заранее спасибо.
    Code:
    //N101
    #include <iostream.h>
    #include <conio.h>
    
    int main()
    { int i,j,k1,k2,n;
    	n=10000000 ;//до какого числа считать
    	cout << "Numbers(less then 1000000), the sum of numbers of which is divided on 7.\n\n";
    	for (i=2;i<n;i++){
    		j=i+1;
    		k2=0;
    		while (j>0){
    			k2+= j%10;
    			j/=10;
    		}
    		if (k1%7==0 && k2%7==0){
    			cout << "Number is: ";
    			cout << i << "\n";
    		}
    		k1=k2;
    	}
    	cout << "\n";
    	getch();
    	return 0;
    }
     
  20. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Code:
    //N101
    #include <stdio.h>
    
    int main()
    	{
    	int i, j, k1, k2, n;
    	n = 10000000 ;
    	printf( "Numbers(less then 1000000), the sum of numbers of which is divided on 7.\n\n" );
    
    	for ( i = 2; i < n; i++ )
    		{
    		j = i + 1;
    		k2 = 0;
    
    		while( j > 0 )
    			{
    			k2 += j % 10;
    			j /= 10;
    			}
    
    		if ( k1 % 7 == 0 && k2 % 7 == 0)
    			{
    			printf( "%s: %d \n", "Number is", i );
    			}
    
    		k1 = k2;
    		}
    	printf( "\n" );
    	getch();
    	return 0;
    	}
    
    Но сразу скажу, что твой код не корректен.
     
Thread Status:
Not open for further replies.