LINUX.ORG.RU

лаба по C++


0

0

Я в недоумении.
Пишу лабораторную работу по ООП. Очень простая работа.
Считать линейный массив, по кое какому признаку свормировать из него двухмерный, и из двухмерного сформировать другой двухмерный, по еще одному признаку.
И 1/10 не написал - уже какие то странности:

main.cpp
//---------------------------------------------------------------------
	double *m;
	FILE *f;
	if ((f = fopen("input.txt", "r")) == NULL)
		return false;

	int n = 0;
	fscanf(f, "%i ", &n);	m = new double [n];
	printf("\nLength of  mass: %i\n", n);

	for (int i = 0; i < n; ++i){
		fscanf(f, "%e ", m[i]);
		printf("%e ", m[i]);
	}
	printf("\n");
	fclose(f);
//---------------------------------------------------------------------

input.txt
//---------------------------------------------------------------------
10 1.1 2.2 3.3 4.4 -5.5 -0.006 7.098 856 9.4 -10.2 
//---------------------------------------------------------------------

Вывод программы
//---------------------------------------------------------------------
bash-2.05b# ./a.out

Length of  mass: 10
Segmentation fault
bash-2.05b#


В файле input.txt первое число - кол-во элементов.

лаба по С или таки по С++ ? ;)

а зазбираться мне лениво...

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

слушай чего говорят: scanf изменяет существующее значение - нужен пойнтер, а не значение.

И ещё: в С нет массивов ;)

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

прежде чем лабы писать хорошо бы теорию почитать

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

Может, оно и работает. Я даже могу согласится с тем, что это С++. Только это не ООП никаким боком!

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

>m[5] = 5;

>Работает ведь.

чудо ты...

параметр ф-ии и тело - чувствуешь разницу?

и всё же С++ по другому выглядит ;)

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

>Работает. И с "l" и без нее. >А почему m[i] не катит? Этоже правильно?

Правильно при выводе т.к. в функциях с элипсом ,например printf(const char*,...), тип float неявно приводится к double, поэтому функции форматированного ВЫВОДА не реагируют на "l". А при ВВОДЕ это уже имеет значение, т.к. им нужно точно знать размер типа.

m[i] тоже катит, только так: fscanf(f,"le",&m[i]). В эти фунции необходимо передавать не значения переменной, а ее указатель.

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

Бывают такие недопрограммерские недопреподы, которые нифига в предмете не понимают...

А вообще для лаб дают(читают) теорию. И не стоит человека пинать!!! - пинаем преподов!!!!!!!!!!!

(по своему опыту знаю, потому как меня например на ООП учили как в Visual Age SmallTalk кликать на кнопки, дабы что-то получить!!! Хорошо что хоть понимание пришло до предмета и калекой я не стал)

Я поищу вопросы на экзамен по ООП (ужу полтора года прошло), если найду, выложу самые перлы, поржем :)

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

Классы мы проходили.
Просто я привык с функциям ввода/вывода C.

Ведь double *m - это указатель.
Всегда работало m[i]. Причем При выводе значения m[i] выдавал правильное значение, и при вводе m[i] правильно сохранялся.

Этого я никак не мог понять - значение или указатель ?

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

слухай сюда:

есть массив /это для тебя массив, а вообще в С нет массивов - есть указатель на элемент в памяти/ m[]

m - указатель на нулевой элемент

m+i - на и-тый элемент

m[i] - значение и-того елемента

"Всегда работало" - принцип конечно хороший, но лучше о нём в публичных местах молчать.

scanf - требует адрес переменной!!! перед примитивной переменной ты пишешь &, чтоб выяснить адрес той самой переменной. тут тоже нужен адрес - по этому m[i] не катит: ты пытаешься записать считанное сканфом значение по адресу, значением к-ого является значение m[i].

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

to Pi:

Да я это все знал, только m[i] мне казалось тоже что и m+i(тоже указатель), в универе даже так вроде говорили.

Что самое странное - работало всегда!

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

Уважаемый Тузик, ошибки работы с памятью не обязательно должны вызывать segfault, они могут проявиться в любом месте программы через любое время.

И не задавайте больше таких вопросов, а то "порвем как тузик грелку".

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

> Да я это все знал, только m[i] мне казалось тоже что и m+i(тоже
> указатель), в универе даже так вроде говорили.

Нет, m[i] - это то же, что и *(m+i). Т.е. включает в себя дереференсинг
указателя. Если тебе нужен именно адрес, то можно сделать &m[i]

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

> m[5] = 5;
> Работает ведь.
>
> Помоему всегда работало.

Правильно, потому что оператор присваивания требует в левой части
lvalue. А scanf - _указатель_. Так понятно?

Если нет, то немедленно закрой vim (или в чем ты там это пишешь), и
марш читать K&R "The C Programming Language".

int19h ★★★★
()

(C) С. Майерс

ifstream dataFile(file_name); istream_iterator<double> dataBegin( dataFile ), dataEnd; vector<data> data(dataBegin, dataEnd);

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

а ты проверь вначале. потом сходи в источник и посмотри почему так низя :)

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