LINUX.ORG.RU

Опять лаба по C


0

0

Не могу понять что я не так делаю. Из файла надо прочитать линейный массив и обработать его.
Читаю в функции readM, обрабатываю в matrix1. В ф-и main объявляю указатель на double и передаю его во все ф-и.
Печать в ф-и readM выдает правильные числа. В ф-и matrix или main бред получается:

#include <stdio.h>

//---------------------------------------------------------------------
bool readM(double *m, int *n){
	FILE *f;
	if ((f = fopen("input.txt", "r")) == NULL)
		return false;

	fscanf(f, "%i ", n);	m = new double [*n];	//Первое число - количество элементов
	printf("\nLength of  mass: %i\n", *n);

	for (int i = 0; i < *n; ++i){
		fscanf(f, "%lf ", m+i);					//Забиваю в линейный массив
		printf("%6.2f ", m[i]);
	}
	printf("\n");
	fclose(f);
}
//---------------------------------------------------------------------
bool matrix1(double *m, double **m1, int n, int *n2){
	printf("\n\nPlease, input size of mass (height width): ");
	scanf("%i %i", n2, n2+1);	// 0-h, 1-w
	int h = n2[0], w = n2[1];

	printf("First matrix:\n");
	for (int i = 0; i < n; ++i)
		printf("m[%i] = %6.2f; ", i, m[i]);			//Печатаю линейный массив, и уже лезет бред
	printf("\nSecond matrix %ix%i:\n", h, w);

	double buf;							//Здесь начинается обработка массива. Можете пропустить
	bool was = false;
	m1 = new double * [h];

	for (int i = 0; i < h; ++i)
		m1[i] = new double [w];

	for (int i = 0, k=0; i < h; ++i)
		for (int j = 0; j < w; ++j, ++k){
			//if (k < n){
			//	m1[i][j] = m[k]; printf ("\n %f", *(m+k)); }
				m1[i][j] = m[i];
				printf("m[%i] = %d; ", i, m[i]);
/*			else
				if (was){
					m1[i][j] = buf;
					buf+=1;
				}
				else{
					was = true;
					buf = m[k];
				}*/
		}
	
	for (int i = 0; i < h; ++i){
		for (int j = 0; j < w; ++j)
			printf("(%f) ", m1[i][j]);
		printf("\n");
	}
	printf("\n OK! \n");
}
//---------------------------------------------------------------------
bool matrix2(double **m1, double **m2){

}
//---------------------------------------------------------------------

int main(){

	double *m, **m1, **m2;
	int n, *n2 = new int [2];

	if (!readM(m, &n)){
		printf("\nFile \"input.txt\" not open!\n");
		return -1;
	}
	printf("\nMatrix again:\n");
	for (int i = 0; i < n; ++i)
		printf("%6.2f ", m[i]);					//Тоже бред
	

	matrix1(m, m1, n, n2);

	return 0;
}

anonymous

> if (!readM(m, &n)){

потому что нужно &m передавать -- у тебя m инициализируется в readM.

dilmah ★★★★★
()

bool readM(double *m, int *n){
Уже в первой строке две ошибки.
readM формально не возвращает никакого значения в том случае,
когда чтение прошло успешно:
fclose(f);
}

m не является возвращаемым параметром, т.е. m = new double [*n];
просто создает утечку памяти.

Нужно передавать указатель на возвращаеме значение, например:
bool readM(double **mm, int *n){
double *m;
..... m = new double [*n];
mm[0] = m;
...

readM(&m, &n)){ < - указатель на m, а не значение m!!!

Вот с n все сделано прилично.

io ★★
()
Ответ на: комментарий от io

Сорри, не понял %-P
Ведь bool readM(double *m, ... m - указатель. Я ему присваиваю адресс. Так как передал я указатель, то значение должно сохраниться.

Я всегда так делал. Нужно обработать данные - передаю указатель.

anonymous
()
Ответ на: комментарий от anonymous

Я понял! Спасибо вам!
Передавая double *m в функции использовалась копия! И при инициализации мы присвоили адресс массива этой копии.

Я просто добавил * перед m и все заработало.
В очередной раз ЛОР открыл мне глаза!

Thanks!

anonymous
()
Ответ на: комментарий от anonymous

> В очередной раз ЛОР открыл мне глаза!

а также ухо, горло, нос..

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.