คำถามติดแท็ก c

C เป็นภาษาโปรแกรมคอมพิวเตอร์ทั่วไปที่ใช้สำหรับระบบปฏิบัติการเกมและงานที่มีประสิทธิภาพสูงอื่น ๆ

3
การเขียนเมื่อเริ่มต้นไฟล์เป็นสิ่งที่คุณจะรู้ได้ในตอนท้าย
แบ็คกราวน์:ฉันกำลังเขียนรหัสคอนโทรลเลอร์ไมโครคอนโทรลเลอร์เพื่อเขียนไฟล์ EBML EBML เปรียบเสมือนไบนารี XML ที่มีองค์ประกอบซ้อนกัน แต่แทนที่จะเป็นแท็กเริ่มต้นและแท็กสิ้นสุดจะมี ID เริ่มต้นความยาวและข้อมูล ฉันกำลังเขียนสิ่งนี้ลงในแฟลชภายนอกในแอปพลิเคชันพลังงานต่ำดังนั้นฉันจึงต้องการให้แฟลชเข้าถึงน้อยที่สุด หน่วยความจำยังมี จำกัด เพราะไม่มีอะไรง่าย เมื่อฉันสามารถเก็บองค์ประกอบ EBML ทั้งหมดไว้ในหน่วยความจำจากนั้นสร้างเป็นเรื่องง่ายเพราะฉันสามารถย้อนกลับและเติมความยาวของแต่ละองค์ประกอบหลังจากที่ฉันรู้ว่าความยาวนั้นคืออะไร ปัญหาคือสิ่งที่ต้องทำเมื่อฉันไม่สามารถเก็บองค์ประกอบทั้งหมดไว้ในหน่วยความจำได้ ตัวเลือกที่ฉันเห็นคือ: เขียนสิ่งที่ฉันรู้แล้วย้อนกลับไปและเพิ่มความยาว (ง่ายที่สุด แต่เพิ่มการเข้าถึงแฟลชมากกว่าที่ฉันต้องการ) คำนวณความยาวของแต่ละองค์ประกอบก่อนเริ่มเขียน (ค่อนข้างง่าย แต่ใช้เวลาประมวลผลนาน) สลับโหมดเมื่อหน่วยความจำของฉันเต็มดังนั้นฉันจะดำเนินการต่อผ่านข้อมูล แต่เพียงเพื่อคำนวณความยาวขององค์ประกอบที่จองไว้แล้วในหน่วยความจำ จากนั้นเขียนสิ่งที่ฉันมีอยู่ในหน่วยความจำแล้วย้อนกลับไปประมวลผลข้อมูลต่อจากที่ค้างไว้ (ตัวเลือกที่ฉันชอบจนถึงตอนนี้) ให้องค์ประกอบความยาวกรณีสูงสุดหรือเลวร้ายที่สุดเมื่อพวกเขาต้องการที่จะเขียนและยังไม่ทราบความยาวสุดท้ายของพวกเขา (ง่ายกว่าด้านบน แต่อาจย้อนกลับและเสียพื้นที่) คำถาม:ดูเหมือนว่าสิ่งนี้น่าจะเป็นปัญหาที่คนทั่วไปคิดถึง ฉันรู้ว่ามันสามารถเกิดขึ้นได้เมื่อสร้าง data packets มีเทคนิคที่ดีขึ้น / มากกว่า / ที่ยอมรับมากกว่าฉันหายไปหรือเปล่า หรือเพียงแค่คำบางคำสำหรับปัญหาที่ฉันสามารถค้นหาได้

