LINUX.ORG.RU

Матрицы в С


0

0

Необходимо забить числа в матрицу 9х9. Но почему-то циклы работают не
правильно. Судя по выводу программы обращение к последнему элементу
строки происходит по два раза. Как следствие, отсутствуют числа 9,
19, 29... И последние несколько ячеек остаются пустыми. Кто мне
объяснит, что я не так сделал? Есть смутное ощущение, что я не понял
насчет локальных переменных и области действия, но курение манов не
помогло.

# include <stdio.h>

int field[9][9];

void init_fields (void) {
	int horizontal = 0;
	int vertical = 0;
	int zahl = 0;
	int i;
	int j;
	for (i = 1; i < 10; i++) {
		for (j = 1; j < 10; j++) {
			field[vertical][horizontal] = zahl++;
			horizontal++;
		}
		horizontal = 0;
		vertical++;
	}
}

void print_ships (void) {
	int horizontal = 0;
	int vertical = 0;
	int i;
	int j;
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++) {
			printf (" %d \n", field[vertical][horizontal]);
			horizontal++;
		}
		horizontal = 0;
		vertical++;
	}
}

int main () {
    init_fields();
    print_ships();
    printf (" %d \n", field[0][7]);
    printf (" %d \n", field[0][8]);
    printf (" %d \n", field[0][9]);
    printf (" %d \n", field[0][10]);
    printf (" %d \n", field[0][86]);
    printf (" %d \n", field[0][90]);
    printf (" %d \n", field[0][95]);
}

# include <stdio.h>

int field[9][9];

void
init_fields (void)
{
  int zahl = 0;
  int i;
  int j;
  for (i = 0; i < 9; i++)
    {
      for (j = 0; j < 9; j++)
        {
          field[i][j] = zahl++;
        }
    }
}

void
print_ships (void)
{
  int i;
  int j;
  for (i = 0; i < 9; i++)
    {
      for (j = 0; j < 9; j++)
        {
          printf (" %d \n", field[i][j]);
        }
    }
}

int
main ()
{
  init_fields ();
  print_ships ();
}

Reset ★★★★★
()

За яйца за такой код надо подвешивать.

Индексы идут от 0 до 8. Что ты хотел распечатать здесь? printf (" %d \n", field[0][10]);

А тут вообще переполнение:

printf (" %d \n", field[0][86]); printf (" %d \n", field[0][90]); printf (" %d \n", field[0][95]);

Reset ★★★★★
()

 include <stdio.h>

int field[9][9];

void init_fields (void) {
	int zahl = 0;
	int i;
	int j;
	for (i = 0; i < 9; i++) {
		for (j = 0; j < 9; j++) {
			field[i][j] = zahl++;
		}
	}
}

void print_ships (void) {
	int i;
	int j;
	for (i = 0; i < 9; i++) {
		for (j = 0; j < 9; j++) {
			printf ("%d\t", field[i][j]);
		}
		printf("\n");
	}
}

int main () {
    init_fields();
    print_ships();
}

McPi% ./test            
0        1        2        3        4        5        6        7        8
9        10      11      12      13      14      15      16      17
18      19      20      21      22      23      24      25      26
27      28      29      30      31      32      33      34      35
36      37      38      39      40      41      42      43      44
45      46      47      48      49      50      51      52      53
54      55      56      57      58      59      60      61      62
63      64      65      66      67      68      69      70      71
72      73      74      75      76      77      78      79      80

а что у тебя в конце мэйна с филдами делается, я не понял

Pi ★★★★★
()
Ответ на: комментарий от Reset

Переполнения нет. Просто я перескакиваю на строку ниже. Твой код работает, но он досчитывает только до 80. А мне нужно 100 элементов. А вот если

int field[10][10]

и

i<10 j<10

то все работает (0...99). Но я не догоняю почему О_о

Gregon
() автор топика
Ответ на: комментарий от max_posedon

Как так - из 9 элементов? от 0 до 9 - 10 чисел. Соответственно

int[9][9]

должен содержать 100 элементов от 0 до 99. Или я туплю?

Gregon
() автор топика
Ответ на: комментарий от fukas

>> int x[9]; //массив из 9 элементов от 0 до 8!

Почему 9 элементов? Куда делся элемент 9? (0,1...7,8,9)

Gregon
() автор топика
Ответ на: комментарий от Legioner

9 это количетво элементов а не индекс последнего. int[9][9] содержит 81 элемент.

Спасибо, Легионер! Хоть кто-то объяснил, в чем прикол. А я уже все маны скурил...

Gregon
() автор топика
Ответ на: комментарий от Gregon

> int[9][9]

> должен содержать 100 элементов от 0 до 99. Или я туплю?

Число в скобках - количество элементов в массиве. int[9] - девять элементов в массиве (с индексами от 0 до 8), int[10] - десять (индексы от 0 до 9), ну и т.д.

smh ★★★
()
Ответ на: комментарий от Gregon

>Переполнения нет. Просто я перескакиваю на строку ниже.

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

Pi ★★★★★
()
Ответ на: комментарий от Gregon

блин, ты эти маны нихера не читал! курил - да, не спорю, но не читал!! в любой книге по Си ясно сказано:

1. синтаксис объявления массива:

ТИП ИМЯ [КОЛ-ВО_ЭЛЕМЕНТОВ];

2. обращение к элементу массива:

ИМЯ [ИНДЕКС]

ИНДЕКС = 0 .. КОЛ-ВО_ЭЛЕМЕНТОВ-1

anonymous
()

После всего что ту написали, скажу: работайте с одномерными массивами:

int arrTwo[10][10];
int arr[100];

=>

arrTwo[2][8] тоже что и arr[2*10+8]

wfrr ★★☆
()
Ответ на: комментарий от wfrr

>После всего что ту написали, скажу: работайте с одномерными массивами:

угу... опережая вопрос "почему" отвечу... память линейна (точнее виртуальная адресация), посему все ваши хитрые телодвижения по приданию измерений для машины побоку :)

Deleted
()
Ответ на: комментарий от Deleted

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

theos ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.