Daha çox

Dəyişənə bir funksiyadan daxil olarkən və başqa bir funksiyada istifadə edərkən gözlənilən çıxış yoxdur

Dəyişənə bir funksiyadan daxil olarkən və başqa bir funksiyada istifadə edərkən gözlənilən çıxış yoxdur


Bir funksiyam var ki, seçilmiş xüsusiyyətlər mapcanvas -da seçim dəyişən hadisə baş verəndə bu funksiya çağırılacaq.

self.canvas.selectionChanged.connect (self.selectedfeatures) QObject.connect (self.dlg.runbutton, SIGNAL ("clicked ()"), self.mapselection) def selectedfeatures (self): layer = iface.activeLayer () idx = layer.fieldNameIndex ('ad') self.feature = layer.selectedFeatures () QMessageBox.information (self.dlg, "xüsusiyyətlər seçildi:", str (len (self.feature)) + "xüsusiyyətlər seçildi" + "" )

Və yuxarıdakı funksiyada seçilmiş xüsusiyyətlər üçün aşağıdakı funksiyanı istifadə edərək bufer yerinə yetirmək istəyirəm. Aşağıdakı kimi mapselection funksiyasında self.feature istifadə edirəm.

def mapselection (self): self.feature xüsusiyyətində: mbuf = feature.geometry (). tampon (dist, 2) iterFeat = layer.getFeatures () in f in iterFeat: geom2 = f.geometry () valTest = QgsGeometry. içərisində (geom2, mbuf) if valTest: idx = feature.fieldNameIndex ('name') #İçindəki şəhərləri olan atribut sütununun adı idx1 = feature.fieldNameIndex ('dövlət') nearCity = f.attributes () [idx] state = f.attributes () [idx1] state_and_cities = str (state) + "," + str (nearCity) lsNearCities.append (state_and_cities) #funksiyasına zəng edərək onları self.writeToFile (lsNearCities, filePath) faylına yazın.

Mapcanvas -da seçilmiş xüsusiyyətlər olsa da, çıxış gözlənildiyi kimi deyil, lsNearCities siyahısında 0 şəhərin olduğunu söyləyir. Mapcanvas -da tamamlanan seçim prosesi üçün hər hansı bir hadisəni ayrıca daxil etmək istərdimmi bilmək istəyirəm? Əgər belədirsə, bu necə edilməlidir? Zəhmət olmasa harada səhv etdiyimi söyləyin.


Hər şeyi sadə tutun, xüsusi bir funksiyaya ehtiyacınız yoxdurseçilmiş xüsusiyyətlərburada hər şeyi bir anda edə bilərsiniz (əvvəl Python konsolunda skriptinizi sınayın).

1) ehtiyacınız yoxdurValtestdövlət_ və şəhərləridəyişənlər:

layer = iface.activeLayer () idx = layer.fieldNameIndex ('ad') idx1 = feature.fieldNameIndex ('dövlət') in layer.selectedFeatures (): mbuf = feature.geometry (). tampon (dist, 2) for f in layer.getFeatures (): geom2 = f.geometry () if QgsGeometry.within (geom2, mbuf): lsNearCities.append (str (f.attributes () [idx]) + "," + str (f. atributlar () [idx1]))

2) Daha da sadələşdirmək istəyirsinizsə (loop üçün yalnız bir), itertools standart Python modulundan istifadə edin.

itertools məhsulunu f, itertools.product (layer.getFeatures (), layer.selectedFeatures ()): geom2 = f.geometry () mbuf = feature.geometry () .bufer (dist, 2) əgər QgsGeometry.within ( geom2, mbuf): lsNearCities.append (str (f.attributes () [idx]) + "," + str (f.attributes () [idx1])) self.writeToFile (lsNearCities, filePath)

3) Onsuz da edə bilərsinizYaxın şəhərlər:

çıxış olaraq açıq (filepath, 'w') ilə: f üçün, itertools.product (layer.getFeatures (), layer.selectedFeatures ()): geom2 = f.geometry () mbuf = feature.geometry (). tampon (dist, 2) əgər QgsGeometry.within (geom2, mbuf): output.write (str (f.attributes () [idx]) + "," + str (f.attributes () [idx1]) + ' n ')

