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

C เป็นภาษาโปรแกรมทั่วไปที่ใช้สำหรับการเขียนโปรแกรมระบบ (ระบบปฏิบัติการและฝังตัว), ห้องสมุด, เกมและข้ามแพลตฟอร์ม แท็กนี้ควรใช้กับคำถามทั่วไปที่เกี่ยวข้องกับภาษา C ตามที่กำหนดไว้ในมาตรฐาน ISO 9899 (เวอร์ชันล่าสุด 9899: 2018 เว้นแต่ระบุไว้เป็นอย่างอื่น - นอกจากนี้ยังติดแท็กคำขอเฉพาะรุ่นด้วย c89, c99, c11 ฯลฯ ) C แตกต่างจาก C ++ และไม่ควรใช้ร่วมกับแท็ก C ++ หากไม่มีเหตุผล

3
ความแตกต่างระหว่างการส่งอาร์เรย์และตัวชี้อาร์เรย์ไปยังฟังก์ชันใน C
อะไรคือความแตกต่างระหว่างทั้งสองฟังก์ชันใน C? void f1(double a[]) { //... } void f2(double *a) { //... } ถ้าฉันจะเรียกใช้ฟังก์ชันในอาร์เรย์ที่มีความยาวมากฟังก์ชันทั้งสองนี้จะทำงานแตกต่างกันหรือไม่พวกเขาจะใช้พื้นที่บนสแต็กมากขึ้นหรือไม่

12
const char * const กับ const char *?
ฉันกำลังใช้โปรแกรมตัวอย่างเพื่อทำความคุ้นเคยกับ C ++ อีกครั้งและฉันได้พบกับคำถามต่อไปนี้ ขั้นแรกนี่คือรหัสตัวอย่าง: void print_string(const char * the_string) { cout << the_string << endl; } int main () { print_string("What's up?"); } ในโค้ดข้างต้นพารามิเตอร์ที่จะ print_string const char * const the_stringจะได้รับแทน แบบไหนจะถูกต้องกว่ากัน? ฉันเข้าใจว่าความแตกต่างคือตัวชี้ไปยังอักขระคงที่ในขณะที่อีกตัวหนึ่งเป็นตัวชี้ค่าคงที่ไปยังอักขระคงที่ แต่ทำไมทั้งสองงานนี้ จะเกี่ยวข้องเมื่อใด
110 c++  c 

9
การสร้าง daemon ใน Linux
ใน Linux ฉันต้องการเพิ่ม daemon ที่ไม่สามารถหยุดทำงานได้และตรวจสอบการเปลี่ยนแปลงของระบบไฟล์ หากตรวจพบการเปลี่ยนแปลงใด ๆ ควรเขียนเส้นทางไปยังคอนโซลที่เริ่มต้นพร้อมกับขึ้นบรรทัดใหม่ ฉันมีรหัสการเปลี่ยนระบบไฟล์เกือบพร้อมแล้ว แต่ฉันไม่สามารถหาวิธีสร้าง daemon ได้ รหัสของฉันมาจากที่นี่: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html หลังส้อมต้องทำอย่างไร? int main (int argc, char **argv) { pid_t pID = fork(); if (pID == 0) { // child // Code only executed by child process sIdentifier = "Child Process: "; } else if (pID < …
110 c  linux  daemon 

4
uint_fast32_t คืออะไรและเหตุใดจึงควรใช้แทน int ปกติและ uint32_t
ดังนั้นเหตุผลสำหรับtypedef: ประเภทข้อมูลดั้งเดิมของ ed คือการแสดงนามธรรมระดับต่ำและทำให้เข้าใจง่ายขึ้น ( uint64_tแทนที่จะเป็นlong longประเภทซึ่งมีขนาด 8 ไบต์) อย่างไรก็ตามมีuint_fast32_tซึ่งมีเดียวกันเป็นtypedef uint32_tการใช้เวอร์ชัน "เร็ว" จะทำให้โปรแกรมเร็วขึ้นหรือไม่?
110 c++  c  types 

30
จะย้อนกลับรายการที่เชื่อมโยงเดี่ยวโดยใช้ตัวชี้สองตัวได้อย่างไร
ฉันสงสัยว่ามีตรรกะบางอย่างในการย้อนกลับรายการที่เชื่อมโยงโดยใช้ตัวชี้เพียงสองตัว ต่อไปนี้จะใช้ในการกลับรายการที่เชื่อมโยงเดียวโดยใช้ตัวชี้สามคือp, q, r: struct node { int data; struct node *link; }; void reverse() { struct node *p = first, *q = NULL, *r; while (p != NULL) { r = q; q = p; p = p->link; q->link = r; } first = q; } มีทางเลือกอื่นในการย้อนกลับรายการที่เชื่อมโยงหรือไม่? อะไรคือตรรกะที่ดีที่สุดในการย้อนกลับรายการที่เชื่อมโยงเพียงอย่างเดียวในแง่ของความซับซ้อนของเวลา

18
strlen จะถูกคำนวณหลายครั้งหากใช้ในเงื่อนไขการวนซ้ำ?
ฉันไม่แน่ใจว่าโค้ดต่อไปนี้อาจทำให้เกิดการคำนวณซ้ำซ้อนหรือเป็นรหัสเฉพาะของคอมไพเลอร์ for (int i = 0; i < strlen(ss); ++i) { // blabla } จะstrlen()คำนวณทุกครั้งเมื่อiเพิ่มขึ้น?
109 c++  c  gcc  optimization  strlen 

4
อะไรคือการหารจำนวนเต็มที่เร็วที่สุดที่รองรับการหารด้วยศูนย์ไม่ว่าผลลัพธ์จะเป็นอย่างไร
สรุป: ฉันกำลังมองหาวิธีที่เร็วที่สุดในการคำนวณ (int) x / (int) y y==0โดยไม่ได้รับข้อยกเว้นสำหรับ แต่ฉันแค่ต้องการผลลัพธ์ตามอำเภอใจ พื้นหลัง: เมื่อทำการเข้ารหัสอัลกอริทึมการประมวลผลภาพฉันมักจะต้องหารด้วยค่าอัลฟา (สะสม) ตัวแปรที่ง่ายที่สุดคือรหัส C ธรรมดาที่มีเลขคณิตจำนวนเต็ม ปัญหาของฉันคือฉันมักจะได้รับข้อผิดพลาดการหารด้วยศูนย์สำหรับพิกเซลผลลัพธ์ด้วยalpha==0. อย่างไรก็ตามเรื่องนี้จะตรงพิกเซลที่ผลที่ไม่ได้เรื่องที่ทั้งหมด: alpha==0ฉันไม่สนใจเกี่ยวกับค่าสีของพิกเซลพร้อม รายละเอียด: ฉันกำลังมองหาสิ่งที่ต้องการ: result = (y==0)? 0 : x/y; หรือ result = x / MAX( y, 1 ); x และ y เป็นจำนวนเต็มบวก รหัสถูกเรียกใช้งานเป็นจำนวนมากในลูปที่ซ้อนกันดังนั้นฉันจึงกำลังมองหาวิธีกำจัดการแตกกิ่งก้านตามเงื่อนไข เมื่อ y ไม่เกินช่วงไบต์ฉันพอใจกับวิธีแก้ปัญหา unsigned char kill_zero_table[256] = { 1, 1, …

9
ขนาดของสมาชิกโครงสร้างเดียวใน C
ฉันกำลังพยายามประกาศโครงสร้างที่ขึ้นอยู่กับโครงสร้างอื่น ฉันต้องการใช้sizeofเพื่อความปลอดภัย / อวดรู้ typedef struct _parent { float calc ; char text[255] ; int used ; } parent_t ; ตอนนี้ฉันต้องการประกาศโครงสร้างchild_tที่มีขนาดเท่ากับparent_t.text. ฉันจะทำเช่นนี้ได้อย่างไร? (รหัสหลอกด้านล่าง) typedef struct _child { char flag ; char text[sizeof(parent_t.text)] ; int used ; } child_t ; ฉันลองหลายวิธีด้วยparent_tและstruct _parentแต่คอมไพเลอร์ของฉันไม่ยอมรับ เคล็ดลับนี้ดูเหมือนจะใช้ได้: parent_t* dummy ; typedef struct _child { char …
109 c  struct  sizeof 

3
-fPIC หมายถึงอะไรเมื่อสร้างไลบรารีที่ใช้ร่วมกัน
ฉันรู้ว่า-fPICตัวเลือก '' เกี่ยวข้องกับการแก้ไขที่อยู่และความเป็นอิสระระหว่างแต่ละโมดูล แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร คุณสามารถอธิบาย?
109 c++  c  gcc  fpic 

14
ส่งคืนสตริง C จากฟังก์ชัน
ฉันพยายามส่งคืนสตริง C จากฟังก์ชัน แต่ไม่ได้ผล นี่คือรหัสของฉัน char myFunction() { return "My String"; } ในmainฉันเรียกมันเช่นนี้: int main() { printf("%s", myFunction()); } ฉันได้ลองใช้วิธีอื่นบ้างmyFunctionแล้ว แต่ไม่ได้ผล ตัวอย่างเช่น: char myFunction() { char array[] = "my string"; return array; } หมายเหตุ: ฉันไม่ได้รับอนุญาตให้ใช้พอยน์เตอร์! พื้นหลังเล็กน้อยเกี่ยวกับปัญหานี้: มีฟังก์ชั่นที่ค้นหาว่าเป็นเดือนไหน ตัวอย่างเช่นถ้าเป็น 1 ก็จะส่งกลับเดือนมกราคมเป็นต้น พอจะพิมพ์ก็ทำแบบนี้: printf("Month: %s",calculateMonth(month));. ตอนนี้ปัญหาคือวิธีส่งคืนสตริงนั้นจากcalculateMonthฟังก์ชัน
109 c 

7
ความแตกต่างระหว่าง size_t และ int ที่ไม่ได้ลงชื่อ
ฉันสับสนเกี่ยวกับsize_t. ฉันได้ค้นหาบนอินเทอร์เน็ตและทุกที่ที่กล่าวถึงว่าsize_tเป็นประเภทที่ไม่ได้ลงนามดังนั้นจึงสามารถแสดงได้เฉพาะค่าที่ไม่เป็นลบ คำถามแรกของฉันคือถ้ามันถูกใช้เพื่อแสดงเฉพาะค่าที่ไม่ใช่ค่าลบทำไมเราไม่ใช้unsigned intแทนsize_t? คำถามที่สองของฉันคือsize_tและunsigned intใช้แทนกันได้หรือไม่? ถ้าไม่แล้วทำไม? และใครช่วยให้ฉันเป็นตัวอย่างที่ดีsize_tและสั้น ๆ เกี่ยวกับการทำงานของมัน?
109 c  types  unsigned 

6
(A + B + C) ≠ (A + C + B) และการเรียงลำดับคอมไพเลอร์
การเพิ่มจำนวนเต็ม 32 บิตสองตัวอาจทำให้จำนวนเต็มล้น: uint64_t u64_z = u32_x + u32_y; การโอเวอร์โฟลว์นี้สามารถหลีกเลี่ยงได้หากหนึ่งในจำนวนเต็ม 32 บิตถูกแคสต์หรือเพิ่มเป็นจำนวนเต็ม 64 บิตก่อน uint64_t u64_z = u32_x + u64_a + u32_y; อย่างไรก็ตามหากคอมไพเลอร์ตัดสินใจที่จะจัดลำดับการเพิ่มใหม่: uint64_t u64_z = u32_x + u32_y + u64_a; การล้นจำนวนเต็มอาจยังคงเกิดขึ้น คอมไพเลอร์ได้รับอนุญาตให้ทำการเรียงลำดับใหม่หรือเราสามารถไว้วางใจให้คอมไพเลอร์สังเกตเห็นความไม่สอดคล้องกันของผลลัพธ์และรักษาลำดับนิพจน์ตามที่เป็นอยู่ได้หรือไม่?

11
ข้อผิดพลาดในการคอมไพล์ GCC ด้วยรหัส> 2 GB
ฉันมีฟังก์ชั่นจำนวนมากรวมประมาณ 2.8 GB ของรหัสวัตถุ (น่าเสียดายที่ไม่มีวิธีการคำนวณทางวิทยาศาสตร์ ... ) เมื่อฉันพยายามที่จะเชื่อมโยงพวกเขาก็จะได้รับ (คาดว่า) relocation truncated to fit: R_X86_64_32Sข้อผิดพลาดที่ผมหวังว่าจะหลีกเลี่ยงโดย specifing -mcmodel=mediumธงคอมไพเลอร์ ไลบรารีทั้งหมดที่เชื่อมโยงนอกเหนือจากที่ฉันควบคุมจะถูกคอมไพล์ด้วย-fpicแฟล็ก ถึงกระนั้นข้อผิดพลาดยังคงมีอยู่และฉันคิดว่าบางไลบรารีที่ฉันเชื่อมโยงไม่ได้คอมไพล์ด้วย PIC นี่คือข้อผิดพลาด: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini' defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS) /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x19): relocation truncated to fit: R_X86_64_32S against …
108 c++  c  gcc  compiler-errors 

1
ไวยากรณ์“ [0 … 255] =” ใน C คืออะไร
อ้างถึงjs0n.c ไวยากรณ์ของรหัสมีดังต่อไปนี้: static void *gostruct[] = { [0 ... 255] = &&l_bad, ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop, ['"'] = &&l_qup, [':'] = &&l_loop, [','] = &&l_loop, ['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation …
108 c  gcc-extensions 

11
วิธีสร้างตัวเลขจำนวนเต็มสุ่มจากภายในช่วง
นี่คือการติดตามจากคำถามที่โพสต์ไว้ก่อนหน้านี้: จะสร้างตัวเลขสุ่มใน C ได้อย่างไร? ฉันต้องการสร้างตัวเลขสุ่มจากภายในช่วงที่กำหนดเช่น 1 ถึง 6 เพื่อเลียนแบบด้านข้างของดาย ฉันจะทำสิ่งนี้ได้อย่างไร
108 c  random 

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