Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Antananarivu
Дата сообщения: 16.10.2007 14:04
WiseAlex
А чем мат. вычисления на Java глобально лучше мат. вычислений на С++? А интерфейс итак на Java уже.
Автор: Rudia
Дата сообщения: 16.10.2007 14:36
distance
То что вы выделили красным цветом - есть не что иное, как порядок следования аргументов, который определяется соглашениями о вызове, к примеру с С и С++ порядок следования аргументов справа-налево, причем вызывающий убирает аргументы из стека, а в паскале - наоборот слева-направо и аргументы из стека убирает сама функция. В то же время идентификатор класса все-равно является ссылкой и в функцию передается ссылка на область памяти)
Antananarivu

Цитата:
А чем мат. вычисления на Java глобально лучше мат. вычислений на С++? А интерфейс итак на Java уже.

К примеру тем, что в Java уже встроены классы типов с произвольной точностью и реализованы математические дейтсвия с ними.
Автор: distance
Дата сообщения: 16.10.2007 14:52
Rudia

Цитата:
порядок следования аргументов

Calling Convention
Marshalling
Автор: WiseAlex
Дата сообщения: 16.10.2007 15:22
WiseAlex

Цитата:
глобально лучше мат. вычислений на С++


Цитата:
А интерфейс итак на Java уже.

так вы получите единую унифицированную кроссплатформенную систему. Кроме того разные компиляторы могут по-разному трактовать long double и вычисления могут иметь разную точность и результат
А если java не даст требуемой скорости вычислений, тогда можно и подумать о с/с++
Автор: terminat0r
Дата сообщения: 16.10.2007 15:25
Rudia

Цитата:
К примеру тем, что в Java уже встроены классы типов с произвольной точностью и реализованы математические дейтсвия с ними

А это уже интересно, я и не знал. Спасибо!
Автор: Antananarivu
Дата сообщения: 16.10.2007 15:43
Как минимум 25000 строк кода - перерабатывать из С++ в Java... Это должна быть глобальная необходимость в этом. А точности мне пока хватает.
Автор: Rudia
Дата сообщения: 16.10.2007 15:50
distance
Ладно не будем спорить, в чем-то неправ я, в чем-то - вы, вот умная статья на тему спора)
h__p://www.mindon.net/articles/gchandle.html
Автор: Sacramento
Дата сообщения: 16.10.2007 19:50
distance Спасибо!
Проблема была в том, что я объявлял структуру как:
----
typedef struct
{
int Info;
int Other;
}TEST;
----

А надо было как у тебя
---
struct TEST
{
int Info;
int Other;
};

После этих изменений все заработало на ура. Хотя может я чего-то еще подправил, но вроде только это. Благодарю за помощь!
Автор: Rudia
Дата сообщения: 16.10.2007 22:21
Sacramento
Советую посмотреть статью, ссылку на которую дал в посте выше, в ней как раз рассматривается ваша проблема, там все не так просто и вам просто повезло, что у вас простейшая структура - поэтому и заработало.
Автор: Sacramento
Дата сообщения: 16.10.2007 23:28

Цитата:
Советую посмотреть статью, ссылку на которую дал в посте выше, в ней как раз рассматривается ваша проблема, там все не так просто и вам просто повезло, что у вас простейшая структура - поэтому и заработало.

На самом деле я только для примера брал простейшую структуру.
Я пробовал тоже самое со структурой(которая у меня будет использоваться в программе) которая содержит еще 6 вложенных структур, где каждая в свою очередь содержит самые разнообразные типы данных, включая массивы и массивы структур. Как не странно все работало без проблем.

Единственное с чем я столкнулся: в C# надо использовать именно структуру, а не класс, хотя вроде при вызове системных функций я использовал классы и все работало. Если я использую класс со своими функциями, то вылетает ошибка, которая говорит что я неправильно использую управляемые и неуправляемые переменные (что-то типа этого)...

когда уже написал это сообщение, переключился на твою статью, где упоминается проблема при использовании класса. Прикольно... А статья действительно интересная.
Автор: Antananarivu
Дата сообщения: 17.10.2007 09:03
Еще вопрос возник...

Код: NMTMatrix::NMTMatrix(int N,int M)
{
nx=N;
mx=M;
data=(LDouble*)malloc(N*M*sizeof(LDouble));
for (int i=0; i < nx*mx; i++) data[i]=0;
}
Автор: Mr Nobody
Дата сообщения: 17.10.2007 09:20
Antananarivu
Первая функция у вас конструктор, который создает нулевую NхM размера матрицу
Цитата:

Потом создали матрицу А размера 3х5.
Скажем так, у меня автоматически переразметиться все на матрицу 5 на 8.

Конечно нет, это не Матлаб, так как вот это

Цитата:
A.nx=5;
A.mx=8;

ставит С++ с ног наголову.
Мой совет, возьмите STL, там все это есть.

Автор: Abs62
Дата сообщения: 17.10.2007 09:20
Antananarivu

