cancel
Showing results for 
Search instead for 
Did you mean: 

getting error at build as subscripted value is neither array nor pointer nor vector

demir
Senior II

Hi,

Before I start, please note that I am not sure if I am asking the question in the right place, so please feel free to direct me. 

I have written an application that can be found here.

I get build log as in below.

I have many issues, out of which, I especially want to fix "subscripted value is neither array nor pointer nor vector" issue.

Can anyone please guide me ?

Thanks.

 

22:35:30 **** Incremental Build of configuration Debug for project PCA9685 ****
make -j8 all 
arm-none-eabi-gcc "../Core/Src/PCA9685.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F407xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/PCA9685.d" -MT"Core/Src/PCA9685.o" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "Core/Src/PCA9685.o"
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:26:9: note: '#pragma message: i2c buffer length not defined - using default value of 32, which may not be correct for your microcontroller. Check stm32f4xx_hal_i2c.h (or similar) for your hardware and manually define BUFFER_LENGTH or I2C_BUFFER_LENGTH to remove this warning.'
   26 | #pragma message( "i2c buffer length not defined - using default value of 32, which may not be correct for your microcontroller. Check stm32f4xx_hal_i2c.h (or similar) for your hardware and manually define BUFFER_LENGTH or I2C_BUFFER_LENGTH to remove this warning.")
      |         ^~~~~~~
../Core/Src/PCA9685.c: In function 'resetDevices':
../Core/Src/PCA9685.c:131:1: warning: implicit declaration of function 'MX_I2C1_Init'; did you mean 'HAL_I2C_Init'? [-Wimplicit-function-declaration]
  131 | MX_I2C1_Init();
      | ^~~~~~~~~~~~
      | HAL_I2C_Init
../Core/Src/PCA9685.c: In function 'i2cWire_beginTransmission':
../Core/Src/PCA9685.c:835:13: error: 'I2C_HandleTypeDef' has no member named 'beginTransmission'
  835 |     _i2cWire->beginTransmission(addr);
      |             ^~
../Core/Src/PCA9685.c: In function 'i2cWire_endTransmission':
../Core/Src/PCA9685.c:843:37: error: 'I2C_HandleTypeDef' has no member named 'endTransmission'
  843 |     return (_lastI2CError = _i2cWire->endTransmission());
      |                                     ^~
../Core/Src/PCA9685.c: In function 'i2cWire_requestFrom':
../Core/Src/PCA9685.c:852:20: error: 'I2C_HandleTypeDef' has no member named 'requestFrom'
  852 |     return _i2cWire->requestFrom(addr, (size_t)len);
      |                    ^~
../Core/Src/PCA9685.c: At top level:
../Core/Src/PCA9685.c:859:9: error: conflicting types for 'i2cWire_write'; have 'uint8_t(uint8_t)' {aka 'unsigned char(unsigned char)'}
  859 | uint8_t i2cWire_write(uint8_t data) {
      |         ^~~~~~~~~~~~~
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:232:15: note: previous declaration of 'i2cWire_write' with type 'size_t(uint8_t)' {aka 'unsigned int(unsigned char)'}
  232 |        size_t i2cWire_write(uint8_t);
      |               ^~~~~~~~~~~~~
../Core/Src/PCA9685.c: In function 'i2cWire_write':
../Core/Src/PCA9685.c:861:20: error: 'I2C_HandleTypeDef' has no member named 'write'
  861 |     return _i2cWire->write(data);
      |                    ^~
../Core/Src/PCA9685.c: In function 'i2cWire_read':
../Core/Src/PCA9685.c:870:30: error: 'I2C_HandleTypeDef' has no member named 'read'
  870 |     return (uint8_t)(_i2cWire->read() & 0xFF);
      |                              ^~
../Core/Src/PCA9685.c: At top level:
../Core/Src/PCA9685.c:1041:1: warning: data definition has no type or storage class
 1041 | _coeff=NULL;
      | ^~~~~~
../Core/Src/PCA9685.c:1041:1: warning: type defaults to 'int' in declaration of '_coeff' [-Wimplicit-int]
../Core/Src/PCA9685.c:1041:1: error: conflicting types for '_coeff'; have 'int'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:252:23: note: previous declaration of '_coeff' with type 'float *'
  252 |                float *_coeff;      // a,b,c,d coefficient values
      |                       ^~~~~~
../Core/Src/PCA9685.c:1041:8: warning: initialization of 'int' from 'void *' makes integer from pointer without a cast [-Wint-conversion]
 1041 | _coeff=NULL;
      |        ^~~~
../Core/Src/PCA9685.c:1042:1: warning: data definition has no type or storage class
 1042 | _isCSpline=false;
      | ^~~~~~~~~~
../Core/Src/PCA9685.c:1042:1: warning: type defaults to 'int' in declaration of '_isCSpline' [-Wimplicit-int]
../Core/Src/PCA9685.c:1042:1: error: conflicting types for '_isCSpline'; have 'int'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:253:21: note: previous declaration of '_isCSpline' with type '_Bool'
  253 |                bool _isCSpline;    // Cubic spline tracking, for _coeff length
      |                     ^~~~~~~~~~
../Core/Src/PCA9685.c:1044:1: warning: return type defaults to 'int' [-Wimplicit-int]
 1044 | PCA9685_ServoEval_1(uint16_t minPWMAmount, uint16_t maxPWMAmount)
      | ^~~~~~~~~~~~~~~~~~~
../Core/Src/PCA9685.c:1044:1: warning: conflicting types for 'PCA9685_ServoEval_1'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:239:17: note: previous declaration of 'PCA9685_ServoEval_1' with type 'void(uint16_t,  uint16_t)' {aka 'void(short unsigned int,  short unsigned int)'}
  239 |            void PCA9685_ServoEval_1(uint16_t minPWMAmount, uint16_t maxPWMAmount);
      |                 ^~~~~~~~~~~~~~~~~~~
../Core/Src/PCA9685.c: In function 'PCA9685_ServoEval_1':
../Core/Src/PCA9685.c:1056:22: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]
 1056 |     _coeff = (float*)malloc(2 * sizeof(float));
      |                      ^~~~~~
