คำถามติดแท็ก function-pointers

ตัวชี้ฟังก์ชันคือตัวชี้ไปยังฟังก์ชันซึ่งสามารถเก็บไว้ในตัวแปรได้ ช่วยให้สามารถเลือกเวลาทำงานได้ว่าจะเรียกใช้ฟังก์ชันใด

11
พอยน์เตอร์ของฟังก์ชันใน C ทำงานอย่างไร
ฉันมีประสบการณ์เมื่อเร็ว ๆ นี้กับตัวชี้ฟังก์ชั่นใน C. ดังนั้นด้วยประเพณีการตอบคำถามของคุณเองฉันจึงตัดสินใจสรุปพื้นฐานเบื้องต้นเล็กน้อยสำหรับผู้ที่ต้องการดำน้ำแบบด่วนในเรื่อง
1232 c  function-pointers 


21
ตัวทดแทนฟังก์ชันที่ใกล้ที่สุดใน Java คืออะไร
ฉันมีวิธีที่เกี่ยวกับโค้ดสิบบรรทัด ฉันต้องการสร้างวิธีการเพิ่มเติมที่ทำสิ่งเดียวกันยกเว้นการคำนวณขนาดเล็กที่จะเปลี่ยนรหัสหนึ่งบรรทัด นี่เป็นแอปพลิเคชั่นที่สมบูรณ์แบบสำหรับการส่งผ่านตัวชี้ฟังก์ชันเพื่อแทนที่หนึ่งบรรทัด แต่ Java ไม่มีตัวชี้ฟังก์ชัน ทางเลือกที่ดีที่สุดของฉันคืออะไร

8
“ เปิดออก” tuple เพื่อเรียกตัวชี้ฟังก์ชั่นการจับคู่
ฉันพยายามที่จะเก็บในstd::tupleจำนวนที่แตกต่างกันของค่าซึ่งในภายหลังจะใช้เป็นข้อโต้แย้งสำหรับการโทรไปยังตัวชี้ฟังก์ชั่นที่ตรงกับประเภทที่เก็บไว้ ฉันได้สร้างตัวอย่างแบบง่าย ๆ ที่แสดงปัญหาที่ฉันพยายามแก้ไข: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to …

7
ทำความเข้าใจกับ typedefs สำหรับพอยน์เตอร์ของฟังก์ชันใน C
ฉันมักจะนิ่งงันอยู่เสมอเมื่อฉันอ่านรหัสของคนอื่นซึ่งมี typedefs สำหรับตัวชี้ไปยังฟังก์ชันที่มีอาร์กิวเมนต์ ฉันจำได้ว่ามันต้องใช้เวลาสักพักกว่าจะได้คำนิยามดังกล่าวในขณะที่พยายามทำความเข้าใจกับอัลกอริธึมเชิงตัวเลขที่เขียนด้วย C เมื่อไม่นานมานี้ ดังนั้นคุณสามารถแบ่งปันเคล็ดลับและความคิดของคุณเกี่ยวกับวิธีเขียน typedefs ที่ดีสำหรับตัวชี้ไปยังฟังก์ชัน (Do's and Do's Do) ทำไมพวกเขาถึงมีประโยชน์และทำความเข้าใจงานของผู้อื่นได้อย่างไร ขอบคุณ!

3
เหตุใดคำจำกัดความของฟังก์ชันพอยน์เตอร์จึงทำงานกับเครื่องหมาย '&' หรือเครื่องหมายดอกจัน '*' จำนวนเท่าใดก็ได้
ทำไมงานต่อไปนี้ void foo() { cout << "Foo to you too!\n"; }; int main() { void (*p1_foo)() = foo; void (*p2_foo)() = *foo; void (*p3_foo)() = &foo; void (*p4_foo)() = *&foo; void (*p5_foo)() = &*foo; void (*p6_foo)() = **foo; void (*p7_foo)() = **********************foo; (*p1_foo)(); (*p2_foo)(); (*p3_foo)(); (*p4_foo)(); (*p5_foo)(); (*p6_foo)(); (*p7_foo)(); }
216 c++  c  function-pointers 

8
การส่งแลมบ์ดาเป็นตัวชี้ฟังก์ชัน
เป็นไปได้ไหมที่จะส่งผ่านฟังก์ชัน lambda เป็นตัวชี้ฟังก์ชัน ถ้าเป็นเช่นนั้นฉันจะต้องทำสิ่งที่ไม่ถูกต้องเพราะฉันได้รับข้อผิดพลาดในการรวบรวม ลองพิจารณาตัวอย่างต่อไปนี้ using DecisionFn = bool(*)(); class Decide { public: Decide(DecisionFn dec) : _dec{dec} {} private: DecisionFn _dec; }; int main() { int x = 5; Decide greaterThanThree{ [x](){ return x > 3; } }; return 0; } เมื่อฉันพยายามรวบรวมสิ่งนี้ฉันได้รับข้อผิดพลาดในการรวบรวมดังต่อไปนี้: In function 'int main()': 17:31: error: the value …