Kontakt axınından Lambda funksiyasını çağırın

Bir Lambda funksiyasını çağıran bir əlaqə axını görmək üçün Lampda Nümunə inteqrasiyasına baxın.

Bir əlaqə axını açın və ya yaradın.

Invoke AWS Lambda funksiya bloku əlavə edin ( İnteqrasiya edin qrup) şəbəkəyə. Filialları bloka və blokdan bağlayın.

Xüsusiyyətlər səhifəsini açmaq üçün Invoke AWS Lambda funksiya blokunun başlığını seçin.

Altında Bir funksiya seçin, nümunənizə əlavə etdiyiniz funksiyalar siyahısından seçin.

(İsteğe bağlı) altında Funksiya giriş parametrləri, seçin Parametr əlavə edin. Çağırıldıqda Lambda funksiyasına göndərilən açar-dəyər cütlərini təyin edə bilərsiniz. A da təyin edə bilərsiniz Vaxt funksiya üçün dəyər.

Daxilində Zaman aşımı (maksimum 8 saniyə), Lambdanın bitməsini gözləmək üçün nə qədər vaxt lazım olduğunu göstərin. Bu müddətdən sonra əlaqə xəta şöbəsindən aşağıya doğru gedir.

Kontakt axınından hər Lambda funksiyası çağırışı üçün, davam edən əlaqə ilə əlaqəli standart məlumat dəstini, habelə sənəddə müəyyən edilmiş əlavə atributları ötürürsünüz. Funksiya giriş parametrləri üçün bölmə AWS Lambda funksiyasını çağırın blok əlavə edildi.

Aşağıda Lambda funksiyasına JSON sorğusunun nümunəsidir:

Müraciət üç hissəyə bölünür:

Əlaqə məlumatları - Bu hər əlaqə üçün hər zaman Amazon Connect tərəfindən ötürülür. Bəzi parametrlər isteğe bağlıdır.

İstifadəçi atributları - Bunlar əvvəllər bir əlaqə ilə əlaqəli olan xüsusiyyətlərdir, məsələn Əlaqə xüsusiyyətlərini təyin edin bir əlaqə axınında blok. Saxlanan atributlar yoxdursa, bu xəritə boş ola bilər.

Parametrlər - Lambda funksiyasını yaratdığınız zaman təyin olunan bu zəngə xas olan parametrlərdir.

Yenidən çağırma siyasəti

Bir əlaqə axınında Lambda çağırışınız daralırsa, sorğu yenidən sınanacaq. Ümumi bir xidmət çatışmazlığı (500 səhv) baş verərsə, yenidən sınanacaq.

Sinxron bir çağırış bir səhv qaytardıqda, Amazon Connect ən çox 8 saniyə ərzində 3 dəfəyə qədər yenidən cəhd edir. Bu nöqtədə, axın Hata şöbəsindən aşağıya doğru irəliləyəcək.

Birdən çox Lambda funksiyasını çağırın

Amazon Connect, bir sıra Lambda funksiyalarının müddətini 20 saniyə ilə məhdudlaşdırır. Ümumi icra müddəti bu həddi keçdikdə səhv edəcək. Müştərilər Lambda funksiyasını yerinə yetirərkən sükut eşitdikləri üçün a Çalma istəyi uzun müddət qarşılıqlı əlaqədə olmalarını təmin etmək üçün funksiyalar arasında blok qoyun.

Lambda zəncirini parçalayaraq Çalma istəyi blok etsəniz, 20 saniyəlik eşikdən daha uzun davam edən bir çox funksiyanı işə sala bilərsiniz.


Etimadnamə¶

Etibarnamələr bir neçə yolla təyin edilə bilər:

  • Ətraf mühit dəyişənləri
  • AWS Paylaşılan Etimad Sənədi
  • AWS CLI konfiqurasiya faylı

