Array subscript is not an integer ошибка

The deviation function throws me the following error: "Array subscript is not an integer". If you can help me locate the cause of error I'll appreciate it. float average(float data[], int n) { ...

C11dr 6.5.2.1 Array subscripting … «One of the expressions shall have type ‘‘pointer to complete object type’’, the other expression shall have integer type, and the result has type ‘‘type’’.» …

With [], you get to do:

// pointer_type[integer_type]
float data[];
int n;
float total;
total = data[n];

// or the unconventional equivalent
// integer_type[pointer_type]
total = n[data];  // But let's leave that for another post

// Instead the OP did
// pointer_type[pointer_type]
// and received error: "Array subscript is not an integer"
float *p;
total = data[p];

The usage of float is not the issue here, but the usage of a pointer.

An integer type includes types int, unsigned, size_t, long, etc.


I think the OP wanted the following (or something like this)

float deviation(float data[], int n) {
  if (i <= 0) return 0;
  float data_average = average(data, n);
  float total = 0.0;  // don't forget to set to 0.0
  float *p = data;

  while (p < (data + n)) {
    total += (*p - data_average) * (*p - data_average);
    p++;
    }
  return sqrt(total / n);  // div by 0 averted
}

following this previous question Malloc Memory Corruption in C, now i have another problem.
I have the same code. Now I am trying to multiply the values contained in the arrays A * vc
and store in res. Then A is set to zero and i do a second multiplication with res and vc and i store the values in A. (A and Q are square matrices and mc and vc are N lines two columns matrices or arrays).
Here is my code :

    int jacobi_gpu(double A[], double Q[], 
           double tol, long int dim){
  int nrot, p, q, k, tid;
  double c, s;
  double *mc, *vc, *res;
  int i,kc;
  double vc1, vc2;

  mc   = (double *)malloc(2 * dim * sizeof(double));
  vc   = (double *)malloc(2 * dim * sizeof(double));
  vc   = (double *)malloc(dim * dim * sizeof(double));

  if( mc == NULL || vc == NULL){
    fprintf(stderr, "pb allocation matricren");
    exit(1);
  }

  nrot = 0;

  for(k = 0; k < dim - 1; k++){

    eye(mc, dim);
    eye(vc, dim);

    for(tid = 0; tid < floor(dim /2); tid++){
      p = (tid + k)%(dim - 1);
      if(tid != 0)
    q = (dim - tid + k - 1)%(dim - 1);
      else
    q = dim - 1;

      printf("p = %d | q = %dn", p, q);
      if(fabs(A[p + q*dim]) > tol){

    nrot++;
    symschur2(A, dim, p, q, &c, &s);


    mc[2*tid] = p;                                               vc[2 * tid] = c;
    mc[2*tid + 1] = q;                                           vc[2*tid + 1] = -s;
    mc[2*tid + 2*(dim - 2*tid) - 2] = p;                         vc[2*tid + 2*(dim - 2*tid)   - 2 ] = s;
    mc[2*tid + 2*(dim - 2*tid) - 1] = q;                         vc[2 * tid + 2*(dim - 2*tid) - 1 ] = c;



    }
    }

    for( i = 0; i< dim; i++){
      for(kc=0; kc < dim; kc++){
    if( kc < floor(dim/2)) {
      vc1 = vc[2*kc + i*dim];
      vc2 = vc[2*kc + 2*(dim - 2*kc) - 2];
    }else {
      vc1 = vc[2*kc+1 + i*dim];
      vc2 = vc[2*kc - 2*(dim - 2*kc) - 1];
    }
    res[kc + i*dim] = A[mc[2*kc] + i*dim]*vc1 + A[mc[2*kc + 1] + i*dim]*vc2;
      }
    }

    zero(A, dim);

    for( i = 0; i< dim; i++){
      for(kc=0; kc < dim; k++){
    if( k < floor(dim/2)){
      vc1 = vc[2*kc + i*dim];
      vc2 = vc[2*kc + 2*(dim - 2*kc) - 2];
    }else {
      vc1 = vc[2*kc+1 + i*dim];
      vc2 = vc[2*kc - 2*(dim - 2*kc) - 1];
    }
    A[kc + i*dim] = res[mc[2*kc] + i*dim]*vc1 + res[mc[2*kc + 1] + i*dim]*vc2;
      }
    }


    affiche(mc,dim,2,"Matrice creuse");
    affiche(vc,dim,2,"Valeur creuse");

  }

  free(mc);
  free(vc);
  free(res);
  return nrot;
}

