2014-01-26 9 views
3

Я пытаюсь указать размер массива Char внутри if-else в зависимости от количества строк в файле. Но когда я пытаюсь использовать его впоследствии, он дает ошибку: «массив необъявленная»Почему я не могу объявить массив char в IF-Else?

FILE *f=fopen("G:\\workspaceC\\small1.txt","r"); 

while((c=fgetc(f))!=EOF) 
{ 
    if(c=='\n') 
     no_of_lines++; 
} 
printf("no_of_lines: %d",no_of_lines); 
int fclose(FILE *f); 

if(no_of_lines<10){ 
    char b[30]; 
} 
else if(no_of_lines>10 && no_of_lines<15){ 
    char b[60]; 
} 
else{ 
    char b[106]; 
} 

for(z=0;z<size;z++) 
    { 
     if(c==b[z]) ///////Here it gives error: "b undeclared" 
     { 
      flag=1; 
      break; 
     } 
    } 
+2

Вы можете - вы показали, как это сделать. Проблема в том, что область массива - это блок, в котором вы его объявляете. И вы не можете получить доступ к переменной вне этих блоков. Также обратите внимание, что вы объявляете 'fclose()' - и вам не нужно это делать, потому что '#include ' делает это, а не вызывает его, чтобы закрыть файл. –

+0

'int fclose (FILE * f);' -> 'fclose (f);' – BLUEPIXY

+0

Кстати, вы подсчитываете количество строк, а затем выделяете больше или меньше байтов в зависимости от количества строк, а не от того, сколько строк находятся. Возможно, вам стоит подумать довольно внимательно о том, что вы делаете. –

ответ

2

массив, объявленная внутри блока if станет местный в блоке. С технической точки зрения его объем ограничивается только блоком if. Вот почему вы получаете ошибку. Переместите объявление за пределы блока.

Есть больше проблем, хотя:

  1. Вы прочитали весь файл первым, чтобы выбрать количество линий и выбросить все данные, которые вы читаете.
  2. Где вы инициализируете содержимое массива? Из-за этого у вас будут проблемы.

Поэтому лучше всего использовать API файлов, чтобы сначала найти размер файла, динамически выделить место для этого, прочитать содержимое в динамически распределенное пространство и обработать данные соответствующим образом.

+0

Чтобы добавить к этому, OP, вероятно, нуждается в VLA, динамическом распределении или еще лучше - просто объявите массив максимально возможного размера. 106 байтов - ничто. –

+0

Но тогда как я могу назначить размер? – user3213918

+0

@ user3213918: Зачем беспокоиться? Сколько памяти у вашей машины? Больше, чем мегабайт, я держал пари (вероятно, 4-16 ГБ). Таким образом, выделение 4096 байт для 'b' действительно не будет очень сильно обманывать вашу машину. Не волнуй глупый материал.Если вы должны беспокоиться об этом, тогда выберите размер условно ('int size;'), затем 'int b [size];' - массив переменной длины VLA. Конечно, предполагается, что ваш компилятор не более 15 лет устарел (для C99 требуется поддержка VLA). Если вы застряли в 25-летней деформации времени (C89), то у вас нет VLA, и вам нужно использовать 'malloc()' и 'free()' вместо этого. –

1

----> В операторе IF-ELSE выделите память вместо объявления массива.

  1. символ * обр
  2. malloc((sizeof(char)*30/60/106)
2

Вы объявили массив со б в if блоке. Таким образом, это видно только для блока if. И он не может быть виден вне блока if.

Если вы измените код, как указано ниже, вы достигнете того, чего хотите.

int size; 
if(no_of_lines<10){ 
    size = 30; 
} 
else if(no_of_lines>10 && no_of_lines<15){ 
    size = 60; 
} 
else{ 
    size = 106; 
} 
char b[size]; 
+0

Он работал идеально. пропустил эту логику :) Спасибо большое – user3213918

+0

@ user3213918 Это очень плохое решение! В соответствии со стандартом он не должен работать (и да, я знаю, что на самом деле он работает в gcc, но это не значит, что он будет работать в каждой среде). Массив должен быть инициализирован константой (значением или постоянной переменной)! –

0

Вы объявили свой массив в блочном коде {}. Независимо от того, находится ли этот блок в инструкции if или нет, вы можете получить доступ к этому массиву только в этом блоке.

Если вы хотите динамически изменять размер массива, объявите указатель в начале функции и затем динамически выделяйте для него память (например, используя malloc). Тем не менее, кажется, что в вашем случае вы можете просто объявить массив и предоставить ему максимальный размер, который вам понадобится.

Смежные вопросы