русский
Germany.ruForen → Архив Досок→ Programmierung

нужна помощь с++

696  1 2 3 alle
Sweti lipmos местный житель10.12.12 23:12
Sweti lipmos
NEW 10.12.12 23:12 
in Antwort Nickrus 10.12.12 10:21, Zuletzt geändert 10.12.12 23:27 (Sweti lipmos)
номера не стоят, а по окну с этим сообщением не щелкнуть, только : Abbrechen, Ignоrieren oder Wiederholen. После Ignоrieren: Schwereк Fehler gefunden in Projektsname.exe
Слава богу, я атеист..
#21 
Simple Nothing is f*cked11.12.12 08:02
Simple
NEW 11.12.12 08:02 
in Antwort Sweti lipmos 10.12.12 23:12
Это assertion, судя по всему. Щас проверю, на работе у меня есть компилятор :)
#22 
Simple Nothing is f*cked11.12.12 08:18
Simple
NEW 11.12.12 08:18 
in Antwort Sweti lipmos 10.12.12 23:12
Ваша программа не компилируется (это было понятно) и не работает. Постарайтесь в следующий раз запостить рабочий код.
#23 
Simple Nothing is f*cked11.12.12 08:41
Simple
NEW 11.12.12 08:41 
in Antwort Sweti lipmos 10.12.12 22:18
Вот кусок, который не работал:
		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]);
}
}

постарайтесь разобраться и понять, в чем была ошибка.

#24 
  Posmotrim посетитель11.12.12 08:42
Posmotrim
NEW 11.12.12 08:42 
in Antwort Sweti lipmos 10.12.12 21:24, Zuletzt geändert 11.12.12 09:45 (Posmotrim)
В ответ на:
Сам метод должет считать первую строку и запомнить число 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 :))

#25 
Simple Nothing is f*cked11.12.12 12:06
Simple
NEW 11.12.12 12:06 
in Antwort Posmotrim 11.12.12 08:42
Фигасе простыня :О Жениться бы тебе, барин (с) :)))
Я бы сделал печать и считывание через алгоритмы и итераторы, если уж на то пошло. Но для нее и это будет уже слишком сложным, как мне кажется.
#26 
  Posmotrim посетитель11.12.12 13:17
Posmotrim
NEW 11.12.12 13:17 
in Antwort Simple 11.12.12 12:06
В ответ на:
Фигасе простыня :О Жениться бы тебе, барин (с) :)))

Тёщу имею ))) В смысле "habe" :)) Да там на самом то деле всего пара-тройка слов текста, остальное то код один..)
#27 
Simple Nothing is f*cked11.12.12 13:26
Simple
NEW 11.12.12 13:26 
in Antwort Posmotrim 11.12.12 13:17
Там программирование, по-моему, чисто побочная штука.
#28 
Murr патриот11.12.12 13:36
Murr
NEW 11.12.12 13:36 
in Antwort Posmotrim 11.12.12 13:17
остальное то код один..)
-----
Которого ТС не поимет. Все, что ей надо, это разьяснения по поводу формата... в ее коде(!)... для считывания.
Ну и простейшие вещи - что метод не может содержать определение другого метода... с указанием разници между декларацией, имплементацией и вызовом...
#29 
  Posmotrim посетитель11.12.12 13:48
Posmotrim
11.12.12 13:48 
in Antwort Murr 11.12.12 13:36, Zuletzt geändert 11.12.12 13:49 (Posmotrim)
В ответ на:
Которого ТС не поимет.

80% спагетти она приготовила сам. поэтому и с этим элементарно разберётся.
В ответ на:
Все, что ей надо, это разьяснения по поводу формата... в ее коде(!)... для считывания.

всё, что ей надо, на данном этапе - полный отказ от ручного мэмори менэджмента, посредством использования стандартных контейнеров и использование врапперов для системных дискрипторов(z.B. fstream)
В ответ на:

Ну и простейшие вещи - что метод не может содержать определение другого метода... с указанием разници между декларацией, имплементацией и вызовом...

