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

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

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

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
Пример изящества Си.
Нам там во век не разобраться. Зато есть хороший пример путаницы с указателями.
Создадим два массива первый через указатель и [ ] ,  второй  только через указатель.
В итоге имеем два указателя str1 и str2 .  По всем правилам, для распечатки и изменения массива, надо обратится к ним через *.
Но не тут-то было в первом случае код работает, а во втором случает работает только без *
И как тут не запутаться?   :o
char *str1[] = {"Это классический массив. Смотри его нотацию" };

    printf("\n\t %s   его адрес  %p  ", *str1, str1);
    *str1= "Изменяю классический массив";
    printf("\n\t %s   и его адрес %p  ", *str1, str1);

    // случай 2 Массив создается указаелем.

    char *str2 = "Это массив созданный указателем. Нотация уже совсем другая ";

    printf ("\n\t %s\n", str2);

    str2 ="Изменяю массив с указателем";
    puts (str2);

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

Оффлайн LeftUser

  • *****
  • Сообщений: 34 613
  • Благодарностей: 1092
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Создадим два массива первый через указатель и [ ] ,  второй  только через указатель.
Это два разных типа.

char *str1[] - массив указателей на строки. Т.е. он не один, их много. Но проинициализирован только первый своей строкой.

char *str2 - это просто указатель на строку.

В комментах просто каряво написано. Вот для этого и надо читать правильные книги по С.
Сам начинал с этой книги, на мой взгляд одной из лучших: https://disk.yandex.ru/i/2xQDMOCtIF0moA

Оффлайн Karagy

  • *****
  • Сообщений: 1 591
  • Благодарностей: 52
    • Сообщения от Karagy
