A A A A Автор Тема: Программирую приложения по астрономии. Есть вопросы.  (Прочитано 605 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Павел ВасильевАвтор темы

  • *****
  • Сообщений: 996
  • Благодарностей: 31
  • БПЦ 20х60, HD 75x60
    • Сообщения от Павел Васильев
Это общее для всех ЯП:
"У меня вызывает затруднения найти алгоритм, такой же, какой применяет автор программы в своих ответах".
Название у алгоритма есть? Если код опенсорс, то можно скопировать имя функции, класса и поискать в интернет как им пользоваться, найти примеры и описание что он делает.
Полностью от и до изучить новый ЯП, да ещё который развивается, просто невозможно, для это есть система справки среды программирования и разные руководства. Не только по IDE, а ещё и по быстро растущей куче либ. 
Ещё проблема в том, что если ты постоянно чем то не пользуешься или программируешь специального типа приложения, то конечно со временем забываешь то, что раньше хорошо знал, из головы вылетают не только синтаксис с грамматикой, но и все остальные компоненты, не только визуальные.
Но есть некоторые продвинутые средства, помогающие в программировании. В самой IDE они тоже могут встречаться.

Во первых, надо чаще пользоваться справкой Help, там всё детально расписано и есть кое-какие примеры употребления.
Во вторых, установите или скачайте себе на компьютер все офф демосы и примеры использования вспомогательных библиотек.
В третьих, для вашего поиска в папках кодовой базы исходников ЯП и примерах используйте, например, Notepad++. Как найдёте нужный example, компилируйте и изучайте, что там происходит в отладчике.
В четвёртых, для сравнения юнитов кода и папок воспользуйтесь Beyond Compare. В нём сразу видны изменения по сравнению с оригиналом.
В пятых, в наше время для проекта, даже для учебных целей, необходимо создать репозиторий на опенсорс площадке (там легко создать и не побличный, а приватный проект, который кроме вас никто не увидит, но это обычно для секретных разработок). То есть необходимо освоить git и групповую разработку на площадках, например, майкрософтовском github, или на российских gitverse или gitflic.
 
Почему опенсорс? Если возникнут вопросы, то вы всегда можете  дать ссылку на ваш репозиторий и конкретный файл, гда возникли проблемы.
 
Астромодель нооэволюции Галактики https://gitverse.ru/glscene/astrobloq
Численное решение парадокса Ферми

Оффлайн Карат

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат

Простейшая фигня. Передаешь в функцию указатель на указатель. Функция сама выделяет маллоком под него память и заполняет его.
Спасибо, пробую разобраться. Пока вот такой пример:


Маленькая учебная подпрограмма (функция) Для передачи массива из функции.

Требуется ввести прямое восхождение светила Альфа в часах, минутах, секундах,
и преобразовать его в Звездное Дополнение  - SHA, затем вернуть его в main() в виде
вещественного числа SHA, а также в виде градусов SHA_gr  и минут  SHA_min, для дальнейшей обработки в программе.
Это весьма полезно, так как в дальнейшем предстоит обработка не одного значения,
а получения Альфа и Дельта из библиотеки.
Код работает. Но есть не ясности в деталях:
-  указатель на массив *ptr должен быть целым int, или как пишут в книжках void.
Однако, если я изменю float *ptr  на int или void, то код работать не будет.
-  как лучше исправить код чтобы было по науке?

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>


float *fun1(float, float, float);

int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);


    float chas, minut, seck, grad;
    float SHA, SHA_min, SHA_gr;


    printf ("\n\t Введи прямое восхождение светила: часы минуты секунды  ");

    scanf("%f %f %f", &chas, &minut, &seck);
    float *ptr=fun1 ( chas, minut, seck);


    printf("\n\n\t  SHA =%f  SHA_gr=%.0f\xB0  SHA_min= %.2f' \n",  *ptr, *(ptr+1), *(ptr+2));

    free(ptr);


    return 0;
}
/********************************/

float *fun1 (float chas, float minut, float seck)
{
    float SHA, SHA_min, SHA_gr, grad;

    float *ptr=(float*)malloc(3*sizeof(float));
    minut=minut+(seck/60);
    chas=chas+(minut/60);
    grad=chas*15;


    SHA=360-grad;
    SHA_min=modff(SHA, &SHA_gr);
    SHA_min *=60;


    ptr[0]=SHA;
    ptr[1]=SHA_gr;
    ptr[2]=SHA_min;


    return ptr;  // возвращаем указатель на массив

}



SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн LeftUser

  • *****
  • Сообщений: 34 462
  • Благодарностей: 1087
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Можно обойтись без массива.
В функцию сразу передавать секунды и указатели на вычисляемые значение.
В С вся мощь в указателях.
Быстродействие повысится в разы и избавимся от выделений и освобождений памяти.

void fun1 (int sec, float* pSHA, float* pSHA_gr, float*  pSHA_min)
{
    float grad;
    grad=((float)sec / 3600)*15;

    *pSHA=360-grad;
    *pSHA_min=modff(*pSHA, pSHA_gr);
    *pSHA_min *=60;
}

int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);

    int chas, minut, seck;
    float SHA, SHA_min, SHA_gr;

    printf ("\n\t Введи прямое восхождение светила: часы минуты секунды  ");

    scanf("%i %i %i", &chas, &minut, &seck);
    fun1(chas*3600+minut*60+seck, &SHA, &SHA_gr, &SHA_min);

    printf("\n\n\t  SHA =%f  SHA_gr=%.0f\xB0  SHA_min= %.2f' \n",  SHA, SHA_gr, SHA_min);

    return 0;
}

Оффлайн LeftUser

  • *****
  • Сообщений: 34 462
  • Благодарностей: 1087
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Так же можно объявить структуру и в функцию передавать указатель на структуру, чтобы она её заполнила вычисленными значениями.

typedef struct
{
   float SHA;
   float SHA_min;
   float SHA_gr;
} Params;

void fun1 (int sec, Params* prm)
{
    float grad;
    grad=((float)sec / 3600)*15;

    prm->SHA=360-grad;
    prm->SHA_min=modff(prm->SHA, &prm->SHA_gr);
    prm->pSHA_min *=60;
}

int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);

    int chas, minut, seck;
    Params prm;

    printf ("\n\t Введи прямое восхождение светила: часы минуты секунды  ");

    scanf("%i %i %i", &chas, &minut, &seck);
    fun1(chas*3600+minut*60+seck, &prm);

    printf("\n\n\t  SHA =%f  SHA_gr=%.0f\xB0  SHA_min= %.2f' \n",  prm.SHA, prm.SHA_gr, prm.SHA_min);

    return 0;
}

Оффлайн Карат

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
Можно обойтись без массива.
В функцию сразу передавать секунды и указатели на вычисляемые значение.

Спасибо, действительно здорово и красиво  ( СИ это сила  :)  )
Записываю в свою методичку, только надо еще до конца разобраться в процессе.
SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн Аурипигмент

  • *****
  • Сообщений: 5 971
  • Благодарностей: 189
  • Ми пацаки с планеты Земля. А Ви кто?
    • Сообщения от Аурипигмент
А зачем в названии темы указано, что приложение именно по астрономии? Типа, для другого применения уже нельзя? :-[
Нам тайны не раскрытые раскрыть пора,
Лежат без пользы тайны, как в копилке.
Мы тайны эти с корнем вырвем у ядра,
На волю пустим Джина из бутылки.

Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
А для других приложений традиционно создается тема "Программирую приложение по/для ...", можно с указанием языка, так даже лучше - больше тем создать можно ;D
Это вы одиноки во вселенной. А нас - рать.

Оффлайн Карат

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
В функцию сразу передавать секунды и указатели на вычисляемые значение.

Добрый день.

Варианты возврата данных из функции мне очень понравились, штука очень нужная.
Но требуется разбор полёта:

1. Мы передаем в функцию адреса переменных:
fun1(chas*3600+minut*60+seck, &SHA, &SHA_gr, &SHA_min);
это ясно.

2. Функция же принимает разыменованные указатели этих переменных, а затем изменяет их

void fun1 (int sec, float *pSHA, float *pSHA_gr, float *pSHA_min)

Но откуда взялись эти указатели pSHA ,  pSHA_gr,   pSHA_min, если они нигде не объявлялись и нигде не инициализировались?

SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн LeftUser

  • *****
  • Сообщений: 34 462
  • Благодарностей: 1087
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Но откуда взялись эти указатели pSHA ,  pSHA_gr,   pSHA_min, если они нигде не объявлялись и нигде не инициализировались?
Мы объявили сами переменные, значит они при компиляции обретают физические адреса, которые при передаче в функцию мы и указываем через амперсанд: &SHA. В прототипе функйии мы указываем, что в качестве параметра мы принимаем именно указатель на тип переменной с плавающей точкой: float* SHA. Ничего лишнего объявлять больше не надо.

Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
Но откуда взялись эти указатели pSHA ,  pSHA_gr,   pSHA_min
Если вы конкретно переменные pSHA ,  pSHA_gr,   pSHA_min, то это просто объявление параметров функции. Внутри самой функции описывается, что с этими параметрами делать и что нужно вернуть. А когда вы ее будете где-то вызывать, то в вызов подставите реальные переменные, причем называться они могут как угодно, хоть, например, fignya1, hren25 и sdafsadf.
Это вы одиноки во вселенной. А нас - рать.

Онлайн Toth

  • *****
  • Сообщений: 2 893
  • Благодарностей: 208
    • Сообщения от Toth
А когда вы ее будете где-то вызывать, то в вызов подставите реальные переменные, причем называться они могут как угодно,
Это называется формальные и фактические параметры ( аргументы ).
Canon PowerShot SX130 IS

Оффлайн Карат

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
Кирилл, Владимир, Toth,  разобрался, спасибо.
SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн LeftUser

  • *****
  • Сообщений: 34 462
  • Благодарностей: 1087
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
 :D
Сильные мужчины снова начинают учить С++


Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
Сначала был С... ;D (читать голосом переводчика из фильмов с кассет)
Это вы одиноки во вселенной. А нас - рать.

Оффлайн Карат

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
Сильные мужчины снова начинают учить С++

Значит вновь наступили трудные времена?  :)