../Core/Src/PCA9685.c:14:1: note: include '<stdlib.h>' or provide a declaration of 'malloc'
   13 | #include "main.h"
  +++ |+#include <stdlib.h>
   14 | 
../Core/Src/PCA9685.c:1056:22: warning: incompatible implicit declaration of built-in function 'malloc' [-Wbuiltin-declaration-mismatch]
 1056 |     _coeff = (float*)malloc(2 * sizeof(float));
      |                      ^~~~~~
../Core/Src/PCA9685.c:1056:22: note: include '<stdlib.h>' or provide a declaration of 'malloc'
../Core/Src/PCA9685.c:1056:12: warning: assignment to 'int' from 'float *' makes integer from pointer without a cast [-Wint-conversion]
 1056 |     _coeff = (float*)malloc(2 * sizeof(float));
      |            ^
../Core/Src/PCA9685.c:1059:11: error: subscripted value is neither array nor pointer nor vector
 1059 |     _coeff[0] = minPWMAmount;
      |           ^
../Core/Src/PCA9685.c:1060:11: error: subscripted value is neither array nor pointer nor vector
 1060 |     _coeff[1] = (maxPWMAmount - minPWMAmount) / 180.0f;
      |           ^
../Core/Src/PCA9685.c: At top level:
../Core/Src/PCA9685.c:1064:1: warning: data definition has no type or storage class
 1064 | _coeff=NULL;
      | ^~~~~~
../Core/Src/PCA9685.c:1064:1: warning: type defaults to 'int' in declaration of '_coeff' [-Wimplicit-int]
../Core/Src/PCA9685.c:1064:1: error: conflicting types for '_coeff'; have 'int'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:252:23: note: previous declaration of '_coeff' with type 'float *'
  252 |                float *_coeff;      // a,b,c,d coefficient values
      |                       ^~~~~~
../Core/Src/PCA9685.c:1064:8: warning: initialization of 'int' from 'void *' makes integer from pointer without a cast [-Wint-conversion]
 1064 | _coeff=NULL;
      |        ^~~~
../Core/Src/PCA9685.c:1065:1: warning: data definition has no type or storage class
 1065 | _isCSpline=false;
      | ^~~~~~~~~~
../Core/Src/PCA9685.c:1065:1: warning: type defaults to 'int' in declaration of '_isCSpline' [-Wimplicit-int]
../Core/Src/PCA9685.c:1065:1: error: conflicting types for '_isCSpline'; have 'int'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:253:21: note: previous declaration of '_isCSpline' with type '_Bool'
  253 |                bool _isCSpline;    // Cubic spline tracking, for _coeff length
      |                     ^~~~~~~~~~
../Core/Src/PCA9685.c: In function 'PCA9685_ServoEval_2':
../Core/Src/PCA9685.c:1089:26: warning: incompatible implicit declaration of built-in function 'malloc' [-Wbuiltin-declaration-mismatch]
 1089 |         _coeff = (float*)malloc(8 * sizeof(float));
      |                          ^~~~~~