When i try to compile, i have this error :

    jacobi_gpu.c: In function ‘jacobi_gpu’:
jacobi_gpu.c:103: error: array subscript is not an integer
jacobi_gpu.c:103: error: array subscript is not an integer
jacobi_gpu.c:118: error: array subscript is not an integer
jacobi_gpu.c:118: error: array subscript is not an integer
make: *** [jacobi_gpu.o] Erreur 1

The corresponding lines are where I store the results in res and A :

res[kc + i*dim] = A[mc[2*kc] + i*dim]*vc1 + A[mc[2*kc + 1] + i*dim]*vc2;

and

A[kc + i*dim] = res[mc[2*kc] + i*dim]*vc1 + res[mc[2*kc + 1] + i*dim]*vc2;

Can someone explain me what is this error and how can i correct it?
Thanks for your help. ;)

  1. 11-06-2012


    #1

    prathiksa is offline


    Registered User


    array subscript is not an integer

    im getting the error when compiling the code…

    Code:

    float array[20];
    int last;
    array[last[array]];
    how to get red of this


  2. 11-06-2012


    #2

    std10093 is offline


    SAMARAS

    std10093's Avatar


    You have

    Code:

    array[last[array]];

    In general,if you are sure you want something like this,imagine it with numbers and arrays.It would be something like this
    if you want to access the index described by the last element of the array.
    So maybe you want to say


  3. 11-06-2012


    #3

    prathiksa is offline


    Registered User


    still the same error,i think may be its due to types of the integer variable and float arrays


  4. 11-06-2012


    #4

    std10093 is offline


    SAMARAS

    std10093's Avatar


    Have you initialized variable last? Can you please post the code you complied?


  5. 11-06-2012


    #5

    prathiksa is offline


    Registered User


    im just checking the syntax errors
    i have initialised int last = n-1;
    int *l ;
    l = &last;


  6. 11-06-2012


    #6

    std10093 is offline


    SAMARAS

    std10093's Avatar


    What is n?Where is the array you were talking about? :P
    Just post all the code you have (i consider it is small from what you say )
    Also it would be very kind of you if you could wrap your code in code tags.It is easy
    [key]/*Your code here*/[/key] Replace key with code in order this to work.

    EDIT : it is ok to say

    Code:

    int a=5;
    int* p;
    p=&a;

    Last edited by std10093; 11-06-2012 at 05:17 AM.


  7. 11-06-2012


    #7

    grumpy is offline


    Registered User


    Quote Originally Posted by prathiksa
    View Post

    still the same error,i think may be its due to types of the integer variable and float arrays

    Yes it is.

    Arrays can only be indexed using values that have integral type (char, int, long, unsigned, etc). They cannot be indexed using non-integral values (float as in your case, struct types, etc).

    There is also an obscure corner of C that causes «array[index]» and «index[array]» to be equivalent (assuming array is (well….) an array or a pointer, and index has integral type). Because of that, your expression «array[last[array]]» is equivalent to «array[array[last]]» which attempts to use array[last] as an index. In your code, array[last] is of type float so is not a valid index. Hence the compiler error.

    Right 98% of the time, and don’t care about the other 3%.

    If I seem grumpy or unhelpful in reply to you, or tell you you need to demonstrate more effort before you can expect help, it is likely you deserve it. Suck it up, Buttercup, and read this, this, and this before posting again.


  8. 11-06-2012


    #8

    std10093 is offline


    SAMARAS

    std10093's Avatar


    What i thought you wanted to do

    Code:

    #include <stdio.h>
    
    int main( int argc, char *argv[])
    {
      float array[5];
      int last = 4;
      array[0]=1.2;
      array[1]=1.3;
      array[2]=1.4;
      array[3]=1.5;
      array[4]=1.9;
    
      printf("%fn",array[last]);
    
      return(0);
    }

    grumpy is more experienced,so he is sure to have it better in his mind


  9. 11-06-2012


    #9

    iMalc is offline


    Algorithm Dissector

    iMalc's Avatar


    You get rid of the error by fixing or removing the nonsense code.
    Explain what you really want to do and we’ll show you how to write code for it that makes sense.

    My homepage
    Advice: Take only as directed — If symptoms persist, please see your debugger

    Linus Torvalds: «But it clearly is the only right way. The fact that everybody else does it some other way only means that they are wrong»