13
C ไม่ใช่เรื่องยาก: void (* (* f []) ()) ()
ฉันเพิ่งเห็นภาพวันนี้และคิดว่าฉันชอบคำอธิบาย ดังนั้นนี่คือภาพ: ฉันพบว่ามันสับสนและสงสัยว่ารหัสดังกล่าวเป็นประโยชน์ ฉันไปที่รูปภาพและพบรูปภาพอื่นในรายการ reddit นี้และนี่คือรูปภาพนั้น: ดังนั้น "การอ่านแบบวน" นี้เป็นสิ่งที่ถูกต้อง? นี่เป็นวิธีคอมไพเลอร์ของ C หรือไม่? มันคงจะดีถ้ามีคำอธิบายที่ง่ายกว่าสำหรับโค้ดแปลก ๆ นี้ นอกจากรหัสประเภทนี้จะมีประโยชน์หรือไม่ ถ้าเป็นเช่นนั้นที่ไหนและเมื่อไหร่? มีคำถามเกี่ยวกับ "กฎส่วนก้นหอย" แต่ฉันไม่เพียงแค่ถามว่ามันถูกนำไปใช้อย่างไรหรือวิธีการอ่านนิพจน์ที่มีกฎนั้น ฉันกำลังถามถึงการใช้ความถูกต้องของนิพจน์และกฎของเกลียวเช่นกัน เกี่ยวกับสิ่งเหล่านี้คำตอบที่ดีมีการโพสต์แล้ว

17
ฟังก์ชั่นการโทรกลับใน Java
มีวิธีการส่งผ่านฟังก์ชั่นโทรกลับในวิธีการจาวาหรือไม่? พฤติกรรมที่ฉันพยายามเลียนแบบคือ. Net Delegate ที่ถูกส่งผ่านไปยังฟังก์ชัน ฉันเคยเห็นผู้คนแนะนำให้สร้างวัตถุแยกต่างหาก แต่ดูเหมือนว่ามีราคาเกินจริง แต่ฉันรู้ว่าบางครั้งการเติมเต็มเป็นวิธีเดียวที่จะทำสิ่งต่าง ๆ

6
การใช้วัตถุมาตรฐานทั่วไป :: ฟังก์ชั่นที่มีฟังก์ชั่นสมาชิกในชั้นหนึ่ง
สำหรับคลาสหนึ่งฉันต้องการเก็บพอยน์เตอร์ของฟังก์ชั่นบางส่วนไว้ในฟังก์ชั่นสมาชิกของคลาสเดียวกันในวัตถุที่mapเก็บหนึ่งstd::functionอัน แต่ฉันล้มเหลวในตอนแรกด้วยรหัสนี้: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; ฉันจะได้รับerror C2064: term does not evaluate to a function taking 0 argumentsในการxxcallobjรวมกับข้อผิดพลาดบาง instantiation แม่แบบแปลก ๆ ขณะนี้ฉันกำลังทำงานกับ Windows 8 ด้วย Visual Studio 2010/2011 และใน Win 7 ด้วย VS10 ก็ล้มเหลวเช่นกัน ข้อผิดพลาดจะต้องขึ้นอยู่กับกฎ C …


2
รหัส C ที่พิมพ์จาก 1 ถึง 1,000 โดยไม่มีลูปหรือคำสั่งแบบมีเงื่อนไขทำงานอย่างไร
ฉันพบCรหัสที่พิมพ์จาก 1 ถึง 1,000 โดยไม่มีลูปหรือเงื่อนไข : แต่ฉันไม่เข้าใจวิธีการทำงาน ทุกคนสามารถอ่านรหัสและอธิบายแต่ละบรรทัดได้หรือไม่ #include <stdio.h> #include <stdlib.h> void main(int j) { printf("%d\n", j); (&main + (&exit - &main)*(j/1000))(j+1); }

11
ตัวชี้ฟังก์ชั่นใน Java
นี่อาจเป็นสิ่งที่ธรรมดาและน่ารำคาญ แต่ดูเหมือนว่าฉันมีปัญหาในการหาคำตอบที่เป็นรูปธรรม ใน C # มีแนวคิดของผู้ได้รับมอบหมายซึ่งเกี่ยวข้องอย่างยิ่งกับแนวคิดของตัวชี้ฟังก์ชั่นจาก C ++ มีฟังก์ชั่นที่คล้ายกันใน Java หรือไม่? เนื่องจากพอยน์เตอร์ขาดหายไปวิธีที่ดีที่สุดเกี่ยวกับเรื่องนี้คืออะไร และเพื่อความชัดเจนเรากำลังพูดถึงชั้นหนึ่งที่นี่

14
เหตุใดตัวชี้ฟังก์ชันและตัวชี้ข้อมูลจึงไม่เข้ากันใน C / C ++
ฉันได้อ่านพบว่าการแปลงตัวชี้ฟังก์ชันเป็นตัวชี้ข้อมูลและในทางกลับกันใช้งานได้กับแพลตฟอร์มส่วนใหญ่ แต่ไม่รับประกันว่าจะใช้งานได้ เหตุใดจึงเป็นเช่นนี้ ทั้งสองไม่ควรเป็นเพียงที่อยู่ในหน่วยความจำหลักดังนั้นจึงเข้ากันได้?

9
ฉันจะส่งผ่านฟังก์ชันสมาชิกที่คาดว่าจะมีฟังก์ชันฟรีได้อย่างไร
คำถามมีดังต่อไปนี้: พิจารณาโค้ดส่วนนี้: #include <iostream> class aClass { public: void aTest(int a, int b) { printf("%d + %d = %d", a, b, a + b); } }; void function1(void (*function)(int, int)) { function(1, 1); } void test(int a,int b) { printf("%d - %d = %d", a , b , a - …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.