Я относительно новичок в C и не могу понять, что не так с кодом?Правильный способ передачи массива в функцию?
Во время компиляции я получаю 2 предупреждения и ошибку дампа ошибки сегментации во время выполнения. Может ли кто-нибудь объяснить, почему? Я запускаю Ubuntu как виртуальную машину. И это правильный способ объявить/передать массив в функцию?
#include <stdio.h>
//Loop handlers
int i, j, m, n;
int c;
int cap[26];
//Funtions prototype
void countingChars(void);
void vertcalHistogram(int [], int size); //Warning: expected ‘int *’ but argument is of type ‘int’ (helloworld)
void dashes(void);
int main (void)
{
countingChars();
vertcalHistogram(cap[26], 26); //Warning: passing argument 1 of ‘vertcalHistogram’ makes pointer from integer without a cast [enabled by default] (helloworld)
//dashes();
getchar();
return 0;
}
void countingChars(void)
{
while((c = getchar()) != EOF)
{
if(c >= 65 && c <= 90)
++cap[c - 65];
if(c >= 97 && c <= 122)
++cap[c - 97];
for(i = 0; i < 26; i++)
printf("%d", cap[i]);
printf("\n");
}
}
void dashes(void)
{
printf("\n");
printf("\n");
for(i = 0; i < 40; i++)
printf("_");
printf("\n");
for(i = 0; i < 40; i++)
printf("_");
}
void vertcalHistogram(int cap[], int size)
{
for(i = 0; i < size; i++)
{
printf("||");
for(j = 0; j < cap[i]; j++)
printf("*");
printf(" ~~ %d", cap[i]);
printf("\n");
}
}
Прежде всего прекратить использование [количество магии] (https://en.wikipedia.org/wiki/Magic_number_%28programming%29). Затем узнайте о ['isalpha'] (http://en.cppreference.com/w/c/string/byte/isalpha) и [других связанных функциях] (http://en.cppreference.com/w/c/ строка/байт # Character_classification). –
Если вы получаете предупреждения о компиляции, вы должны показать их (желательно, когда их генерирует компилятор). Вы должны использовать локальные переменные, а не глобальные, по крайней мере для 'i',' j', 'm',' n' и 'c' - я не изучил' cap'. Однобуквенные глобальные переменные почти неизбежно поддельны. Глобальная переменная должна иметь значащее имя (оно используется во многих местах), и вы не можете справиться с этим в одной букве. –
'vertcalHistogram (cap [26], 26);' - вы передаете элемент за пределами массива в виде массива. Неправильно. Вам нужна 'vertcalHistogram (cap, 26);'. Это объясняет предупреждения компиляции и дамп ядра. Передача произвольного, неопределенного (но возможно, нулевого) целого числа в качестве указателя приведет к сбоям. Прислушайтесь к компилятору; исправьте предупреждения перед запуском кода. –