Цитата:
Скажем так, у меня автоматически переразметиться все на матрицу 5 на 8. Опять же это коректное решение?

Совершенно некорректное - память-то выделена под старый размер. И если при уменьшении размера это ещё прокатит (обращения к матрице не вылезут за пределы выделенного блока), то при его увеличении облом гарантирован. Чтобы не было такого искушения, nx и mx следует объявить как protected. Тогда компилятор просто не допустит этого безобразия.
А если есть необходимость динамически менять размер, пишется соответствующий метод, который новый блок памяти выделит, данные при необходимости перенесёт, старый освободит, nx и mx поменяет.
А вообще, прямой доступ к полям класса - это в перспективе неиссякаемый источник глюков. Лучше соблюдать простое правило - весь доступ ведётся исключительно через методы класса.
Автор: Antananarivu
Дата сообщения: 17.10.2007 09:36
А у меня сработало ксати, я не говорю что вы не правы, я понимаю, что криво, но ведь сработало.
После того как я переделал размер, те поля которые вышли за границы новой матрицы заполнились случайными цифрами, те поля которые и в новой и в старой матрице совпадали - цифры в них сохранились, а в новые поля я после добавил свои цифры и затем эта матрица при дальнейших вычислениях отработала как надо, без глюков. Видимо, мне просто повезло.


Добавлено:
А если переделать не так:

Код: A.nx=5;
A.mx=8;
Автор: WiseAlex
Дата сообщения: 17.10.2007 10:41
Antananarivu
если вы так будете писать библиотеку, то на ее поддержку уйдет больше средств, чем на переписывание на java
Mr Nobody

Цитата:
Мой совет, возьмите STL, там все это есть.

совет с одной стороны правильный, а с другой - может стоит посмотреть на что-то более математическое типа blitz++ (эту библиотеку лучше брать с cvs напрямую - официальные архивы давно не обновлялись)
Автор: Mr Nobody
Дата сообщения: 17.10.2007 13:38
WiseAlex
Я бы дал ему такой совет, но я сампонятия не имел об этой библиотеке. Я всегда программировал все это сам. Спасибо за ссылку.
Автор: Antananarivu
Дата сообщения: 17.10.2007 13:49
Да.. за ссылку спасибо, посмотрю...
Автор: Dem_anywhere
Дата сообщения: 17.10.2007 14:56

Цитата:
После того как я переделал размер, те поля которые вышли за границы новой матрицы заполнились случайными цифрами

Это не случайные цифры, а цифры других программ. А ты их затёр своими.


Цитата:
ну то есть надо ли каждый раз явно освобождать память при присвоению указателю разных областей памяти или достаточно освободить память в самом конце?

Всё что взял - отдай.
Автор: Antananarivu
Дата сообщения: 17.10.2007 15:24
Блин, мне кажется я никогда не стану ни хорошим программистом, ни программистом, ни плохим программистом. Читаю вроде умные книги, читаю, и вроде узнаю, но все что-то не про то и не про то. В книге все просто, а тут опять ничего не ясно.
К чему истерика? А вот к чему. Все что взял отдай... после new будь добр delete. А потом в программе встречаю вот такое:

Код: JNIEXPORT jint JNICALL Java_prognoz_prognoz_1interface_CreateTwoBody
(JNIEnv *, jclass instance, jint Sat, jdouble Mu)
{
Satellite* sat = (Satellite*)Sat;
    sat->m_NU.mu = Mu;
void *two=NULL;//TwoBody* two = new TwoBody(Mu);
    return (jint) two;
};
Автор: ItsJustMe
Дата сообщения: 17.10.2007 16:53
Если я не ошибаюсь, во втором случае экземпляр класса хранится в стеке.
Автор: Rudia
Дата сообщения: 17.10.2007 17:46

Цитата:
Код:
M_PIntegr = new CIntegrator(m_NU.tj,..........);
CIntegrator - соответсвенно класс.
Почему нельзя было тупо

Код:
CIntegrator BB(m_NU.tj,..........);
В чем разница?


Во втором случае используется автоматическая память и экземпляр класса автоматически уничтожается при выходе из программного блока, где он был объявлен, то есть если он создан в теле функции - то при выходе из функции он уничтожится.

В первом случае используется динамическая память и объект класса уничтожается только по вызову delete
Автор: gec
Дата сообщения: 17.10.2007 18:48

Код: double * quick(double *s,int low,int hi)
{
double cnt,aux;
int i,j;
if (hi>low)
{
i=low;
j=hi;
cnt=s[i];
while(i < j)
{
if (s[i+1]<=cnt)
{
s[i]=s[i+1];
s[i+1]=cnt;
i++;
}
else
{
if (s[j]<=cnt)
{
aux=s[j];
s[j]=s[i+1];
s[i+1]=aux;
}
j--;
}
}
quick(s,low,i-1);
quick(s,i+1,hi);
}
return(s);
}
Автор: Abs62
Дата сообщения: 17.10.2007 19:14
Antananarivu