А следующий должен быть D. :-[
Он есть. DLang. Так называемый "C++ с человеческим лицом". За последние десятилетия в нём было реализовано много новшеств, в последствии перекочевавших в современные С++.
Русскоязычная группа по ди: https://t.me/dlangru
А ещё на нём считают погоду в Арабских Эмиратах. Не многие языки могут похвастаться рассчетом погоды.

Оффлайн LeftUser

  • *****
  • Сообщений: 34 613
  • Благодарностей: 1092
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Добавлю ещё. Для всех начинающих изучать С. Указатели в приведённой книге рассматриваются только во второй половине. К этому моменту вы должны знать практический весь синтаксис. Это важно. Не надо изучать язык с конца.

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

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
char *str1[] - массив указателей на строки. Т.е. он не один, их много. Но проинициализирован только первый своей строкой.

char *str2 - это просто указатель на строку.

Точно, первый это же массив указателей. Глаз - алмаз. Я бы сам и не вспомнил.
SW Dob 300мм,   Celestron  200мм Dob.

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

  • *****
  • Сообщений: 925
  • Благодарностей: 71
  • Как много есть вещей, которые мне не нужны!
    • Сообщения от Карат
Сам начинал с этой книги, на мой взгляд одной из лучших: https://disk.yandex.ru/i/2xQDMOCtIF0moA
Уже посмотрел книгу. Начинаю  жалеть, что начинал не с нее. Действительно, хорошая подача материала.

Стивена Прата рекомендуют многие, особенно хвалят его книгу : "Язык программирования Си". 6-е издание 2018 год. Но это уже совсем не основы, а полное руководство по Си.
SW Dob 300мм,   Celestron  200мм Dob.

Оффлайн Toth

  • *****
  • Сообщений: 2 909
  • Благодарностей: 211
    • Сообщения от Toth
Неожиданно. Почему sizeof символа x - 4 ? Вроде 1 должно быть. Ну или 2 ( юникод ).
Остальные строки понятно.
#include <stdio.h>
int main(int argc, char **argv)
{
printf(" %d\n",sizeof('x'));
printf(" %d\n",sizeof("x"));
printf(" %d\n",sizeof("xx"));
printf(" %d\n",sizeof(char));
return 0;
}
Canon PowerShot SX130 IS

Оффлайн LeftUser

  • *****
  • Сообщений: 34 613
  • Благодарностей: 1092
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Неожиданно. Почему sizeof символа x - 4 ?
Видимо реализация компилятора. По умолчанию возможно считает символ (заключённый в одинарные кавычки) как int. Это как любой enum, тоже за int обычно принимает.
Можно принудительно написать типа:

printf(" %d\n",sizeof(char('x')));

По идее выведет 1.

зы По С++ написал. Надо наверное так: printf(" %d\n",sizeof((char)'x'));

Оффлайн Toth

  • *****
  • Сообщений: 2 909
  • Благодарностей: 211
    • Сообщения от Toth
Надо наверное так: printf(" %d\n",sizeof((char)'x'));
Да, так 1.

PS Да, оказалось как int - см. https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81_%D0%B8_%D1%81%D0%B5%D0%BC%D0%B0%D0%BD%D1%82%D0%B8%D0%BA%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%D0%B8
В Си символьная константа без префикса имеет тип int, в отличие от C++, в котором символьной константе соответствует char
« Последнее редактирование: 22 Авг 2025 [02:06:22] от Toth »
Canon PowerShot SX130 IS

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

  • *****
  • Сообщений: 1 015
  • Благодарностей: 32
  • БПЦ 20х60, HD 75x60
    • Сообщения от Павел Васильев
Расстановка 8 ферзей.
В чём изящество? Нет ни чёрно-белых клеток доски 8х8, ни фигур ферзей, ни понятных, не односимвольных,  переменных, no comments. На Си можно писать и более читабельный код, если не расставлять пальцы веером. То-же самое можно и на ассемблере написать, будет элегантнее, но опять же, далеко от наглядного представления и графического решения задачи. Так, программирование ради программирования.
Астромодель нооэволюции Галактики https://gitverse.ru/glscene/astrobloq
Численное решение парадокса Ферми

Оффлайн LeftUser

  • *****
  • Сообщений: 34 613
  • Благодарностей: 1092
  • Кирилл ㋛
    • Сообщения от LeftUser
    • Часы
Расстановка 8 ферзей.
В чём изящество?
Паскалистам не понять. Они вечные ученики, им нужна наглядность и доходчивость  ;D

Оффлайн Vladimir3621

  • *****
  • Сообщений: 26 116
  • Благодарностей: 1095
    • Сообщения от Vladimir3621
Строго говоря, сишники тоже не вкуривают, т.к. это переписанная на ссях реализация решения задачи еще с машинных кодов, когда ссями в воздухе еще и близко не пахло. Так что все квиты :)
Это вы одиноки во вселенной. А нас - рать.

Оффлайн Toth

  • *****
  • Сообщений: 2 909
  • Благодарностей: 211
    • Сообщения от Toth
Кстати, на чисто-Си и Фортране-77 есть исходники от Международного Астрономического Союза - http://www.iausofa.org/
Можно посмотреть описания в .pdf  - http://www.iausofa.org/current_C.html#Downloads

Интересно - видимо для сохранения преемственности дату JD представляют в виде двух чисел double. Хотя даже 1 переменная double обеспечивает точность порядка 0.1 милисекунды.
Canon PowerShot SX130 IS

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

  • *****
  • Сообщений: 1 015
  • Благодарностей: 32
  • БПЦ 20х60, HD 75x60
    • Сообщения от Павел Васильев
Кстати, на чисто-Си и Фортране-77 есть исходники от Международного Астрономического Союза - http://www.iausofa.org/
Можно посмотреть описания
Эту сишную либу SOFA я давно уже включил в AstrobloQ, вместе с другими. Она обновлена в 2023 году. Но проблема в том, что для неё я что-то не нашёл примеров использования. Для astronomy.c демосы есть, для "Астрономии на ПК" О.Монтенбрука и Т.Пфлегера целый диск с приложениями, а тут нет и на Гитхабе. Была мысль самому заменить в примерах APC вызовы функций на SOFA и сравнить результаты, но это долгая работа. Студентам-астрономам это можно дать в виде упражнений, что было бы полезно.

Астромодель нооэволюции Галактики https://gitverse.ru/glscene/astrobloq
Численное решение парадокса Ферми