1
การห่อตามปกติของ C ++ เทมเพลตประเภท API ใน C
ฉันกำลังทำงานกับการห่อ C ++ API ซึ่งให้การเข้าถึงแหล่งข้อมูล (Hazelcast) ในฟังก์ชัน C เพื่อให้ที่เก็บข้อมูลสามารถเข้าถึงได้จากรหัส C เท่านั้น Hazelcast C ++ API สำหรับโครงสร้างข้อมูลแผนที่มีลักษณะดังนี้: auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); มันใช้ประโยชน์จากประเภทแม่แบบkeyและvalueพารามิเตอร์ เนื่องจากไม่มีเทมเพลตใน C ฉันจึงคิดเกี่ยวกับการสร้างฟังก์ชั่น wrapper สำหรับแต่ละความเชี่ยวชาญของgetMap<T, U>วิธี นั่นคือสำหรับแต่ละประเภท C แม้ว่าฉันรู้ว่ามีsignedและunsignedรุ่นของประเภท C, ฉันดีกับการ จำกัด API เพื่อสนับสนุนเฉพาะint, double, float, char *สำหรับและkeyvalue ดังนั้นฉันจึงเขียนสคริปต์ขนาดเล็กที่สร้างชุดค่าผสมทั้งหมดโดยอัตโนมัติ ฟังก์ชั่นที่ส่งออกมีลักษณะเช่นนี้: int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char …
9 c++  c  api-design 

1
ธนาคารใช้อะไรเป็นประเภทข้อมูลเพื่อเงิน [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันตระหนักถึงตัวเลือกที่ดีบางอย่าง : จำนวนเต็มขนาดใหญ่ (เช่น int64_t, mpz_t, bignum libใด ๆ) เพื่อเป็นตัวแทนเซ็นต์หรือ 10 -nเซนต์ - พูดจำนวนเต็มแทน 1/100 ของเงิน ($ 1.05 == 10500) นี้เรียกว่าจำนวนเต็มปรับขนาด ไลบรารีระดับสูงสำหรับเลขทศนิยมทศนิยมที่มีความแม่นยำเช่นBigDecimalใน Java, Decimal ใน Python, decimal.js ใน Javascript, boost :: multiprecision ใน C ++ เงื่อนไข BCD ที่อัดแน่น (ทศนิยมด้วยรหัสไบนารี) เป็นวิธีที่ลึกลับกว่าซึ่งดูเหมือนจะเป็นที่นิยมในซอฟต์แวร์เก่า อ่าน เพิ่มเติม เกี่ยวกับเรื่องนี้ …

3
การปรับขนาดของตัวแปร“ จริง” มีประโยชน์อย่างไร?
สิ่งหนึ่งที่ทำให้ฉันรู้สึกว่าคุณสมบัติเชิงบวกของ C (จริง ๆ แล้วการใช้งานเช่น gcc, clang, ... ) คือความจริงที่ว่ามันไม่ได้เก็บข้อมูลที่ซ่อนอยู่ถัดจากตัวแปรของคุณที่รันไทม์ โดยสิ่งนี้ฉันหมายความว่าหากคุณต้องการตัวแปร "x" ของประเภท "uint16_t" คุณสามารถมั่นใจได้ว่า "x" จะใช้พื้นที่ 2 ไบต์เท่านั้น (และจะไม่นำข้อมูลที่ซ่อนอยู่เช่นประเภท ฯลฯ มาใช้) .) ในทำนองเดียวกันถ้าคุณต้องการอาเรย์ของจำนวนเต็ม 100 จำนวนเต็มคุณอาจมั่นใจได้ว่ามันมีขนาดใหญ่เท่ากับจำนวนเต็ม 100 ตัว แต่ยิ่งฉันพยายามที่จะเกิดขึ้นกับกรณีการใช้งานที่เป็นรูปธรรมสำหรับคุณลักษณะนี้มากขึ้นผมกำลังสงสัยว่าถ้าเป็นจริงมีใด ๆข้อได้เปรียบในทางปฏิบัติที่ทุกคน สิ่งเดียวที่ฉันสามารถขึ้นมาเพื่อให้ห่างไกลก็คือว่ามันเห็นได้ชัดว่าต้องการ RAM น้อย สำหรับสภาพแวดล้อมที่ จำกัด เช่นชิป AVR เป็นต้นนี่เป็นข้อดีอย่างมาก แต่สำหรับกรณีการใช้งานเดสก์ท็อป / เซิร์ฟเวอร์ทุกวันดูเหมือนว่าจะไม่เกี่ยวข้องเลย ความเป็นไปได้อีกอย่างหนึ่งที่ฉันคิดคืออาจเป็นประโยชน์ / สำคัญสำหรับการเข้าถึงฮาร์ดแวร์หรืออาจทำแผนที่ภูมิภาคของหน่วยความจำ (เช่นสำหรับเอาต์พุต VGA และอื่น ๆ ) ... …