İkinci sütun, ya AWS CLI konfiqurasiya faylında, ya da AWS Paylaşılan etimadnamə sənədində göstərə biləcəyiniz adı göstərir (

Paylaşılan Etimadnamə Dosyası¶

Paylaşılan etimadnamə faylının standart yeri var

/.aws/redentials . Paylaşım etimadnaməsi faylının yerini təyin edərək dəyişə bilərsiniz AWS_SHARED_CREDENTIALS_FILE mühit dəyişən.

Bu fayl, profillərə uyğun bölmə adları olan bir INI formatlı bir sənəddir. Hər bir bölmə ilə yuxarıda göstərilən üç konfiqurasiya dəyişənini təyin etmək olar: aws_access_key_id , aws_secret_access_key , aws_session_token . Bunlar paylaşılan etimadnamə faylında dəstəklənən yeganə dəyərlərdir. Bölmə adlarının AWS CLI konfiqurasiya faylından fərqli olduğunu da unutmayın (

/.aws/config ). AWS CLI konfiqurasiya faylında bir bölmə yaratmaqla yeni bir profil yaradırsınız [profil profil adı] , misal üçün:

Paylaşılan etimadnamə sənədində profillərin əvvəlcəsi göstərilmir profil , misal üçün:

Birincilik¶

Ətraf mühit dəyişənlərindən olan etimadnamələr, paylaşılan etimadnamələrindən və AWS CLI konfiqurasiya sənədindən etibarlıdır. Paylaşılan etimadnamə sənədində göstərilən etimadnamələr AWS CLI konfiqurasiya sənədindəki etimadnamələrdən üstündür. Əgər AWS_PROFILE mühit dəyişəni təyin olunur və AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY mühit dəyişənləri təyin edilir, sonra verilən etimadnamələri AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY tərəfindən təmin edilmiş profildə yerləşən etimadnamələrini ləğv edəcək AWS_PROFILE .

AWS IAM Rollarından istifadə

IAM rolu ilə başlayan bir Amazon EC2 nümunəsindəsinizsə, AWS CLI avtomatik olaraq sizin üçün etimadnaməsini alacaq. Hər hansı bir etimadnaməsini konfiqurasiya etməyə ehtiyac yoxdur.

Əlavə olaraq, AWS CLI -nin üzərinə götürəcəyi bir rol təyin edə bilərsiniz və AWS CLI avtomatik olaraq müvafiq Təsəvvür edin Rol səni çağırır. IAM rollarından istifadə üçün konfiqurasiya dəyişənlərinin yalnız AWS CLI konfiqurasiya faylında ola biləcəyini unutmayın.

AWS CLI konfiqurasiya faylında IAM rolunu konfiqurasiya etmək üçün aşağıdakı konfiqurasiya dəyərlərini təyin edə bilərsiniz:

  • rol_arni - Öhdəsinə götürmək istədiyiniz rolun ARN -si.
  • source_profile - CLI -nin ilkin olaraq istifadə etməli olduğu etimadnaməsini / konfiqurasiyasını ehtiva edən AWS CLI profili rolu götür zəng et. Bu profil istifadə etmək üçün konfiqurasiya edilmiş başqa bir profil ola bilər rolu götür baxmayaraq ki, profildə statik etimadnamələr varsa, onlar üstünlük təşkil edəcəklər. Bu parametr əlavə olaraq verilə bilməz credential_source .
  • credential_source - Başlanğıc üçün etimadnaməsini əldə etmək üçün istifadə edəcək etimadnamə təminatçısı rolu götür zəng et. Bu parametr yanında verilə bilməz mənbə_ profili . Etibarlı dəyərlər bunlardır:
    • Ətraf mühit mənbə etimadnaməsini ətraf mühit dəyişənlərindən çəkmək.
    • Ec2InstanceMetadata mənbə etimadnaməsi kimi EC2 nümunə rolundan istifadə etmək.
    • EcsKonteyner ECS konteyner etimadnaməsini mənbə etimadnaməsi kimi istifadə etmək.

    MFA identifikasiyasına ehtiyacınız yoxdursa, yalnız bir rol_arni və ya a mənbə_ profili və ya a credential_source .

    IAM rolu konfiqurasiyasına malik bir profil göstərdiyiniz zaman AWS CLI Təsəvvür edin Rol müvəqqəti etimadnaməni almaq üçün zəng edin. Bu etimadnamələr sonra saxlanılır (

    /.aws/cli/cache ). Sonrakı AWS CLI əmrləri, müddəti bitənə qədər önbelleğe alınmış müvəqqəti məlumatlardan istifadə edəcək, bu halda AWS CLI etimadnaməsini avtomatik olaraq yeniləyəcək.

    Birini təyin etsəniz mfa_serial , sonra ilk dəfə bir Təsəvvür edin Rol zəng edildikdə, Xarici İşlər Nazirliyinin kodunu daxil etməyiniz istənəcək. Sonrakı əmrlər önbelleğe alınmış müvəqqəti məlumatlardan istifadə edəcək. Ancaq müvəqqəti etimadnamənin müddəti bitdikdə başqa bir Xarici İşlər Nazirliyi kodu istənilir.

    İstifadə olunan nümunə konfiqurasiya source_profile :

    İstifadə edərək nümunə konfiqurasiya credential_source nümunə rolunu, rol çağırışı üçün mənbə etimadnaməsi kimi istifadə etmək:

    Veb Kimliyi ilə Rol götür

    /.aws/config faylında, AWS CLI -nin rol almalı olduğunu göstərmək üçün bir profil də konfiqurasiya edə bilərsiniz. Bunu etdiyiniz zaman, AWS CLI avtomatik olaraq uyğunluq edəcək AssumeRoleWithWebIdentity sizin adınıza AWS STS -ə zənglər.

    IAM rolu konfiqurasiyasına malik bir profil göstərdiyiniz zaman AWS CLI AssumeRoleWithWebIdentity müvəqqəti etimadnaməni almaq üçün zəng edin. Bu etimadnamələr sonra saxlanılır (

    /.aws/cli/cache ). Sonrakı AWS CLI əmrləri, müddəti bitənə qədər önbelleğe alınmış müvəqqəti məlumatlardan istifadə edəcək, bu halda AWS CLI etimadnaməsini avtomatik olaraq yeniləyəcək.

    Paylaşılan konfiqurasiyada veb şəxsiyyət profili ilə bir fərziyyə rolunu konfiqurasiya etmək üçün aşağıdakı konfiqurasiya dəyərlərini təyin edə bilərsiniz:

    • rol_arni - Öhdəsinə götürmək istədiyiniz rolun ARN -si.
    • web_identity_token_file - Kimlik təminatçısı tərəfindən təmin edilən bir OAuth 2.0 giriş nişanı və ya OpenID Connect ID nişanı olan bir fayl yolu. Bu faylın məzmunu yüklənəcək və WebIdentityToken arqumenti AssumeRoleWithWebIdentity əməliyyat.
    • rol_sessiyası_ adı - Bu fərziyyə rolu sessiyasına tətbiq olunan ad. Bu dəyər, qəbul edilən rol istifadəçisi ARN-ni təsir edir (məsələn, arn: aws: sts :: 123456789012: guessed-role/role_name/role_session_name). Bu xəritəni Rol Sessiyası Adı -də olan parametr AssumeRoleWithWebIdentity əməliyyat. Bu isteğe bağlı bir parametrdir. Bu dəyəri verməsəniz, bir seans adı avtomatik olaraq yaradılacaq.

    Aşağıda, veb kimlik profili ilə bir fərziyyə rolunu konfiqurasiya etmək üçün lazım olan minimum miqdarda konfiqurasiya nümunəsi verilmişdir:

    Bu provayder də mühit vasitəsilə konfiqurasiya edilə bilər:

    AWS_ROLE_ARN Öhdəsinə götürmək istədiyiniz rolun ARN -si. AWS_WEB_IDENTITY_TOKEN_FILE Veb şəxsiyyət nişanı faylına gedən yol. AWS_ROLE_SESSION_NAME Bu fərziyyə rolu sessiyasına tətbiq olunan ad.

    Bu mühit dəyişənləri hal -hazırda yalnız veb şəxsiyyət təminatçısı ilə əlaqəli rola aiddir və ümumi fərz rolu təminatçısının konfiqurasiyasına tətbiq edilmir.

    Xarici Proseslərdən Etimadnamə Alınması¶

    Aşağıda xarici bir prosesdən etimadnamə əldə etmək üsulu təsvir edilmişdir. Bu təhlükəli ola bilər, buna görə ehtiyatla hərəkət edin. Mümkünsə digər etimadnamə təminatçılarına üstünlük verilməlidir. Bu seçimdən istifadə edirsinizsə, əməliyyat sisteminiz üçün ən yaxşı təhlükəsizlik təcrübələrini istifadə edərək konfiqurasiya faylının mümkün qədər kilidli olduğundan əmin olmalısınız. Xüsusi etimadnamə vasitənizin StdErr -ə heç bir gizli məlumat yazmadığından əmin olun, çünki SDK -lar və CLI bu məlumatları icazəsiz istifadəçilərə ifşa etməklə ələ keçirə və daxil edə bilərlər.

    AWS CLI -də qurulmamış etimadnamə mənbələri əldə etmək üsulunuz varsa, onu istifadə edərək inteqrasiya edə bilərsiniz. credential_process konfiqurasiya sənədində. AWS CLI, bu əmri verildiyi kimi çağıracaq və sonra stdout -dan json məlumatlarını oxuyacaq. Proses, etimadnaməsini stdout -a aşağıdakı formatda yazmalıdır:

    The Versiya açarı təyin edilməlidir 1 . Yük dəyərinin quruluşu inkişaf etdikcə bu dəyər zamanla çarpıla bilər.

    The İstifadə müddəti açarı ISO8601 formatlı zaman damgasıdır. Əgər İstifadə müddəti açar stdout -da qaytarılmır, etimadnamələri yeniləməyən uzun müddətli etimadnamələrdir. Əks təqdirdə, etimadnamələri yenilənə bilən etimadnaməsi hesab olunur və avtomatik olaraq yenilənir. QEYD: Vəzifə etimadnaməsindən fərqli olaraq, AWS CLI proses etimadnamələrini KEÇMƏZ. Önbelleğe ehtiyac varsa, xarici prosesdə tətbiq olunmalıdır.

    Proses, etimadnaməsini alarkən bir xətanın baş verdiyini göstərmək üçün sıfır olmayan bir RC-ni geri qaytara bilər.

    Müvafiq etimadnamələrini əldə etmək üçün bəzi proses təminatçılarının əlavə məlumatlara ehtiyacı ola bilər. Bu əmr satırı arqumentləri vasitəsilə edilə bilər. Qeyd: eyni maşında işləyən proses üçün əmr satırı seçimləri görünə bilər.


    Kod #4: Mövcud __dir () __ metodu ilə İstifadəçi tərəfindən müəyyən edilmiş – Sinif Obyekti parametr olaraq ötürülür.

    • The dir () öz istifadə dəstinə malikdir. Ümumiyyətlə üçün istifadə olunur ayıklama məqsədləri sadə gündəlik proqramlarda və hətta inkişaf etdiricilər qrupu tərəfindən qəbul edilən böyük layihələrdə. Dir () - in keçdiyi parametrin bütün atributlarını sadalamaq qabiliyyəti, bir çox sinif və funksiyanı ayrıca idarə edərkən həqiqətən faydalıdır.
    • The dir () funksiyası bir modul/siyahı/lüğət üçün bütün mövcud atributları da sıralaya bilər. Beləliklə, bizə mövcud siyahı və ya modulla edə biləcəyimiz əməliyyatlar haqqında da məlumat verir, bu da modul haqqında az və ya çox məlumat olmadığı zaman çox faydalı ola bilər. Həm də yeni modulları daha sürətli öyrənməyə kömək edir.

    Diqqət geek! İlə təməllərinizi gücləndirin Python Proqramlaşdırma Vəqfi Kurs edin və əsasları öyrənin.

    Başlamaq üçün müsahibə hazırlıqlarınız ilə Məlumat Strukturları anlayışlarınızı artırın Python DS Kurs. Maşın Öyrənmə Səyahətinizlə başlamaq üçün Maşın Öyrənmə – Əsas Səviyyə Kursu


    Daxil etmə funksiyaları?

    Tez -tez sual yaranır: Funksiyaları Nest edə bilərikmi (bir funksiyanın kodunu başqa bir funksiyaya yerləşdirə bilərik)? Cavab səslidir: YOX!

    Qeyd etmək lazımdır ki, biz bacarmaq bir funksiyanın içərisində digər funksiyaları istifadə edin (çağırın), ancaq orada yeni bir funksiyanın reseptini yarada bilmərik.

    Qeyd: Təəssüf ki, girinti və sintaksisimizə diqqətsiz yanaşdığımız zaman bu sual tez -tez ortaya çıxır təsadüfən ikinci funksiyamızı birinci funksiyamızın içərisinə qoyaraq ilk funksiyamızı kompüterə bağlamağı unutmayın:


    Məsələn, növbəti proqram iki dəyərin ikisini əvəz edir:

    1. İki tam ədəd göstəricisi parametr olaraq götürən və çağırıldıqda hər hansı bir dəyəri qaytaran iki dəyişən dəyərin dəyişdirilməsindən məsul olan funksiyanı elan edirik.
    2. Əsas funksiyada iki tamsayı dəyişəni ('m' və 'n') elan edirik və işə salırıq, sonra dəyərlərini müvafiq olaraq çap edirik.
    3. İki dəyişənin ünvanını ampersand simvolundan istifadə edərək arqument olaraq ötürərək swap () funksiyasını çağırırıq. Bundan sonra, dəyişənlərin yeni dəyişdirilmiş dəyərlərini çap edirik.
    4. Burada iki tamsayı dəyişən ünvanını parametr olaraq qəbul edən swap () funksiyası məzmununu təyin edirik və ikinci dəyişənə qoyulacaq dəyər dəyişənlərindən birini saxlamaq üçün üçüncü saxlama qutusu olaraq istifadə olunan müvəqqəti tamsayı dəyişən elan edirik.
    5. 'A' ilə işarələnən ilk dəyişənin məzmununu müvəqqəti dəyişəndə ​​qeyd edin.
    6. B ilə işarələnmiş ikinci dəyişəni a ilə işarə edən birinci dəyişkəndə saxlayın.
    7. İkinci dəyişəni (b işarəsi ilə) müvəqqəti dəyişkəndə saxlanılan birinci dəyişənin dəyəri ilə yeniləyin.

    Array Parametrləri ilə işləyən funksiyalar

    C -də bir dəyərə görə bir sıra funksiyaya keçə bilmərik. Halbuki, bir sıra adı bir göstəricidir (ünvan), buna görə bir sıra adını göstərici funksiyasına ötürmək deməkdir.

    Məsələn, aşağıdakı proqramı nəzərdən keçiririk:

    Burada proqram kodunu detalları ilə izah edəcəyik

    1. Elementləri olan bir sıra ünvanı (göstərici) alan və bu elementlərin ümumi yığılmış cəmini qaytaran add_array () funksiyasını elan edirik və təyin edirik. Göstərici, massiv elementlərini təkrarlamaq üçün istifadə olunur (p [k] işarəsini istifadə etməklə) və ümumiləşdirmə element elementini təkrarladıqdan sonra qaytarılacaq yerli dəyişəndə ​​toplanır.
    2. Beş ədəd elementi olan bir tamsayı silsiləsini elan edirik və işə salırıq. Dizinin adını (ünvan kimi işləyən) və serialın ölçüsünü ötürərək ümumi məbləği çap edirik add_array ()arqument kimi funksiya deyilir.

    Array qaytaran funksiyalar

    C -də, aşağıdakı proqramda olduğu kimi bir göstəricini bir sıra geri qaytara bilərik:

    Və burada proqramın detallarını müzakirə edəcəyik

    1. Tam ədəd olan bir sıra ünvanını qaytaran və heç bir arqument götürməyən bir funksiyanı təyin edirik və elan edirik.
    2. Funksiya çağırıldıqdan sonra qurulmuş tam massivi alan bir tam ədəd göstəricisi elan edirik və bütün beş elementli massivi təkrar edərək məzmununu çap edirik.

    Diqqət yetirin ki, funksiya tərəfindən qaytarılmış sıra ünvanını saxlamaq üçün bir sıra deyil, bir göstərici təyin olunur. Həm də nəzərə alın ki, bir yerli dəyişən bir funksiyadan qaytarılanda onu funksiyada statik elan etməliyik.

    Funksiya Göstəriciləri

    Göstəricilərin hər hansı bir yaddaş yerindəki bir ünvana işarə etdiyini bildiyimiz kimi, icra olunan kodun əvvəlində də yaddaşdakı funksiyalar olaraq göstərə bilərlər.

    Funksiyaya işarə * ilə elan edilir, onun bəyannaməsinin ümumi ifadəsi belədir:

    (*Function_name) ətrafındakı mötərizələrin vacib olduğunu xatırlamalısınız, çünki onlar olmadan tərtibçi, function_name -nin return_type göstəricisi qaytardığını düşünür.

    Göstəricini təyin etdikdən sonra onu bir funksiyaya təyin etməliyik. Məsələn, növbəti proqram adi bir funksiya elan edir, bir funksiya göstəricisi təyin edir, funksiya göstəricisini adi funksiyaya təyin edir və bundan sonra göstərici vasitəsilə funksiyanı çağırır:

    1. Funksiya çağırıldıqda parametr dəfə ilə göstərilən k dəfə Hi mətni yazdıran standart bir funksiya təyin edirik və elan edirik
    2. Bir tamsayı parametri alan və heç bir şey qaytarmayan bir göstərici funksiyasını (xüsusi bəyannaməsi ilə) təyin edirik.
    3. Göstərici funksiyamızı Hi_function ilə işə salırıq, yəni göstərici Hi_function () işarəsini göstərir.
    4. Funksiya adını arqumentlərlə yazaraq standart funksiya çağırmaqdansa, 3 rəqəmini arqument olaraq ötürərək yalnız göstərici funksiyasına zəng edirik və bu da budur!

    Unutmayın ki, funksiya adı, icra olunan kodun başlanğıc ünvanını ilk elementini göstərən bir sıra adı kimi göstərir. Buna görə function_ptr = & ampHi_function və (*funptr) (3) kimi təlimatlar doğrudur.

    QEYD: Funksiyanın təyin edilməsi və funksiya çağırışı zamanı ünvan operatorunu & amp və dolayı operatoru * daxil etmək vacib deyil.

    Funksiya Göstəriciləri Dizisi

    Növbəti proqramda olduğu kimi bir sıra funksiya göstəriciləri qərar vermək üçün bir keçid və ya if ifadəsi rolunu oynaya bilər:

    Burada proqramın detallarını müzakirə edirik:

    1. İki tam arqument götürən və tam ədəd qaytaran dörd funksiyanı elan edirik və təyin edirik. Bu funksiyalar istifadəçi tərəfindən hansı funksiyanın çağırıldığı ilə bağlı iki arqumenti əlavə edir, çıxarır, çoxaldır və bölür.
    2. Operandları, əməliyyat növünü və nəticəni idarə etmək üçün 4 tam ədəd elan edirik. Ayrıca, dörd funksiya göstəricisi olan bir sıra elan edirik. Array elementinin hər bir funksiya göstəricisi iki tamsayı parametri alır və tam ədəd qaytarır.
    3. Hər bir sıra elementini artıq elan edilmiş funksiya ilə təyin edirik və işə salırıq. Məsələn, üçüncü funksiya göstəricisi olan üçüncü element vurma əməliyyat funksiyasına işarə edəcək.
    4. Klaviatura ilə yazılmış istifadəçidən operandları və əməliyyat növünü axtarırıq.
    5. Müvafiq arqument elementi (Function pointer) arqumentləri ilə çağırdıq və müvafiq funksiyanın yaratdığı nəticəni saxlayırıq.

    İnt (*ope [4]) (int, int) əmri funksiya göstəricilərini müəyyən edir. Hər bir sıra elementi eyni parametrlərə və qaytarılma tipinə malik olmalıdır.

    Nəticə = ope [seçim] (x, y) ifadəsi istifadəçinin etdiyi seçimə uyğun olaraq müvafiq funksiyanı yerinə yetirir. Daxil edilmiş iki ədəd funksiyaya verilən arqumentlərdir.

    Boşluq Göstəricilərindən istifadə edən funksiyalar

    Boşluq göstəriciləri funksiya elanları zamanı istifadə olunur. İstənilən növü qaytarmaq üçün void * qaytarma növü icazələrindən istifadə edirik. Bir funksiyaya keçərkən parametrlərimizin dəyişmədiyini düşünsək, onu const elan edirik.

    Aşağıdakı proqramı nəzərdən keçirin:

    Burada proqramın detallarını müzakirə edəcəyik:

    1. Tam bir dəyər qaytaran və müəyyən bir məlumat növü olmadan dəyişməz bir dəyişənin ünvanını alan bir funksiyanı təyin edirik və elan edirik. Num göstəricisi ilə göstərilən məzmun dəyişəninin (x) kub dəyərini hesablayırıq və boş bir göstərici olduğu üçün onu xüsusi bir notation (* datatype) göstəricisi istifadə edərək bir tamsayı məlumat tipinə yazmalıyıq və geri qayıdırıq. kub dəyəri.
    2. Operand və nəticə dəyişənini elan edirik. Ayrıca, operandımızı "4" dəyəri ilə işə salırıq.
    3. Operand ünvanını ötürərək kub funksiyasını çağırırıq və nəticə dəyişənində qaytarılan dəyəri idarə edirik

    Arqument kimi funksiya göstəriciləri

    Bir funksiya göstəricisini başqa bir funksiyaya arqument olaraq ötürərək istismar etməyin başqa bir yolu, bəzən "geri çağırma funksiyası" adlanır, çünki qəbuledici funksiya "onu geri çağırır".

    • void *base: massivə void göstəricisi.
    • size_t num: sıra element nömrəsi.
    • size_t width Element ölçüsü.
    • int ( *müqayisə (const void *, const void *): funksiya göstəricisi iki arqumentdən ibarətdir və arqumentlər eyni dəyərə malik olduqda 0 qaytarır, arg1 arg2 -dən əvvəl gəldikdə & lt0, arg1 arg2 -dən sonra gəldikdə & gt0.

    Aşağıdakı proqram qsort () funksiyasından istifadə edərək tamsayılar massivini kiçikdən böyükə qədər sıralayır:


    2 Cavab 2

    Hər şeyi düzgün edirsiniz, ancaq bunun işləməsi üçün sinfi .ino faylınızın xaricinə daşımalısınız. Arduino IDE -nin niyə bunu etməsinə səbəb olduğunu bilmirəm (redaktəyə baxın), amma əvvəllər qarşılaşdığım bir şeydir.

    Bunu yalnız sınaqdan keçirdim və sinif bəyannaməsini ino xaricində və layihə qovluğunda bir başlıq sənədinə köçürmək, düzgün tərtib edilməsini təmin edir. Yenidən "String" ə daxil olmaq üçün inoya etdiyiniz başlığı daxil etməyi və başlığa "Arduino.h" daxil etməyi unutmayın.

    Texniki olaraq, yalnız bir sinifin ilkin bəyannaməsinin fərqli bir faylda olması lazımdır.

    Nədən baş verdiyindən əminəm ki, IDE, sinif tərifinizdən əvvəl yerləşdirilən sinif deyil, bütün funksiyalarınız üçün irəli bəyannamələr yaradır. Bu o deməkdir ki, IDE -nin "atma ()" ilə istifadə etdiyi regex funksiyasını pozmaq probleminizi həll edir. misal üçün:


    Funksiyalar vahidi

    Şərhlər

    Cəbr Araşdırmalarınızda Daha çox yardıma ehtiyacınız varmı?

    Yüzlərlə video nümunəsinə daxil olun və abunəliyinizlə bağlı problemlərlə məşğul olun!  

    Əlverişli abunə seçimlərimiz haqqında daha çox məlumat üçün bura vurun.

    Abunə olmağa hazır deyilsiniz?   PULSUZ Cəbr Təkmilləşdirmə kursumuza qeydiyyatdan keçin.

    CƏBİR SINIFI E-KURS ÜYƏLƏRİ

    Cəbr Sınıfı e-kurslarımız haqqında daha çox məlumat üçün bura vurun.


    Videoya baxın: Windows10 - bu il qəbula nələr düşəcək?