Spotter

30 / 21 / 11

Регистрация: 09.11.2010

Сообщений: 240

1

02.05.2011, 20:31. Показов 8257. Ответов 12

Метки нет (Все метки)


Выдаёт на компиляции такую ошибку

error C2108: subscript is not of integral type
в чём проблема?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
 
    double mas[80][80], i, j;
    int n, m, k;
 
    printf("Enter size array: ");
    scanf("%d%d", &n, &m);
    printf("Enter array:nn");
    for(i=0; i<n; i++) {
        for(j=0; j<m; j++)
        {
            scanf("%f", &mas[i][j]);
        }
    }

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт С++

623 / 467 / 57

Регистрация: 28.01.2011

Сообщений: 605

02.05.2011, 20:33

2

Индексы массива должны быть целочисленного типа, а у вас i и j объявлены как double. Либо делайте приведение типов в цикле, либо объявляйте их как int.



0



1551 / 917 / 193

Регистрация: 26.03.2010

Сообщений: 3,105

02.05.2011, 20:34

3

И подключите stdio.h



0



Эксперт С++

1067 / 846 / 60

Регистрация: 30.04.2011

Сообщений: 1,659

02.05.2011, 20:45

4

Цитата
Сообщение от neske
Посмотреть сообщение

И подключите stdio.h

1. cstdio — по стандарту
2. Если работа в Студии, то она сама автоматом подключает.



0



Spotter

30 / 21 / 11

Регистрация: 09.11.2010

Сообщений: 240

02.05.2011, 20:55

 [ТС]

5

Ma3a, Сделал, как Вы сказали, компилируется, ввожу массив 3х3 действительных чисел, но при выводе этого массива, выводится огрмнейшое число, а не сам массив. Вот код вывода:

C
1
2
3
4
5
6
7
8
printf("Array before sortingnn");
    for(i=0; i<n; i++){
        for(j=0; j<m; j++)
        {
            printf("%f", mas[i][j]);
        }
        putchar('n');
    }

neske, Ну вообще-то, если вы не заметили, я только часть кода сюда скинул, где ошибка, всё у меня подключено.



0



ValeryLaptev

Эксперт С++

1067 / 846 / 60

Регистрация: 30.04.2011

Сообщений: 1,659

02.05.2011, 21:00

6

C++
1
printf("%f", mas[i][j]);

Здесь у тебя нет никаких пробелов между значениями. Поэтому все подряд выводится…



0



Эксперт С++

5038 / 2617 / 241

Регистрация: 07.10.2009

Сообщений: 4,310

Записей в блоге: 1

02.05.2011, 21:04

7

Цитата
Сообщение от ValeryLaptev
Посмотреть сообщение

1. cstdio — по стандарту

для Си++ да, для Си stdio.h, судя по коду, это Си

Цитата
Сообщение от ValeryLaptev
Посмотреть сообщение

2. Если работа в Студии, то она сама автоматом подключает.

нэ? и даже если так, то это не оправдание.



0



30 / 21 / 11

Регистрация: 09.11.2010

Сообщений: 240

02.05.2011, 21:05

 [ТС]

8

ValeryLaptev, Ни в этом дело, выводится вообще много цифр, и близко не похожих на те значения, которые я ввожу в массиве.



0



Эксперт С++

623 / 467 / 57

Регистрация: 28.01.2011

Сообщений: 605

02.05.2011, 21:06

9

Spotter, еще у вас массив типа double, а в scanf вы используете «%f» для ввода, ей требуется «%lf» для ввода double, так она не поймет(ну или поймет неправильно).



2



30 / 21 / 11

Регистрация: 09.11.2010

Сообщений: 240

02.05.2011, 21:20

 [ТС]

10