../Core/Src/PCA9685.c:1089:26: note: include '<stdlib.h>' or provide a declaration of 'malloc'
../Core/Src/PCA9685.c:1089:16: warning: assignment to 'int' from 'float *' makes integer from pointer without a cast [-Wint-conversion]
 1089 |         _coeff = (float*)malloc(8 * sizeof(float));
      |                ^
../Core/Src/PCA9685.c:1119:19: error: subscripted value is neither array nor pointer nor vector
 1119 |             _coeff[4 * i + 0] = y[i]; // a
      |                   ^
../Core/Src/PCA9685.c:1120:19: error: subscripted value is neither array nor pointer nor vector
 1120 |             _coeff[4 * i + 1] = b[i]; // b
      |                   ^
../Core/Src/PCA9685.c:1121:19: error: subscripted value is neither array nor pointer nor vector
 1121 |             _coeff[4 * i + 2] = c[i]; // c
      |                   ^
../Core/Src/PCA9685.c:1122:19: error: subscripted value is neither array nor pointer nor vector
 1122 |             _coeff[4 * i + 3] = d[i]; // d
      |                   ^
../Core/Src/PCA9685.c:1126:27: warning: incompatible implicit declaration of built-in function 'malloc' [-Wbuiltin-declaration-mismatch]
 1126 |          _coeff = (float*)malloc(2 * sizeof(float));
      |                           ^~~~~~
../Core/Src/PCA9685.c:1126:27: note: include '<stdlib.h>' or provide a declaration of 'malloc'
../Core/Src/PCA9685.c:1126:17: warning: assignment to 'int' from 'float *' makes integer from pointer without a cast [-Wint-conversion]
 1126 |          _coeff = (float*)malloc(2 * sizeof(float));
      |                 ^
../Core/Src/PCA9685.c:1129:15: error: subscripted value is neither array nor pointer nor vector
 1129 |         _coeff[0] = minPWMAmount;
      |               ^
../Core/Src/PCA9685.c:1130:15: error: subscripted value is neither array nor pointer nor vector
 1130 |         _coeff[1] = (maxPWMAmount - minPWMAmount) / 180.0f;
      |               ^
../Core/Src/PCA9685.c: In function 'pwmForAngle':
../Core/Src/PCA9685.c:1136:13: warning: implicit declaration of function 'constrain' [-Wimplicit-function-declaration]
 1136 |     angle = constrain(angle + 90, 0, 180);
      |             ^~~~~~~~~
../Core/Src/PCA9685.c:1139:24: error: subscripted value is neither array nor pointer nor vector
 1139 |         retVal = _coeff[0] + (_coeff[1] * angle);
      |                        ^
../Core/Src/PCA9685.c:1139:37: error: subscripted value is neither array nor pointer nor vector
 1139 |         retVal = _coeff[0] + (_coeff[1] * angle);
      |                                     ^
../Core/Src/PCA9685.c:1143:28: error: subscripted value is neither array nor pointer nor vector
 1143 |             retVal = _coeff[0] + (_coeff[1] * angle) + (_coeff[2] * angle * angle) + (_coeff[3] * angle * angle * angle);
      |                            ^
../Core/Src/PCA9685.c:1143:41: error: subscripted value is neither array nor pointer nor vector
 1143 |             retVal = _coeff[0] + (_coeff[1] * angle) + (_coeff[2] * angle * angle) + (_coeff[3] * angle * angle * angle);
      |                                         ^
../Core/Src/PCA9685.c:1143:63: error: subscripted value is neither array nor pointer nor vector
 1143 |             retVal = _coeff[0] + (_coeff[1] * angle) + (_coeff[2] * angle * angle) + (_coeff[3] * angle * angle * angle);
      |                                                               ^
../Core/Src/PCA9685.c:1143:93: error: subscripted value is neither array nor pointer nor vector
 1143 |             retVal = _coeff[0] + (_coeff[1] * angle) + (_coeff[2] * angle * angle) + (_coeff[3] * angle * angle * angle);
      |                                                                                             ^
../Core/Src/PCA9685.c:1147:28: error: subscripted value is neither array nor pointer nor vector
 1147 |             retVal = _coeff[4] + (_coeff[5] * angle) + (_coeff[6] * angle * angle) + (_coeff[7] * angle * angle * angle);
      |                            ^
../Core/Src/PCA9685.c:1147:41: error: subscripted value is neither array nor pointer nor vector
 1147 |             retVal = _coeff[4] + (_coeff[5] * angle) + (_coeff[6] * angle * angle) + (_coeff[7] * angle * angle * angle);
      |                                         ^
