ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
52852 Топик полностью
ReAl (03.03.2006 17:04, просмотров: 1) ответил blackbit на Ответ:
Чтобы отступать??? Ну и что ты будешь делать, если компиялтор отступит, и проинтерпретирует x[i][j] как-то по-другому? http://www.caxapa.ru/mcu/wwwboard.html?id=52827
А выделение подмассива... В действительно общем случае сделать вообще ничего нельзя. Я же начал с примера выделения полдмассива.
unsigned char a[10][20];

void foo(void) {
	unsigned char i,j;
	for( i=0; i < sizeof(a)/sizeof(a[0]); ++i)
		for( j=0; j < sizeof(a[0])/sizeof(a[0][0]); ++j)
			a[i][j] += 20;
}

void foo1(void) {
	unsigned char i,j;
	for( i=0; i < sizeof(a)/sizeof(a[0]); ++i) {
		unsigned char *p = a[i]; // ВЫДЕЛЕНИЕ ОДНОМЕРНОГО ПОДМАССИВА В ДВУМЕРНОМ МАССИВЕ
		for( j=0; j < sizeof(a[0])/sizeof(a[0][0]); ++j)
			p[j] += 20;
	}
}
До сих пор ещё многие С-компиляторы не умеют в цикле в функции foo() вынести умножение на размер строки из внутреннего цикла и запись как в функции foo1() им крепко помогает. А вот запись в первой функции *(*(a+i)+j) += 20; вместо a[i][j] генерируемый код не меняет. К счастью, писатели компиляторов в большинстве своём стандарт блюдут :-)