2016-10-30 2 views
0
static int myarray[2]={-1,234}; 
module_param_array(myarray,int,&arrayargc,0); 
MODULE_PARM_DESC(myarray,"Integer Array"); 

static int __init module_init_2(void) 
{ 
int i; 
    for(i=0;i< (sizeof myarray/sizeof(int));i++); 
{ 

printk(KERN_INFO "myarray[%d] is %d",i,myarray[i]); 

} 

Я пишу простой модуль, чтобы взять некоторые из командной строки input.During компиляции он дает предупреждениепредупреждения: индекс массива является выше границ массива [-Warray-оценка] в модуле

warning: array subscript is above array bounds [-Warray-bounds] 
printk(KERN_INFO "myarray[%d] is %d",i,myarray[i]); 

Почему это предупреждение, поскольку цикл, кажется, работает до i = 2, я видел некоторые вопросы по этому поводу, но это не помогло мне так много.

+1

вы забыли запятыми между строками '" Option # N ... "'. C принимает его как одну строку. Голосование закрывается как опечатка. – dasblinkenlight

+0

Даже не компилируется без предупреждения, говоря, что не так. –

+0

Я сделал это правильно. Теперь проблема в том, что программа печатает параметры, затем обходит m = getchar и прячет переходы к следующему printf. Не могли бы вы рассказать мне причину? –

ответ

3

В самом начале printf указаны три %s для трех строк, но вы предоставили только один строка для этого printf, и так авария.

Примечания от флюгеров комментария:

Помните, что C компилятор конкатенации строковых литералов, которые разделены только пробелами.

Это означает, что даже если вы написали три отдельные «Вариант № 1», «Вариант № 2» и т.д. в три линии, которые они до сих пор считаются только один строку (после конкатенации. Fix, что, добавив запятую конец каждой строки, чтобы предотвратить конкатенацию (и поэтому вы должны были бы три отдельных строк).

+0

Да, вы правы, я добавил ваш комментарий, который должен объяснить проблему OP намного яснее. – artm

+1

Мне нравится, как новички генерируют «творческие» ошибки, о которых вы никогда не подумали. Почти искусство. –

+0

Я сделал это правильно. Теперь проблема в том, что программа печатает параметры, затем обходит m = getchar и прячет переходы к следующему printf. Не могли бы вы рассказать мне причину? –

0

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

#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, char const *argv[]) { 
    int period, time; 

    const char micro_sec = 'u'; 
    const char mili_sec = 'm'; 
    const char sec = 's'; 

    printf("\nSelect unit of Time period: \n"); 

    printf("\nOption 1: %c for micro seconds\n" 
      "Option 2: %c for mili seconds\n" 
      "Option 3: %c for seconds\n", 
       micro_sec, mili_sec, sec); 

    printf("\nEnter unit of Time Period: "); 

    period = getchar(); 

    if (period == micro_sec || period == mili_sec || period == sec) { 
     printf("Enter Time Period: "); 

     if (scanf("%d", &time) != 1) { 
      printf("Error reading time!\n"); 
      exit(EXIT_FAILURE); 
     } 

     printf("\nUnit of time: %c\n", period); 
     printf("Time Period: %d\n", time); 

    } else { 
     printf("\nIncorrect unit of time entered.\n"); 
    } 

    return 0; 
}