สอบถามเรื่องการ ส่ง-รับ ค่าarray 2มิติ(C++)

การ ส่ง-รับ ค่าarray 2มิติ ส่งจากฟังก์ชั่น main ไป ฟังก์ชั่น summit 
แต่พอดีผมทำการรับค่า 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]
^^^^^^(รูปประกอบ)^^^^^^
ขอบคุณสำหรับคำแนะนำคับ
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 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/
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่