думаю она просто не правильно "нарезала" код. В её коде, который я получил, с этим был порядок.
#30 
Simple Nothing is f*cked11.12.12 13:53
Simple
NEW 11.12.12 13:53 
in Antwort Posmotrim 11.12.12 13:48
> думаю она просто не правильно "нарезала" код. В её коде, который я получил, с этим был порядок.
Это понятно, но мне вот пришлось доводить его до ума :(
#31 
Sweti lipmos местный житель11.12.12 20:21
Sweti lipmos
NEW 11.12.12 20:21 
in Antwort Posmotrim 11.12.12 13:48, Zuletzt geändert 11.12.12 20:42 (Sweti lipmos)
Сергей, спасибо! Я только что пришла и начну сейчас разбираться. Сегодня я раз в десятый переписала почти все функции , теперь они все void. Ошибка в том коде, который был здесь была в строке if (feof==NULL) и еще в чем то ,что бетроер долго искал, не нашел , сказал нафиг и переписал пару строчек , так что файл прочитали, запомнили и распечатали. Но дальше работать опять не хотим.., вероятно, потому что надо сразу считывать другой файл и там та же ошибка, будем искать)) Я разберусь с твоей программе и буду знать как можно лучше писать, но моя уже готова и "почти работает" )) Там 14 функций и все написаны по принципу new-delete. С моей скоростью надо еще минимум неделя, что бы все переписать как ты предлагаешь и что бы все заработало..
Слава богу, я атеист..
#32 
Sweti lipmos местный житель11.12.12 20:38
Sweti lipmos
NEW 11.12.12 20:38 
in Antwort Simple 11.12.12 08:41, Zuletzt geändert 12.12.12 07:34 (Sweti lipmos)
Вот так заработало. Бетроер пробовал так же как у вас - не хотело работать (без temp)... Я еще не разобралась что такое lg , почитаю еще.
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.......")..........

Слава богу, я атеист..
#33 
Sweti lipmos местный житель11.12.12 20:47
Sweti lipmos
NEW 11.12.12 20:47 
in Antwort Murr 11.12.12 13:36
В ответ на:
что метод не может содержать определение другого метода...

Это как? я только знаю, что в методе можно вызывать другой метод. А определять это значит имплементировать или что?
Слава богу, я атеист..
#34 
Sweti lipmos местный житель11.12.12 21:33
Sweti lipmos
NEW 11.12.12 21:33 
in Antwort Posmotrim 11.12.12 08:42, Zuletzt geändert 11.12.12 21:34 (Sweti lipmos)
В ответ на:
линковки и времени выполнения.

это как по немецки? Время выполнения это же Laufzeit, а у него могут быть ошибки...?
У меня создан совсем другой класс :Interpolation, он же Int_2d. Там объект - это "нечто", состоящее из векторов x,y,z и двух длинн i,j. Твой класс Point печатает и считывает векторы. Мне его тогда как использовать в моем классе ? Как подкласс? Или я вообще не в ту степь? Я сначала начала класс векторов писать, бетроер сказал нет, надо класс интерполяция.
Слава богу, я атеист..
#35 
Sweti lipmos местный житель12.12.12 07:35
Sweti lipmos
NEW 12.12.12 07:35 
in Antwort Simple 11.12.12 08:18
В ответ на:
Постарайтесь в следующий раз запостить рабочий код.

ok..
Слава богу, я атеист..
#36 
  Posmotrim посетитель12.12.12 10:50
Posmotrim
NEW 12.12.12 10:50 
in Antwort Sweti lipmos 11.12.12 20:38
Тогда исправляй ошибки. Вот парочку на вскидку:
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.
Это то, что сразу бросается в глаза. Не поленись, и потрать день на теорию по работе с указателями/памятью.

#37 
Sweti lipmos местный житель12.12.12 20:18
Sweti lipmos
NEW 12.12.12 20:18 
in Antwort Posmotrim 12.12.12 10:50
В ответ на:
Тогда исправляй ошибки

Вот это мне и надо! Так я учусь )) на ошибках )) С ошибкой номер один сегодня пол дня билась..(( Напишу в личку
Спасибо !
Слава богу, я атеист..
#38 
SoftArch прохожий15.12.12 13:16
NEW 15.12.12 13:16 
in Antwort Simple 10.12.12 21:33
за исключением оператора new , практически да
#39 
SoftArch прохожий15.12.12 13:27
NEW 15.12.12 13:27 
in Antwort Sweti lipmos 12.12.12 20:18
ктож вас так мучает С++ для интерполяции и прочей мат. хрени есть матлаб.. вобщем я так и не понял, у вас программирование или математика в фокусе?
#40 
1 2 3 alle