5
การประกาศตัวแปรที่ผันแปรหมายความว่าอย่างไร
โปรแกรมในระดับต่ำจำนวนมากใช้คำระเหยชนิดสำหรับการทำแผนที่หน่วยความจำและดังกล่าว แต่ฉันเรียงลำดับของการสับสนว่าสิ่งที่มันจริงๆจะอยู่ในพื้นหลัง กล่าวอีกนัยหนึ่งหมายความว่าอย่างไรเมื่อคอมไพเลอร์ไม่ "เพิ่มประสิทธิภาพ" ที่อยู่หน่วยความจำ
9 c++  c  low-level 

8
อะไรทำให้ C หยุดการคอมไพล์ / ตีความ / JIT'ed?
Java นั้นได้รับการยกย่องในเรื่องของการพกพาที่น่าทึ่งซึ่งฉันเข้าใจว่าเป็นเพราะ JVM คำถามของฉันคือสิ่งที่ห้ามไม่ให้ C ถูกคอมไพล์ / ตีความ / JIT'ed .. ถ้าเป็นเช่นนั้น C สามารถเขียนได้หนึ่งครั้งและทำให้มันทำงานบนอุปกรณ์ที่คุณเคยมี แต่นี่ไม่ใช่กลไกที่เป็นที่นิยมสำหรับการประมวลผลโปรแกรม C อะไรคือข้อเสียของการประมวลผล C ด้วยวิธีนี้และอะไรคือข้อดีของการประมวลผล Java ด้วยวิธีนี้และไม่ได้รวบรวมรหัสเครื่องนอกเหนือจากความสามารถในการพกพาของหลักสูตร?

4
การละเว้น“ destructors” ใน C กำลังทำให้ YAGNI อยู่ไกลเกินไปใช่ไหม
ฉันกำลังทำงานกับแอพพลิเคชั่นแบบฝังตัวขนาดกลางใน C โดยใช้เทคนิคแบบ OO "คลาส" ของฉันคือโมดูล. h / .c โดยใช้ data structs และ function pointers structs เพื่อเลียนแบบ encapsulation, polymorphism และการฉีดพึ่งพา ตอนนี้ใคร ๆ ก็คาดหวังว่าmyModule_create(void)ฟังก์ชั่นจะมาพร้อมกับmyModule_destroy(pointer)คู่ แต่โครงการที่ถูกฝังอยู่นั้นทรัพยากรที่มีการสร้างอินสแตนซ์สมจริงไม่ควรปล่อยออกมา ฉันหมายถึงถ้าฉันมีพอร์ตอนุกรม UART 4 ​​พอร์ตและฉันสร้างอินสแตนซ์ UART 4 ​​อันด้วยหมุดและการตั้งค่าที่ต้องการมีเหตุผลที่ไม่ต้องการทำลาย UART # 2 ในบางจุดในระหว่างรันไทม์ ดังนั้นตามหลักการ YAGNI (คุณไม่ต้องการมัน) ฉันควรละเว้น destructors หรือไม่ มันดูแปลกมากสำหรับฉัน แต่ฉันไม่สามารถนึกถึงการใช้งานได้สำหรับพวกเขา ทรัพยากรจะถูกปลดปล่อยเมื่ออุปกรณ์ปิด

