нужна помощь с++
for (int i=0; i<=1; i++)
{
printf("i = %d\n", i);
for (int j=0; j < a; j++)
{
if (feof (fp) != 0)
{
printf ("Fehler beim auslesen von x oder y");
return 0;
}
if (i==0)
fscanf_s(fp, "%lf", &auswertungspunktex[j]);
else
fscanf_s (fp, "%lf", &auswertungspunktey [j]);
}
}
постарайтесь разобраться и понять, в чем была ошибка.
Сам метод должет считать первую строку и запомнить число 5 как int a. Потом считываю вторую строку и запоминаю ее как вектор auswertungspunktex длины 5 и третью соответственно как auswertungspunktey длины 5. И распечатать.
Что-то отправил почтой, что-то напишу здесь. Другие участники наверняка присоединятся...
Для начала тебе необходимо усвоить 3 вещи, а потом можно двигаться дальше:
1) научится отличать ошибки компиляции, линковки и времени выполнения. Это важно для C/C++.
2) забудь всё, что ты знаешь о выделении памяти напрямую(new, delete). Для тебя пока есть только STL контейнеры. Не знаешь какой брать, бери std::vector.
3) если можно писать на C++, то давай будем его использовать.
Теперь дальше. Входной файлик имеет у тебя следующий формат:
Anzahl 5
0.0 4.0 15.0 34.0 69.0
3.5 0.0 1.5 5.6 2.8
Который ты пытаешься запихнуть в массив double.
Воспользуемся пунктом 2, а именно оставим динамический массив на будущее и возьмём std::vector<double>. Читать будем используя стандартную библиотеку C++.
Для начала подключим необходимые библиотеки:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
теперь реализуем функцию печати:
void PrintVector (const std::vector<double> &vec)
{
size_t size = vec.size();
for (size_t j = 0; j < size; ++j)
{
std::cout << vec[j];
if(j != size - 1)
std::cout << ",";
}
std::cout << std::endl;
}
Теперь функцию чтения из файла:
bool ReadVector(const std::string &fileName, std::vector<double> &vec)
{
std::ifstream inputStream(fileName);
if(!inputStream)
{
std::cerr << "Could not read input file:" << fileName;
return false;
}
std::string line;
std::getline(inputStream, line);
int pointsCount;
sscanf_s(line.c_str(), "Anzahl %d", &pointsCount);
double val;
vec.reserve(pointsCount);
while(inputStream >> val)
{
vec.push_back(val);
}
if(vec.size() != pointsCount)
{
std::cerr << "Error in input file." << std::endl;
return false;
}
}
Функция принимает имя файла, открывает его, читает количество элементов и помещает их в выходной массив.
Теперь давай соберём всё вместе:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
void PrintVector (const std::vector<double> &vec)
{
size_t size = vec.size();
for (size_t j = 0; j < size; ++j)
{
std::cout << vec[j];
if(j != size - 1)
std::cout << ",";
}
std::cout << std::endl;
}
bool ReadVector(const std::string &fileName, std::vector<double> &vec)
{
std::ifstream inputStream(fileName);
if(!inputStream)
{
std::cerr << "Could not read input file:" << fileName;
return false;
}
std::string line;
std::getline(inputStream, line);
int pointsCount;
sscanf_s(line.c_str(), "Anzahl %d", &pointsCount);
double val;
std::vector<double> buff;
vec.reserve(pointsCount);
while(inputStream >> val)
{
vec.push_back(val);
}
if(vec.size() != pointsCount * 2)
{
std::cerr << "Error in input file." << std::endl;
return false;
}
}
int main()
{
std::string fileName;
std::cout << "Input file name:";
std::cin >> fileName;
std::vector<double> vec;
ReadVector(fileName, vec);
PrintVector(vec);
return 0;
}
Теперь давай немного рассудим, а нужно ли нам читать количество элементов из файла? Я думаю стоит проверить количество считанных элементов на чётность:
bool ReadVector(const std::string &fileName, std::vector<double> &vec)
{
std::ifstream inputStream(fileName);
if(!inputStream)
{
std::cerr << "Could not read input file:" << fileName;
return false;
}
//просто игнорируем первую строчку.
std::string line;
std::getline(inputStream, line);
double val;
while(inputStream >> val)
{
vec.push_back(val);
}
if(vec.size() % 2 != 0)
{
std::cerr << "Error in input file." << std::endl;
return false;
}
}
Теперь, коль уж мы в мире C++, давай изменим и стиль обрарботки ошибок. Коды возврата - прошлый век. Итак:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
void PrintVector (const std::vector<double> &vec)
{
size_t size = vec.size();
for (size_t j = 0; j < size; ++j)
{
std::cout << vec[j];
if(i != size - 1)
std::cout << ",";
}
std::cout << std::endl;
}
void ReadVector(const std::string &fileName, std::vector<double> &vec)
{
std::ifstream inputStream(fileName);
if(!inputStream)
throw std::logic_error("Could not read input file.");
//просто игнорируем первую строчку.
//если изменишь формат файла входного, можно выкинуть
std::string line;
std::getline(inputStream, line);
double val;
while(inputStream >> val)
{
vec.push_back(val);
}
if(vec.size() % 2 != 0)
throw std::logic_error("Error in input file.");
}
int main()
{
try
{
std::string fileName;
std::cout << "Input file name:";
std::cin >> fileName;
std::vector<double> vec;
ReadVector(fileName, vec);
PrintVector(vec);
}
catch(const std::exception &e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
Вроде бы всё хорошо - значения читаются, но как-то всё равно что-то не то. Сама идея хранить массив точек на плоскости(пар x и я)в линейном массиве - не очень. Добавим класс, для хранения точки на плоскости:
class Point
{
public:
Point(double x, double y)
: x(x), y(y)
{
}
double getX() const { return x;}
double getY() const { return y;}
private:
double x;
double y;
};
и изменим нашу программу следующим образом:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
class Point
{
public:
Point(double x, double y)
: x(x), y(y)
{
}
double getX() const { return x;}
double getY() const { return y;}
private:
double x;
double y;
};
void PrintVector (const std::vector<Point> &vec)
{
size_t size = vec.size();
for (size_t j = 0; j < size; ++j)
{
std::cout << "Point{x="<<vec[j].getX() << ", y=" << vec[j].getY() << "}";
if(j != size - 1)
std::cout << ",";
}
std::cout << std::endl;
}
void ReadVector(const std::string &fileName, std::vector<Point> &vec)
{
std::ifstream inputStream(fileName);
if(!inputStream)
throw std::logic_error("Could not read input file.");
//просто игнорируем первую строчку.
//если изменишь формат файла входного, можно выкинуть
std::string line;
std::getline(inputStream, line);
//считаем значения в массив
double val;
std::vector<double> buff;
while(inputStream >> val)
{
buff.push_back(val);
}
if(buff.size() % 2 != 0)
throw std::logic_error("Error in input file.");
//преобразуем в массив точек
size_t sz = buff.size() / 2;
vec.clear();
vec.reserve(sz);
for(size_t j = 0; j < sz; ++j)
{
vec.push_back(Point(buff[j], buff[sz + j]));
}
}
int main()
{
try
{
std::string fileName;
std::cout << "Input file name:";
std::cin >> fileName;
std::vector<Point> vec;
ReadVector(fileName, vec);
PrintVector(vec);
}
catch(const std::exception &e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
получаем следующий вывод:
Input file name:TextFile1.txt
Point{x=0, y=3.5},Point{x=4, y=0},Point{x=15, y=1.5},Point{x=34, y=5.6},Point{x=69, y=2.8}
Press any key to continue . . .
Что ещё можно добавить: формат входного файла, на мой взгляд, - не оптимален. Мы читаем по сути список точек(x, y), а в файле расположены два вектора : иксов и игриков. Было бы логичней транспонировать это хозяйство следующим образом:
0.0 3.5
4.0 0.0
15.0 1.5
34.0 5.6
69.0 2.8
Тогда и функция чтения примет совсем другой вид.
зы на сайте корявый форматтер. нельзя использовать в качестве индексной переменной i в блоке pre :))
Я бы сделал печать и считывание через алгоритмы и итераторы, если уж на то пошло. Но для нее и это будет уже слишком сложным, как мне кажется.
Фигасе простыня :О Жениться бы тебе, барин (с) :)))
Тёщу имею ))) В смысле "habe" :)) Да там на самом то деле всего пара-тройка слов текста, остальное то код один..)
-----
Которого ТС не поимет. Все, что ей надо, это разьяснения по поводу формата... в ее коде(!)... для считывания.
Ну и простейшие вещи - что метод не может содержать определение другого метода... с указанием разници между декларацией, имплементацией и вызовом...