Цитата:
А еще лучше для общего случая - было A(N,M), должно стать A(P,Q). Как это корректно сделать? Мало работал с динамической памятью... если кто поможет и напишет хотя бы примерный вид метода - буду премного благодарен.


Код: int NMTMatrix::ResizeMatrix(int P,int Q)
{
LDouble *ptr=(LDouble*)malloc(P*Q*sizeof(LDouble));
if(NULL==ptr) return(-1);
free(data);
data=ptr; nx=P; mx=Q;
for (int i=0; i < nx*mx; i++) data[i]=0;
return(0);
}
Автор: Antananarivu
Дата сообщения: 18.10.2007 10:31
Abs62
A у тебя NULL==ptr, а не ptr==NULL с какой целью? чтобы обезопасить себя от случайности типа ptr=NULL вместо ptr==NULL?
Автор: Mickey_from_nsk
Дата сообщения: 18.10.2007 11:09
gec
Вообще то это реализация метода быстрой сортировки (quicksort). При чем тут нажатия клавиш - непонятно.
Автор: Antananarivu
Дата сообщения: 18.10.2007 17:02
У меня еще один вопрос.
У меня есть класс в классе функция. Функция вычисляет некоторое значение. Потом уже в другой функции класса мне нужно значение, которое было получено предыдущей функцией. Есть еще несколько функций, которым в будущем будет нужно это значение.
Как корректней организовать работу с такой переменной? Объявить ее членом класса? Создать ее в динамической памяти? Еще как-то? А то я сейчас таскаю ее из функции в функцию - возвращаю значение, снова загоняю в список параметров, передаваемых следующей функции... Явно же бред делаю.
Автор: WiseAlex
Дата сообщения: 18.10.2007 17:23
Antananarivu
если там не супер вычисления на кучу времени, то пока ничего не делай - пусть вызывается. если будут проблемы со скоростью, тогда про оптимизацию и подумаешь
Автор: Abs62
Дата сообщения: 18.10.2007 18:16
Antananarivu

Цитата:
чтобы обезопасить себя от случайности типа ptr=NULL вместо ptr==NULL?

Вот именно. На ptr=NULL внутри if последует warning, который можно и зевнуть (или он вообще может быть отключён), а на NULL=ptr - error, который не зевнёшь при всём желании.

Цитата:
Как корректней организовать работу с такой переменной?

А как удобнее работать - так и сделать.
Автор: wmlife24
Дата сообщения: 18.10.2007 18:17
Помогите сделать консольную программу!
Вот задание....

Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы заключается в считывании текста и отбражении его на экране , используя замену заданного набора символов на пробелы. Программа должна предлагать следующие варианты наборов символов для фильтрации:
Символы латинского алфавита
Символы кириллицы
Символы пунктуации
Цифры
Фильтры могут накладываться последовательно. При повторной установке существующего фильтра данный фильтр должен сниматься.
Автор: distance
Дата сообщения: 18.10.2007 19:09
wmlife24
вообще, такие задачи хороше решать с помощью регулярных выражений, но чувствую, для лабы оно не покатит

вот проверил на цифрах в VC2005. остальные символы добавь сам, а то они слишком длинные получаются
[more]
Код: #include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>

class Filter : public std::unary_function<std::string::value_type, std::string::value_type>
{
public:
    enum FilterType
    {
        Latin,
        Cyrillic,
        Digits,
        Punctuation,
    };

    Filter()
    {
        // поддерживаемые фильтры
        filters_.insert(FiltersMap::value_type(Latin, "abc..")); // добавишь сам
        filters_.insert(FiltersMap::value_type(Cyrillic, "..."));
        filters_.insert(FiltersMap::value_type(Digits, "0123456789"));
        filters_.insert(FiltersMap::value_type(Punctuation, "..."));
    }

    // включение/выключение фильтров
    void toggle(FilterType ft)
    {
        FiltersMap::iterator filter = filters_.find(ft);
        FiltersChain::iterator found = std::find(chain_.begin(), chain_.end(), filter->second);
        if (found == chain_.end())
            chain_.push_back(filter->second);
        else
            chain_.erase(found);
    }

    // обработка строки
    std::string product(const std::string& input)
    {
        std::string s = input;
        std::transform(s.begin(), s.end(), s.begin(), *this);
        return (s);
    }

    result_type operator() (const argument_type& ch) const
    {
        for (FiltersChain::const_iterator it = chain_.begin(); it != chain_.end(); ++it)
        {
            if (it->find(ch) != std::string::npos)
                return (' ');
        }
        return (ch);
    }

protected:
    
    // данные класса
    typedef std::map<FilterType, std::string> FiltersMap;
    typedef std::vector<std::string> FiltersChain;
    
    FiltersMap filters_;
    FiltersChain chain_;
};

int main()
{
    Filter f;
    f.toggle(Filter::Digits);
    std::string s = f.product("asd_2.4._d_");
    std::cout << s << std::endl;
    return (0);
}

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.