5
จะทำให้มันชัดเจนได้อย่างไรว่าฟังก์ชั่นนั้นถูกเข้าถึงจากภายนอก?
นี่เป็นคำถามเฉพาะ C ฉันพยายามทำให้ทุกอย่างเป็นไปได้ภายในขอบเขตหน่วยการแปลโดยแสดงฟังก์ชั่นบางอย่างผ่าน.hไฟล์ นั่นคือฉันกำลังstaticเชื่อมโยงกับวัตถุระดับไฟล์ ตอนนี้ฟังก์ชั่นสองอย่างจำเป็นต้องมีการเรียกใช้โดยโมดูลอื่น แต่ไม่ใช่โดยตรง โมดูล / ไฟล์ / หน่วยการแปลของฉันสมัครสมาชิกกับโมดูลอื่นผ่านตัวชี้ไปยังฟังก์ชัน จากนั้นเมื่อมีเหตุการณ์ที่เฉพาะเจาะจงตัวชี้จะถูกเรียกด้วยอาร์กิวเมนต์บางตัว ดังนั้นฉันสงสัยว่าจะทำให้มันชัดเจนมากว่าฟังก์ชั่นเหล่านั้นถูกเรียกจากสถานที่คลุมเครือ พวกเขาควรจะเป็นstaticหรือextern(และเปิดเผยพวกเขาใน.h)? ฉันควรจะใส่คำใบ้ไว้ในชื่อของฟังก์ชั่นหรือไม่? หรือมันเพียงพอที่จะใส่ความคิดเห็น "เรียกโดย X"?

