# Thread: This 2D array is causing dismay: Exercise 17 in chapter 12

1. ## This 2D array is causing dismay: Exercise 17 in chapter 12

Hello, I'm working on an exercise involving pointer arithmetic and 2D arrays. I can't use subscription and it must be done in a single loop. Here's the code that causing me heart ache:

Code:
```#include <stdio.h>
// C Programming - a modern approach, 2nd edition by K.N. King

const int b[4][6]= {{1,2,3,4,5,6},
{1,2,3,4,5,6},
{1,2,3,4,5,6},
{1,2,3,4,5,6}};

//very bottom page.268 a funct for 1 dimensional array works for 2 dimensional
int sum_two_dimensional_array(const int a[], int n);

int main(void){
int total;
int num =(sizeof(b)/sizeof(b[0]));
total = sum_two_dimensional_array(b, num);  //p265
printf("total = %d\n",total);
}

int sum_two_dimensional_array(const int a[], int n){ //p265 look for 'const'
const int *p;
int sum;
p = a;
for(p=0; p<a+n; p++){           // top of p264 and bottom of p.269
printf("p=%d\n",*p);
sum += *p;
}
printf("sum = %d\n",sum);
return sum;
}```

Here is the compiler log:
Code:
```||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:\work\programming-c\KN-King-C-programming\chapt-12-ex17.c||In function 'main':|
C:\work\programming-c\KN-King-C-programming\chapt-12-ex17.c|15|warning: passing argument 1 of 'sum_two_dimensional_array' from incompatible pointer type [-Wincompatible-pointer-types]|
C:\work\programming-c\KN-King-C-programming\chapt-12-ex17.c|10|note: expected 'const int *' but argument is of type 'const int (*)[6]'|
||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|```
The compiler is telling me that in line 15 the parameter 'b' is from "incompatible pointer type". I'm miss understanding something from my book because this should work.

Thank you for any insight.

2. What exactly are you trying to sum?

The whole array?
The first row?
The first column?

> int num =(sizeof(b)/sizeof(b[0]));
This is only going to tell you how many rows your array has (ie, 4)
If you want the number of ints in the whole array, use b[0][0] in the divisor expression.

> sum_two_dimensional_array(b, num); //p265
You're expecting a 1-D array.
sum_two_dimensional_array(b[0], num); //p265

> for(p=0; p<a+n; p++)
You just set p to point to the array, and now you've set it back to being a null pointer.
Maybe
for(p=a; p<a+n; p++)

> int sum;
Code:
```\$ gcc -Wall -Wextra -O2 -g foo.c
foo.c: In function ‘sum_two_dimensional_array’:
foo.c:32:12: warning: ‘sum’ may be used uninitialized in this function [-Wmaybe-uninitialized]
32 |     return sum;
|            ^~~```

3. Thank you. I was trying to total the whole array.

It now works. I changed:
Code:
`for(p = 0; p<a+n; p++){`
//to
Code:
`for(p = a; p<a+n; p++){`
// I was getting tired. I can't believe I missed that.

regarding:
Code:
`int num =(sizeof(b)/sizeof(b[0]));`
//vs
Code:
`int num =(sizeof(b)/sizeof(b[0][0]));`
// to be honest, I wasn't sure. I was going to change it once I got past the issue I created with the null pointer.

I know I'm not supposed to randomly try stuff to much. I'm trying to understand more and do less dart throwing. Telling me about the null pointer mistake is what did it.

On behalf of all the people trying to learn. Thank you for responding.

Warm Regards.