../Core/Src/PCA9685.c:1147:63: error: subscripted value is neither array nor pointer nor vector
 1147 |             retVal = _coeff[4] + (_coeff[5] * angle) + (_coeff[6] * angle * angle) + (_coeff[7] * angle * angle * angle);
      |                                                               ^
../Core/Src/PCA9685.c:1147:93: error: subscripted value is neither array nor pointer nor vector
 1147 |             retVal = _coeff[4] + (_coeff[5] * angle) + (_coeff[6] * angle * angle) + (_coeff[7] * angle * angle * angle);
      |                                                                                             ^
../Core/Src/PCA9685.c: In function 'i2cWire_endTransmission':
../Core/Src/PCA9685.c:848:1: warning: control reaches end of non-void function [-Wreturn-type]
  848 | }
      | ^
../Core/Src/PCA9685.c: In function 'i2cWire_requestFrom':
../Core/Src/PCA9685.c:857:1: warning: control reaches end of non-void function [-Wreturn-type]
  857 | }
      | ^
../Core/Src/PCA9685.c: In function 'i2cWire_write':
../Core/Src/PCA9685.c:865:1: warning: control reaches end of non-void function [-Wreturn-type]
  865 | }
      | ^
../Core/Src/PCA9685.c: In function 'i2cWire_read':
../Core/Src/PCA9685.c:881:1: warning: control reaches end of non-void function [-Wreturn-type]
  881 | }
      | ^
make: *** [Core/Src/subdir.mk:37: Core/Src/PCA9685.o] Error 1
"make -j8 all" terminated with exit code 2. Build might be incomplete.

22:35:33 Build Failed. 29 errors, 25 warnings. (took 2s.371ms)
1 ACCEPTED SOLUTION

Accepted Solutions

You need to read the message literally - it is telling you what is wrong, and where.

When it says "../Core/Src/PCA9685.c:1041:1", that means

  • ../Core/Src/PCA9685.c is the name of the file;
  • :1041 is the line number within that file;
  • :1 is the character position (or columns) along that line;

So it's telling you that you have two different declarations of _coeff:

  1. In ../Core/Src/PCA9685.c at line 1041 you have it as 'int'
  2. In ../Core/Inc/PCA9685.h at line 252 you have it as 'float *'

The same variable  - _coeff - cannot have 2 different types; it cannot be both  'int' and 'float *'

 

#FileLineColumn

View solution in original post

5 REPLIES 5

Errors tend to compound, start with the first ones.

The github isn't public.

Earlier in the code it thinks _coeff is an integer, not a float* pointer.

Other places you are using functions in defined in main() which you've not proto-typed in pca9685.c

Put proto-types and extern definitions in main.h

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Sorry, now I ve made the repo public.

Can you please check ?

main.c

static void MX_I2C1_Init(void); // this can't be static if you want to call it from other source files

main.h

extern I2C_HandleTypeDef hi2c1; // Allow you to reference elsewhere

extern TIM_HandleTypeDef htim1;

extern UART_HandleTypeDef huart2;

extern void MX_I2C1_Init(void); // Prototype so you can call the non-static function

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Thanks.

I still can not resolve below.

In PCA9695.h, _coeff is defined as float pointer. In PCA9685.c _coeff = NULL should be just fine, because NULL is actually ((void*)0) as per written in stddef.h.

 

#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL		/* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else   /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else   /* C++ */
#define NULL 0
#endif  /* C++ */
#endif  /* G++ */
#endif	/* NULL not defined and <stddef.h> or need NULL.  */
#undef	__need_NULL

So, why am I still getting this error ?

 

../Core/Src/PCA9685.c:1041:1: error: conflicting types for '_coeff'; have 'int'
In file included from ../Core/Src/PCA9685.c:9:
../Core/Inc/PCA9685.h:252:23: note: previous declaration of '_coeff' with type 'float *'
  252 |                float *_coeff;      // a,b,c,d coefficient values
      |                       ^~~~~~

 

You need to read the message literally - it is telling you what is wrong, and where.

When it says "../Core/Src/PCA9685.c:1041:1", that means

  • ../Core/Src/PCA9685.c is the name of the file;
  • :1041 is the line number within that file;
  • :1 is the character position (or columns) along that line;

So it's telling you that you have two different declarations of _coeff:

  1. In ../Core/Src/PCA9685.c at line 1041 you have it as 'int'
  2. In ../Core/Inc/PCA9685.h at line 252 you have it as 'float *'

The same variable  - _coeff - cannot have 2 different types; it cannot be both  'int' and 'float *'

 

#FileLineColumn