2024-03-26 12:49 PM
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)
Solved! Go to Solution.
2024-03-27 07:26 AM - edited 2024-04-02 02:53 AM
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
So it's telling you that you have two different declarations of _coeff:
The same variable - _coeff - cannot have 2 different types; it cannot be both 'int' and 'float *'
#FileLineColumn
2024-03-26 01:16 PM
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
2024-03-26 01:19 PM
Sorry, now I ve made the repo public.
Can you please check ?
2024-03-26 01:31 PM
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
2024-03-27 06:41 AM
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
| ^~~~~~
2024-03-27 07:26 AM - edited 2024-04-02 02:53 AM
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
So it's telling you that you have two different declarations of _coeff:
The same variable - _coeff - cannot have 2 different types; it cannot be both 'int' and 'float *'
#FileLineColumn