Которого ТС не поимет.
80% спагетти она приготовила сам. поэтому и с этим элементарно разберётся.
Все, что ей надо, это разьяснения по поводу формата... в ее коде(!)... для считывания.
всё, что ей надо, на данном этапе - полный отказ от ручного мэмори менэджмента, посредством использования стандартных контейнеров и использование врапперов для системных дискрипторов(z.B. fstream)
Ну и простейшие вещи - что метод не может содержать определение другого метода... с указанием разници между декларацией, имплементацией и вызовом...
думаю она просто не правильно "нарезала" код. В её коде, который я получил, с этим был порядок.
Это понятно, но мне вот пришлось доводить его до ума :(

auswertungspunktex =new double [a];
auswertungspunktey =new double [a];
double temp;
for (int i=0; i<=1; i++)
{
for (int j=0; j < a; j++)
{
if (i==0){
if (fscanf_s(fp, "%lg", &temp)!=1)
throw "Fehler";
auswertungspunktex[j]=temp;
}
else {
if(fscanf_s (fp, "%lg", &temp)!=1)
throw "Fehler";
auswertungspunktey[j]=temp;
}
}
}
printf_s ("Ihre interol.......")..........
что метод не может содержать определение другого метода...
Это как? я только знаю, что в методе можно вызывать другой метод. А определять это значит имплементировать или что?
линковки и времени выполнения.
это как по немецки? Время выполнения это же Laufzeit, а у него могут быть ошибки...?

У меня создан совсем другой класс :Interpolation, он же Int_2d. Там объект - это "нечто", состоящее из векторов x,y,z и двух длинн i,j. Твой класс Point печатает и считывает векторы. Мне его тогда как использовать в моем классе ? Как подкласс? Или я вообще не в ту степь? Я сначала начала класс векторов писать, бетроер сказал нет, надо класс интерполяция.
1) Типичная ситуация в твоём коде Nr. 1
int lesenAuswertungspunkte (double *auswertungspunktex, double*auswertungspunktey)
{
//..
auswertungspunktex= new double [a];
auswertungspunktey= new double [a];
//..
}
int main(int argc, char* argv[])
{
double *Interpolationswertex =NULL;
double *Interpolationspunktey=NULL;
int laenge = lesenAuswertungspunkte (Interpolationspunktex, Interpolationspunktey);
...
}
Ты думаешь, что после вызова функции lesenAuswertungspunkte у тебя в Interpolationswertex и Interpolationspunktey указатели на память выделенную в lesenAuswertungspunkte . А вот и нет, у тебя там мусор, а вернее указатели не неинициализированную память и:
1) утечка памяти размером: 2 * sizeof(double) * a
2) undefined behavior при работе с Interpolationswertex и Interpolationspunktey после вызова lesenAuswertungspunkte. Частный случай undefined behavior - вылет программы.
Почему так происходит: читать о работе с паматью, о работе с указателями.
Как можно решить:
int lesenAuswertungspunkte (double **auswertungspunktex, double**auswertungspunktey)
{
//..
*auswertungspunktex= new double [a];
*auswertungspunktey= new double [a];
//..
}
int main(int argc, char* argv[])
{
double *Interpolationswertex =NULL;
double *Interpolationspunktey=NULL;
int laenge = lesenAuswertungspunkte (&Interpolationspunktex, &Interpolationspunktey);
...
}
2) Следующая типичная ситуация в твоём коде:
double* foo()
{
double tmp[100];
//...
return tmp;
}
Ты возвращаешь адресс на память в стэке, которая освободится после вызова функции. Как результат, тот же UB ввиде БаБаХа, при работе с результатом вызова этой функции.
Вариантов решения несколько: возвращать указатель на память в хипе(выделенную new), но тогда кто-то должен её освободить или писать в память заранее выделенную
3) Дальше
double *array =new double[100];
sizeof(array) не равен 100, а равен размеру указателя на double.
Это то, что сразу бросается в глаза. Не поленись, и потрать день на теорию по работе с указателями/памятью.
Тогда исправляй ошибки
Вот это мне и надо! Так я учусь )) на ошибках )) С ошибкой номер один сегодня пол дня билась..(( Напишу в личку
Спасибо !
