تمرير صفيف عدد صحيح من طول متغير كمعلمة وظيفة في الهدف C

StackOverflow https://stackoverflow.com/questions/1402250

سؤال

ولدي البرمجية التالية الذي يعمل بشكل جيد ...

int testarr[3][3] = {
  {1,1,1},
  {1,0,1},
  {1,1,1}
};   
[self testCall: testarr];

والذي يدعو هذه الوظيفة:

- (void)testCall: (int[3][3]) arr {

    NSLog(@"cell value is %u",arr[1][1]);
}

وأنا في حاجة إلى مجموعة لتكون ذات طول متغير - ما هو أفضل وسيلة للإعلان عن وظيفة

<ع> استخدام الفراغات لا يعمل:

- (void)testCall: (int[][]) arr { 

وشكرا لمساعدتكم.

هل كانت مفيدة؟

المحلول

وأود أن أكتب هذا على النحو التالي:

- (void) testCall: (int *) aMatrice;

والقيام بذلك يسمح لك لتجنب mallocs متعددة والرياضيات لحساب واحد تعويض في مجموعة خطية على أساس س، ص الإحداثيات في مجموعة 2D تافهة. فإنه يتجنب أيضا mallocs متعددة تنطوي عليها الباحث ** والقيود المفروضة على تركيب مجموعة 2D التي ترتكبها اللغة.

وهكذا، إذا أردت مجموعة 4X5، قد القيام به:

#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)

int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW);

ويمكنك بعد ذلك تهيئة مجموعة خطيا أو مع متداخلة للحلقة:

for(int x=0; x<width; x++)
    for(int y=0; y<height; y++)
        myArray[INDEXOF(x,y)] = ... some value ...;

وكنت تمريرها إلى طريقة مثل:

[foo testCall: myArray];

وعلى الرغم من أنك قد ترغب في تحمل أيضا على طول وعرض وارتفاع أو الأفضل من ذلك، إنشاء فئة فرعية IntMatrix من NSObject التي يلتف كل من الحساب المؤشر وتخزين ما هو أبعد من API لطيفة نظيفة.

و(كافة التعليمات البرمجية المكتوبة في SO)

نصائح أخرى

وC صفائف لا يمكن أن يكون المتغير في أكثر من بعد واحد.

وأنت لا يمكن أن يكون هذا:

int testarr[][] = {
  {1,1,1},
  {1,0,1,2},
  {1,1}
};

ولكن هل يمكن أن يكون هذا:

int testarr[][3] = {
  {1,1,1},
  {1,0,1},
  {1,1,1},
  {4,5,6},
  {7,8,9}
}

foo(testarr);

void foo(int param[][3])
{
    printf("%d", param[3][1]); // prints 5
}

ولا يمكنك استخدام int[][] لأن حجم البعد الثاني يؤثر على الكيفية التي وضعت مجموعة في الذاكرة. إذا كنت تعرف البعد الثاني يمكنك استخدام int[][x]، وإلا سيكون لديك لاستخدام int** التي يمكن الوصول إليها فقط مثل صفيف.

لماذا لا مجرد استخدام NSArray أو NSMutableArray مع NSIntegers؟ هذه الفئات هي مجموعة من طول متغير، وأسهل للاستخدام.

وهذا من شأنه أن يؤدي إلى

- (void)testCall: (NSArray *) arr {
    NSLog(@"cell value is %u", [[arr objectAtIndex:1] objectAtIndex:1]);
}

(وبطبيعة الحال، سيكون لديك أيضا لتحديد testarr باستخدام NSArray).

و

إذا كنت <م> حقا تريد استخدام المصفوفات C، مما يجعل حجة طريقة مؤشر إلى int مع

و- (void)testCall: (int*) arr {

وربما العمل (مع بقية رمز البقاء نفسه).

ودعوة

int testarr[3][3] = {
  {1,1,1},
  {1,0,1},
  {1,1,1}
};   
[self testCall: (int *)testarr];

وظيفة

- (void)testCall: (int *) arr 
{
    int (*V_arr)[3] = (int(*)[3])arr;
    NSLog(@"cell value is %u",V_arr[1][1]);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top