А если кратко, в двух словах: чем питон проще, там указателей нет?

Честно говоря, не столько сложны эти указатели, сколько их запутанный синтаксис.
Вот зачем было использовать  * и для инициализации, и для разыменовывания, и для умножения?
А имя массива?  Оно есть указатель назло всем остальным переменным, и обращаться к ним надо совсем иначе.
Зачем было так делать?
Такое ощущение,  что указатели это инородная вставка из другого языка.



 
SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
Язык С разрабатывался системщиками для своих нужд, а т.к. до этого системщики писали в основном в машкодах и на ассемблере, то это сказалось. Кстати, язык назвали С не потому, что "системный", а потому, что перед этим был B :) Только он не зашел, продолжили разработку, а новый язык логично назвали С.
Это вы одиноки во вселенной. А нас - рать.

Оффлайн Аурипигмент

  • *****
  • Сообщений: 5 971
  • Благодарностей: 189
  • Ми пацаки с планеты Земля. А Ви кто?
    • Сообщения от Аурипигмент
А следующий должен быть D. :-[
А у них заклинило: C, C+, C++, C+решётка... :(
Нам тайны не раскрытые раскрыть пора,
Лежат без пользы тайны, как в копилке.
Мы тайны эти с корнем вырвем у ядра,
На волю пустим Джина из бутылки.

Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
Решили, что ибо нефиг и пошли по привычному пути: '++' - операция инкремента. А решетка - это уже мелкософт.
Это вы одиноки во вселенной. А нас - рать.

Онлайн Toth

  • *****
  • Сообщений: 2 893
  • Благодарностей: 208
    • Сообщения от Toth
Пример изящества Си. Там ссыла в комменте на подобные примеры.
Проверил, работает ( хотя сам не разбирался ). Расстановка 8 ферзей.
#include <stdio.h>
// http://www.iwriteiam.nl/SigProgC.html
q(a,b,c)
 {
int e,f,i=8;
for(;a&&i--;)
   if(e=1<<i,f=e<<a|e<<24-a,!(b&e||c&f)&&q(a-1,b|e,c|f))
   return printf("%08x\n",1<<i*4);
return!a;
}
int main(int argc, char **argv)
{
q(8,0,0);
return 0;
}
Canon PowerShot SX130 IS

Оффлайн Vladimir3621

  • *****
  • Сообщений: 25 880
  • Благодарностей: 1089
    • Сообщения от Vladimir3621
Строго говоря, до изящества регулярных выражений, особенно с лесом зубочисток, примеру далеко ;D А так, приколы сей, перлов, пыхапов, жабного скрипта и любого другого сиобразного языка - это притча во языцех. Там так изящно можно завернуть, что у слабых нервами погромистов мозги набекрень всю жизнь будут. Но, регулярки всегда впереди будут ;D
Это вы одиноки во вселенной. А нас - рать.