Консультация № 145931
04.10.2008, 06:55
0.00 руб.
0 3 2
Здравствуйте, уважаемые эксперты!
Впроцессе выполнгения программы в приложении, ни с того ни с сего переменные обнуляются. От чего такое может случаться?
Компилятор Borland C 3.1
Спасибо

Приложение:
Содержимое файла vvod.txt:
///начало
4 5 1 5 2 5 3 5 4 5
///конец :)

#include <stdio.h>
#include <conio.h>
#define n 10
struct list
{list *next, *pred; int data;};

void main ()
{int a[n][n], i,j, r, v, k, m, p=1;
list *och1, *och2;
och1=NULL;
och2=NULL;
FILE *fp, *fr;
clrscr ();
if ((fp=fopen ("vvod.txt","r"))==NULL) perror ("Cannot open vvod.txt!");
else
{
fr=fopen ("rez.txt","w");
fscanf(fp,"%d %d", &r, &v);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) a[i][j]=0;

for (i=1; i<=r; i++) //здесь уже k, r и p равны нулю
{
fscanf (fp,"%d %d", &k, &m);
a[k][m]=1;
a[m][k]=1;
}
}
}

Обсуждение

Неизвестный
04.10.2008, 09:11
общий
это ответ
Здравствуйте, LexXx!
Ну-таки это естественно.
Хотите фокус: поставьте массив а последним и эффект исчезнет .
Или по-другому, присваивайте значение 2345 - и именно это значение приобретут Ваши многострадальные переменные.
Дело в том, что в любом С нумерация элементов начинается с нуля, а Вы пробегаете при чтении значения j=1 ... 10.
То есть, присваиваете 10 значений УЖЕ 11-му "ряда" массива!!
А где он располагается? Конечно же за "концом" массива, то там, где Вы определили остальные элементы ...
С разрешает выходить за пределы массива в любую сторону
Неизвестный
04.10.2008, 20:24
общий
это ответ
Здравствуйте, LexXx!
Индексация массивов НАЧИНЕТСЯ С 0
А не с 1 как в вашем случае.
for (j=0;j<n;j++) for (i=0; i<r; i++)
попробуйте так. должно помочь.
Неизвестный
05.10.2008, 20:43
общий
Почему на один? На 10! (Целый ряд)
Форма ответа