คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 1
ถ้าไม่ทราบมิติที่แน่นอนตอนคอมไพล์ เราเรียกอะเรย์ทำนองนี้ว่า Variable Length Array
- C++ ไม่อนุญาตให้ใช้ VLA โดยประการทั้งปวง
- C อนุญาตให้ใช้ VLA แต่ก็ไม่ควรใช้ เพราะ machine code ที่ได้มักจะอืดครับ
https://lkml.org/lkml/2018/3/7/621
https://lkml.org/lkml/2018/9/3/1288
C++ อนุญาตเพียง กรณีที่ทุกมิติทราบค่าตอน compile
ยกเว้นมิติหยาบที่สุด (ซ้ายสุด) เท่านั้นที่สามารถทราบค่าตอน run ได้
int arr1[x][100];
int arr2[x][2][3];
แล้วผ่านค่าโดย decaying มิติหยาบสุดนั้นเป็น pointer แล้วใส่ขนาดต่างหาก
print_arr(int (*arr)[100], int sz) { }
print_arr(int (*arr)[2][3], int sz) { }
godbolt wandbox
แต่ถ้าทั้ง row, col ทราบตอน run
วิธีที่ทำได้คือ ทำเองหรือใช้ matrix สำเร็จรูปอย่าง eigen, blaze
ถ้าทำเอง
- allocate ทั้งกระบิ
int* ptr = new int[row * col];
ก็จะได้เป็นแถวยาว ๆ
- แล้วเขียนฟังก์ชันสำหรับ access ขึ้นมาเอง
แล้วผ่านค่าด้วย pointer, row, col
print_arr (int* arr, int row, int col) {
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j)
printf("%11d, ", arr[i * col + j]);
printf("\n");
}
}
godbolt wandbox
ลองศึกษาเรื่อง
- array decaying
- row major array และ memory layout ของ built-in c array ดูครับ
Memory layout of multi-dimensional arrays
https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays/
- C++ ไม่อนุญาตให้ใช้ VLA โดยประการทั้งปวง
- C อนุญาตให้ใช้ VLA แต่ก็ไม่ควรใช้ เพราะ machine code ที่ได้มักจะอืดครับ
https://lkml.org/lkml/2018/3/7/621
https://lkml.org/lkml/2018/9/3/1288
C++ อนุญาตเพียง กรณีที่ทุกมิติทราบค่าตอน compile
ยกเว้นมิติหยาบที่สุด (ซ้ายสุด) เท่านั้นที่สามารถทราบค่าตอน run ได้
int arr1[x][100];
int arr2[x][2][3];
แล้วผ่านค่าโดย decaying มิติหยาบสุดนั้นเป็น pointer แล้วใส่ขนาดต่างหาก
print_arr(int (*arr)[100], int sz) { }
print_arr(int (*arr)[2][3], int sz) { }
godbolt wandbox
แต่ถ้าทั้ง row, col ทราบตอน run
วิธีที่ทำได้คือ ทำเองหรือใช้ matrix สำเร็จรูปอย่าง eigen, blaze
ถ้าทำเอง
- allocate ทั้งกระบิ
int* ptr = new int[row * col];
ก็จะได้เป็นแถวยาว ๆ
- แล้วเขียนฟังก์ชันสำหรับ access ขึ้นมาเอง
แล้วผ่านค่าด้วย pointer, row, col
print_arr (int* arr, int row, int col) {
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j)
printf("%11d, ", arr[i * col + j]);
printf("\n");
}
}
godbolt wandbox
ลองศึกษาเรื่อง
- array decaying
- row major array และ memory layout ของ built-in c array ดูครับ
Memory layout of multi-dimensional arrays
https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays/
แสดงความคิดเห็น
สอบถามเรื่องการ ส่ง-รับ ค่าarray 2มิติ(C++)
แต่พอดีผมทำการรับค่า row และ column จากscanf มาเลยต้องใช้การชี้ค่าarray เป็น row และ column
แต่พอส่งไปฟังก์ชั่นอื่นมีปัญหาเลยอยากถามผู้รู้ว่ามันต้องอ้างตัวแปลยังไงคับ
[url=https://drive.google.com/file/d/10B0VKZwSen4kk0dBjjvP4VMMGbDFT25z/view?usp=sharing]https://drive.google.com/file/d/10B0VKZwSen4kk0dBjjvP4VMMGbDFT25z/view?usp=sharing[/url]
^^^^^^(รูปประกอบ)^^^^^^
ขอบคุณสำหรับคำแนะนำคับ