Ma3a, Спасибо, всё работает теперь правильно )) Ещё маленький вопрос (постоянно забываю такую мелочь, и сейчас никак вспомнить не могу), как правильно указать, сколько знаков после запятой выводить? )



0



Эксперт С++

623 / 467 / 57

Регистрация: 28.01.2011

Сообщений: 605

02.05.2011, 21:22

11

%.4f — выведет, например, 4 знака после запятой.



1



Эксперт С++

1067 / 846 / 60

Регистрация: 30.04.2011

Сообщений: 1,659

02.05.2011, 21:24

12

%10.6f — всего, после запятой



0



ivan777

2 / 1 / 3

Регистрация: 10.03.2010

Сообщений: 65

11.06.2011, 18:38

13

Spotter, Вот так:

C++
1
2
3
4
5
6
7
8
9
#include "stdafx.h"
#include <math.h>
#include <stdio.h>
int main()
{
    float l=9.5564;
    printf("x = %6.2f n",l);
return 0;
}

Где 6.2 отвечают за то сколько знаков вывести после комы, если написать 6.3 то выведет 3 знака после комы, еще можно писать 4.2 но не помню какая разница. Если у тебя число припустим 7.777 и вы выводите всего лишь 2 знака после комы то произойдет округление.



0



wvdk

New Member

  • Total Posts : 29
  • Reward points : 0
  • Joined: 2019/02/11 03:36:51
  • Location: 0
  • Status: offline

Hi lubin,
I am stuck with the following error while compiling a simple model with the SPI function block on an dsPIC33FJ256GP710A.

 when I use the SPI block and (by example) activate an input port to write data on the SPI, I get an error when compiling the code: «Array subscript is not an integer»

 If I check the generated code, the indeed, the array position is indicated as (by example)
array1[1.0]
instead of 
array1[1]

 I have been searching for the cause, but I cannot find the reason. I tried different blocksets (3.46, 3.47, 3.50), i tried different compilers (XC16 1.6, XC16 2.0) but without succes. I have the feeling it might also be something to do with settings in matlab/simulink itself, but I don’t succeed to find the root cause. Can you help me on this one?

Best regards,
Wim

Gort2015

Klaatu Barada Nikto

  • Total Posts : 6043
  • Reward points : 0
  • Joined: 2015/04/30 10:49:57
  • Location: 0
  • Status: offline

Re: Error: Array subscript is not an integer


2022/04/20 06:16:59

(permalink)

How did you declare array1 ?
array1[1.0] ???

 List the compiler output.

 int array1[100], j;

 j = array1[50];

mbrowning

USNA79

  • Total Posts : 2245
  • Reward points : 0
  • Joined: 2005/03/16 14:32:56
  • Location: Melbourne, FL
  • Status: offline

Re: Error: Array subscript is not an integer


2022/04/20 06:43:28

(permalink)

The OP didn’t declare the array, Matlab declared the array. The OP is asking support in the Matlab forum (usually Lubin) to help figure out out to make Matlab create legal code.

Lubin

Moderator

  • Total Posts : 558
  • Reward points : 5
  • Joined: 2007/03/31 07:38:15
  • Location: Bayonne, France
  • Status: offline

Re: Error: Array subscript is not an integer


2022/04/20 11:45:44

(permalink)

Hi Wim,

 Could you post a model that trig this issue ?

 This looks like an issue with generated code for the SPI peripheral. Using another compiler would not change anything. You might try using a different setting with the SPI peripheral which might not generate the faulty code.

 I am currently off, I could look at it in early May.
Thanks, Lubin

Lubin

Moderator

  • Total Posts : 558
  • Reward points : 5
  • Joined: 2007/03/31 07:38:15
  • Location: Bayonne, France
  • Status: offline

Re: Error: Array subscript is not an integer


2022/05/06 02:22:41

(permalink)

Hi Wim,

 I did not reproduced the issue on my side.
If you have a model example to upload, it might help to trig the problem and fix it.

 Lubin

Понравилась статья? Поделить с друзьями:
  • Armoury crate asus ошибка установки
  • Armoury crate asus ошибка службы
  • Armory create ошибка установки 102
  • Armory create ошибка 2005
  • Armorstatushud как изменить расположение