2
อะไรคือเหตุผลที่มาตรฐาน C พิจารณาข้อเสียแบบวนซ้ำ?
มาตรฐาน C99 ระบุไว้ใน 6.5.16: 2: ผู้ประกอบการที่ได้รับมอบหมายจะต้องมีค่า lvalue ที่สามารถแก้ไขได้เป็นตัวถูกดำเนินการด้านซ้าย และใน 6.3.2.1:1: lvalue ที่แก้ไขได้คือ lvalue ที่ไม่มีประเภทอาร์เรย์, ไม่มีประเภทที่ไม่สมบูรณ์, ไม่มีประเภทที่ผ่านการรับรองและถ้าเป็นโครงสร้างหรือสหภาพไม่มีสมาชิกใด ๆ (รวมถึงสมาชิกแบบเรียกซ้ำสมาชิกใด ๆ ) หรือองค์ประกอบของมวลรวมหรือสหภาพที่มีอยู่ทั้งหมด) ที่มีประเภทที่ผ่านการรับรอง ตอนนี้ขอพิจารณาไม่ใช่const structมีconstข้อมูล typedef struct S_s { const int _a; } S_t; ตามมาตรฐานรหัสต่อไปนี้คือพฤติกรรมที่ไม่ได้กำหนด (UB): S_t s1; S_t s2 = { ._a = 2 }; s1 = s2; ปัญหาทางความหมายของเรื่องนี้คือสิ่งที่แนบมาเอนทิตี้ของ ( …
9 design  c 

1
ฟังก์ชั่นมาโคร vs. คงที่ในส่วนหัว
สำหรับงานด่วนจำนวนมากที่สามารถใช้ฟังก์ชั่นf(x,y)ได้ใน C ธรรมดาจะใช้มาโคร ฉันต้องการถามเฉพาะเกี่ยวกับกรณีเหล่านี้ซึ่งสามารถแก้ไขได้โดยการเรียกใช้ฟังก์ชัน (เช่นมาโครที่ใช้สำหรับฟังก์ชั่นอินไลน์ไม่ใช่สำหรับการขยายโค้ดของรหัสที่กำหนดเอง) โดยทั่วไปฟังก์ชั่น C จะไม่ถูกแทรกเนื่องจากมันอาจถูกลิงค์ไปจากไฟล์ C อื่น ๆ อย่างไรก็ตามฟังก์ชั่นคงที่ C สามารถมองเห็นได้จากภายในไฟล์ C ที่มีการกำหนดไว้ดังนั้นพวกเขาสามารถ inline โดยคอมไพเลอร์ ฉันได้ยินมาว่าควรมีการเปลี่ยนมาโครเป็นจำนวนมากโดยเปลี่ยนเป็นฟังก์ชั่นแบบคงที่เพราะจะทำให้รหัสปลอดภัยยิ่งขึ้น มีบางกรณีที่นี่ไม่ใช่ความคิดที่ดีหรือไม่? อีกครั้ง: ไม่ถามเกี่ยวกับมาโครการผลิตรหัสด้วย ## โครงสร้างที่เหมือนกันซึ่งไม่สามารถแสดงเป็นฟังก์ชันได้เลย
9 c 

6
ทีมของฉันควรใช้มาตรฐานการเข้ารหัสที่ได้รับการยอมรับเป็นพื้นฐานของตัวเองหรือไม่?
ทีมวิจัยและพัฒนาที่ฉันอยู่ได้ตัดสินใจใช้มาตรฐานการเข้ารหัส เราเพิ่งก่อตั้งเมื่อไม่นานมานี้และมีรหัสน้อยเกินไปและเวลาการเข้ารหัสทั่วไปของเราเองที่จะยึดมาตรฐาน / เอกสารการประชุมว่าสิ่งใดที่มีการพัฒนาโดยทั่วไปในทีมของเราและจากตัวอย่างที่ดีจากรหัสของเราเองเป็นต้น ตอนนี้พวกเราทุกคนมีประสบการณ์จากสถานที่ทำงานที่ผ่านมา - แม้ว่าเราจะไม่มีใครพูดว่า "เราขอรับรองเอกสารฉบับนี้ที่นี่ฉันพบว่าเหมาะสำหรับงานที่เราทำที่นี่" (*) นอกจากนี้พวกเราบางคน (รวมถึงตัวฉันเอง) มีประสบการณ์จากสถานที่ที่ไม่มีมาตรฐานการเข้ารหัสอย่างเป็นทางการเท่านั้นหรือการเขียนในภาษาต่าง ๆ ในสภาพแวดล้อมที่แตกต่างกัน (สภาพแวดล้อมการผลิตที่มีแรงกดดันสูงทุกสัปดาห์ หนึ่งในตัวเลือกที่ฉันคิดอยู่ก็คือการนำเอกสารที่เป็นที่รู้จักและได้รับการยอมรับมาอย่างดีคัดลอกสิ่งที่เราไม่สนใจ / สนใจและทำการแก้ไขตามความต้องการของเรา นี่เป็นเรื่องธรรมดาไหม คุณเชื่อว่านี่เป็นความคิดที่ดีหรือไม่? ถ้าเป็นเช่นนั้นสิ่งที่จะเป็นมาตรฐานการเข้ารหัส 'พื้นฐาน' ที่เหมาะสม (อย่าบอกฉันว่าอะไรดีที่สุดฉันไม่ต้องการเริ่มต้นความขัดแย้งทางศาสนาที่นี่เพียงแค่ชี้ให้เห็นว่าอะไรจะครอบคลุมหรือ 'เป็นกลาง' พอที่จะสร้าง .) หมายเหตุ: เราคาดว่าจะทำงานกับ C, C ++, OpenCL, CUDA, Python เราเป็นทีมงานของ 4 คน + ผู้จัดการคาดว่าจะเติบโตประมาณ 5-6 ภายในหนึ่งปี ใน บริษัท ของเราทีมเกือบทั้งหมดเป็นอิสระและมักจะไม่โต้ตอบเลย (ไม่ใช่แม้กระทั่งโดยใช้รหัสของกันและกัน - งานอยู่ในโครงการที่แตกต่างกันโดยสิ้นเชิง); ดังนั้น - …

3
เหตุผลที่อยู่เบื้องหลังฟังก์ชันไลบรารี C ไม่เคยตั้งค่า errno เป็นศูนย์
เอกสารมาตรฐาน C ที่ไม่มีฟังก์ชันไลบรารีมาตรฐาน C ตั้งerrnoเป็นศูนย์ ทำไมถึงเป็นอย่างนี้ ฉันเข้าใจว่ามันมีประโยชน์สำหรับการเรียกฟังก์ชั่นหลาย ๆ อย่างและตรวจสอบเฉพาะerrnoหลังจากที่ผ่านมา - ตัวอย่างเช่น: errno = 0; double x = strtod(str1, NULL); long y = strtol(str2, NULL); if (errno) // either "strtod" or "strtol" failed else // both succeeded อย่างไรก็ตามนี่ไม่ถือว่าเป็น "การปฏิบัติที่ไม่ดี" หรือไม่? เนื่องจากคุณกำลังตรวจสอบerrnoเมื่อสิ้นสุดเท่านั้นคุณจะรู้ว่าหนึ่งในฟังก์ชันนั้นล้มเหลว แต่ไม่ใช่ฟังก์ชั่นใดที่ล้มเหลว เพียงแค่รู้ว่ามีบางสิ่งที่ไม่ดีพอสำหรับโปรแกรมที่ใช้งานได้จริง ผมพยายามมองหาเอกสารต่างๆ C เหตุผล <errno.h>แต่ส่วนมากของพวกเขาไม่ได้มีรายละเอียดมากสำหรับ
9 c  standards 

3
ตัวอย่าง Array ความยาวตัวแปร C ที่ดี [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว คำถามนี้ค่อนข้างได้รับการแช่แข็งที่ดังนั้นฉันจึงตัดสินใจลบที่นั่นและลองที่นี่แทน หากคุณคิดว่ามันไม่พอดีที่นี่อย่างน้อยโปรดแสดงความคิดเห็นเกี่ยวกับคำแนะนำวิธีการหาตัวอย่างฉันหลังจาก ... คุณสามารถยกตัวอย่างได้หรือไม่ว่าการใช้ C99 VLA ให้ประโยชน์ที่เหนือกว่าบางอย่างเช่นฮีปมาตรฐานที่ใช้กลไก C ++ RAII ปัจจุบันหรือไม่ ตัวอย่างหลังจากฉันควร: บรรลุข้อได้เปรียบด้านประสิทธิภาพที่วัดได้ง่าย (10%) จากการใช้ heap ไม่มีวิธีแก้ปัญหาที่ดีซึ่งไม่จำเป็นต้องใช้ทั้งชุดเลย ประโยชน์ที่แท้จริงจากการใช้ขนาดไดนามิกแทนที่จะเป็นขนาดสูงสุดคงที่ ไม่น่าจะทำให้เกิดการล้นสแต็คในสถานการณ์การใช้งานปกติ แข็งแรงพอที่จะล่อลวงนักพัฒนาที่ต้องการประสิทธิภาพในการรวมไฟล์ต้นฉบับ C99 ในโครงการ C ++ การเพิ่มความกระจ่างเกี่ยวกับบริบท: ฉันหมายถึง VLA ตามความหมายโดย C99 และไม่รวมอยู่ในมาตรฐาน C ++: int array[n]โดยที่nเป็นตัวแปร และฉันเป็นตัวอย่างของกรณีการใช้งานที่มันสำคัญกว่าทางเลือกอื่น ๆ ที่เสนอโดยมาตรฐานอื่น ๆ (C90, C ++ 11): int …
9 c++  c  stack  heap 

4
มีความแตกต่างระหว่าง return n และ exit (n) ใน C หรือไม่?
มีความแตกต่างระหว่างreturn n(ในmainฟังก์ชั่น) และexit(n)ใน C หรือไม่? มันถูกกำหนดโดยมาตรฐาน C หรือ POSIX หรือขึ้นอยู่กับระบบปฏิบัติการหรือคอมไพเลอร์?
9 c  standards 

3
IPC ไม่ล็อคใน Linux สำหรับโปรเซสเซอร์แบบมัลติคอร์
ฉันกำลังพยายามหาวิธีเขียนแอปพลิเคชันด้วย IPC แบบปลอดล็อคบน Linux ใน C พร้อมตัวประมวลผลแบบมัลติคอร์ สมมติว่าฉันมีกระบวนการ 1 และกระบวนการ 2 ที่เขียนไปยัง FIFO หรือหน่วยความจำที่ใช้ร่วมกัน จากนั้นประมวลผล 3 และกระบวนการ 4 จะอ่านจากหน่วยความจำที่แชร์หรือ FIFO เป็นไปได้ด้วยอัลกอริธึมที่ไม่ล็อคหรือไม่ คำแนะนำของคุณได้รับการชื่นชมอย่างมาก

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