Зачем использовать #if 0 для комментирования блоков?

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

# Stereographic projection coverage
#   should be specified less than half of a hemisphere

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

m = Basemap(projection='stere', resolution='c',
        lat_0=90, lon_0=270,  lat_ts=(90.+35.)/2., width=15000000, height=10000000)
# (width, height) is the plot extents in meters

m.drawmeridians(np.arange(0, 360, 30), labels=[1,1,1,0])
m.drawparallels(np.arange(0, 90, 10), labels=[0,0,0,1])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Результирующий сюжет (карта 1):

enter image description here

Чтобы получить другую часть мира в область построения достигается путем повторного центрирования карты.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

# projection center point
lon0 = 180
lat0 = 60

m = Basemap(projection='stere', resolution='c',
        lat_0=lat0, lon_0=lon0,  lat_ts=lat0, width=15000000, height=10000000)

m.drawmeridians(np.arange(0, 360, 30), labels=[1,0,0,1])  # left, right, top, bottom
m.drawparallels(np.arange(0, 90, 10), labels=[0,1,1,0])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Выходной график (карта 2):

enter image description here

Указав правильные значения llcrnrlon, urcrnrlon, llcrnrlat, urcrnrlat, в Basemap() можно получить экстенты карты по мере необходимости. Вот еще один пример сюжета по просьбе ФП.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(8,8))
m = Basemap(projection='stere', resolution='c',
        lat_0=90, lon_0=-90,  lat_ts=(90.+35.)/2.,
        llcrnrlon=-142, urcrnrlon=78, llcrnrlat=19, urcrnrlat=45)

m.drawmeridians(np.arange(0, 360, 30), labels=[1,0,1,0])  # left, right, top, bottom
m.drawparallels(np.arange(0, 90, 10), labels=[0,1,0,1])
m.drawcoastlines()
m.shadedrelief()
plt.show()

Полученный сюжет (карта 3):

map3

28
задан Brian Tompsett - 汤莱恩 27 February 2016 в 20:22
поделиться

4 ответа

Помимо проблемы с вложенностью комментариев в стиле C, отключение блоков кода с помощью #if 0 имеет преимущество, заключающееся в возможности свертывания, если вы используете редактор, который поддерживает свертывание кода. Это также очень легко сделать в любом редакторе, тогда как отключение больших блоков кода с помощью комментариев в стиле C ++ может быть громоздким без поддержки редактора / макросов.

Кроме того, многие блоки #if 0 также имеют блок else. Это дает простой способ переключения между двумя реализациями / алгоритмами и, вероятно, менее подвержен ошибкам, чем массовое комментирование одного раздела и массовое раскомментирование другого. Тем не менее, вам лучше использовать что-то более читаемое, например #if DEBUG, в этом случае.

6
ответ дан 28 November 2019 в 02:48
поделиться

Ух ты! Не переусердствуйте ...

Я бы назвал это более неряшливым для большего расстояния, чем что-либо еще. У меня было время, когда я находил, что лучше помещать короткие заявления в одну строку с их IF, хотя эти заявления растягивают его.

Встроенный стиль лучше для вертикальной краткости ... может быть легко разбит на 4, больше строк

if (pwbuf) 
  sprintf(username,"%s",pwbuf->pw_name); 
else 
  sprintf(username,"%d",user_id); 

Лично я ненавижу следующий стиль, так как он такой многословный, что затрудняет просмотр файл.

if (pwbuf) 
{
  sprintf(username,"%s",pwbuf->pw_name); 
}
else
{ 
  sprintf(username,"%d",user_id); 
}
0
ответ дан 28 November 2019 в 02:48
поделиться
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

Идиоматичный и лаконичный. Если бы к нему прикоснулись более 2 или 3 раз, я бы поставил его в скобки и добавил. Это не очень удобно, если вы добавляете информацию о регистрации или другие условия.

#if 0
....
#endif

Хорошо включить блоки отладочного кода или нет. Кроме того, можно было бы избежать ошибок компиляции, связанных с попыткой блокировать комментарии такого рода:

/* line comment */
...
/* line comment again */

Поскольку комментарии блока C не вкладываются.

0
ответ дан 28 November 2019 в 02:48
поделиться

#if 0 ... #endif довольно часто встречается в старом C-коде. Причина в том, что комментирование с комментариями в стиле C /* .... */ не работает, потому что комментарии не вкладываются.

Несмотря на то, что это часто встречается, я бы сказал, что ему нет места в современном коде. Люди делали это в старину, потому что их текстовые редакторы не могли автоматически блокировать комментарии больших разделов. Более того, они не имели надлежащего контроля исходного кода, как сейчас. Нет оправдания тому, чтобы оставлять комментарии или # ifdef'd в рабочем коде.

-1
ответ дан 28 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: