Marsyk писал(а):Здравствуйте может кто знает, вообще какие есть программы кроме вот этих: PonyProg2000, ProgCode, IC-Prog 1.06.
Если речь об AVR, то есть еще AVReal, на мой взгляд один из лучших программаторов для AVR.
Vergilium писал(а):Здраствуйте. Подскажите пожалуйста как мне сдвинуть в лево двумерный масив. Вот так вот не совсем коректно работает.
Код: Выделить всё
for (i=0;i<=7;i++)
{
x=str[i][0]; //Запоминаем нулевой элемент каждой i-ой строки
for (j=0;j<4;j++)
{
str[i][j]=str[i][j+1]; //Доходим до предпоследнего элемента
}
str[i][j]=x; //Последнему присваиваем значение нулевого
}Код: Выделить всё
#define ROWS 4
#define COLS 7
int i, tmp, *iptr, array[ROWS][COLS];
iptr = (int *)array;
tmp = *iptr;
for (i=0; i<ROWS*COLS-1; ++i)
iptr[i] = iptr[i+1];
iptr[i] = tmp;Код: Выделить всё
1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16Код: Выделить всё
2, 3, 4, 5
6, 7, 8, 9
10, 11, 12, 13
14, 15, 16, 1
А вот так не лучше? Код:
for (i=0;i<=7;i++)
{
x=str[i][0]; //Запоминаем нулевой элемент каждой i-ой строки
for (j=0;j<4;j++)
{
str[i][j]=str[i][j+1]; //Доходим до предпоследнего элемента
}
str[i][j]=x; //Последнему присваиваем значение нулевого
}
Vergilium писал(а):В таком случае сдвигатся будут части массива по отдельности, а мне нужно чтоб элемент str[0][0] стал последним элементом всего массива, а не последним первой части(str[0][4]).
Мой алгоритм в принцыпе работает только есть один косяк. Обьяснять долго вот лучше раз увидеть.
Код: Выделить всё
x = str[0][0];
...
str[7][4]=x; Код: Выделить всё
if(i<7) //Пока не достигли самой последний строки
str[i][j]=str[i+1][0]; //Последний элемент каждой i-й строки
else //Достигли самого последнего элемента, так как
str[i][j]=x; //и по i, и по j максимум (7 и 4)Ничего магического, нужно только немного "поработать компилятором"... Итак, предположим программист помещает в тексте программы объявления переменных:Vergilium писал(а):...никак не могу понять указатели, нет что это такое я знаю ну вот использовать не могу.
Код: Выделить всё
int i;
int tmp;
char *s = "Temp= xxx°C";
int j;Код: Выделить всё
.DATA
0x0000 dw ? ;int i;
0x0002 dw ? ;int tmp;
0x0004 db 'Temp= xxx°C',0 ;char *s=...;
0x0010 dw ? ;int j;Код: Выделить всё
put_3chr:
lds si,strOff ; DS:SI points to static string
mov [si+6],'0' ; put 1st char to string
mov [si+7],'2' ; put 2nd char to string
mov [si+8],'0' ; put 3rd char to stringКод: Выделить всё
use_ptr_twice:
mov si,strptr1 ; DS:SI points to string 1
mov [si+6],'0' ; put 1st char to string
mov [si+7],'2' ; put 2nd char to string
mov [si+8],'0' ; put 3rd char to string
mov si,strptr2 ; DS:SI points to string 2
mov [si+6],'0' ; put 1st char to string
mov [si+7],'2' ; put 2nd char to string
mov [si+8],'0' ; put 3rd char to string? А если массив не просто большой, а очень большой, а оперативки впритык, да она ещё и фрагментирована, но суммы фрагментов хватит, чтобы разместить массив по частям, то массив не будет размещён, так как нельзя его разместить как непрерывное целое?Yellow Tiger писал(а):все массивы располагаются в памяти сплошными блоками и упорядоченно (младшие индексы пишутся последними),... а раз так, то ко всем элементам можно обратиться как к одномерному массиву, лишь применив другой указатель.
Код: Выделить всё
int mass[10];
int *m=&mass[0];
for (int i=0; i<10; i++)
temp=m[i];Код: Выделить всё
iptr = &array[0][0];
tmp = *iptr;
for (i=0; i<ROWS*COLS-1; ++i)
iptr[i] = iptr[i+1];
iptr[i] = tmp;Код: Выделить всё
iptr = (int *)array;Vergilium писал(а):Но я никак не могу решить проблему того что в моей бегущей строке при сдвиге символы проходят первую матрицу дважды. Может в схеме косяк?
Код: Выделить всё
if(i<7) //Пока не достигли самой последний строки
str[i][j]=str[i+1][0]; //Последний элемент каждой i-й строки
else //Достигли самого последнего элемента, так как
str[i][j]=x; //и по i, и по j максимум (7 и 4)Есть. Если нужно определить размер памяти, отведенной под массив, то так:Vergilium писал(а):...как можно опредилять размер массива? ... Есть ли какаеть ф-ция которая это определяет?
Код: Выделить всё
int array[7][5], arr_size;
arr_size = sizeof(array);Код: Выделить всё
int array[7][5], arr_len;
arr_len = sizeof(array) / sizeof(array[0][0]);Я ведь всё это уже описал выше. Во всяком случае я написал всё, что можно было написать за то время, которым я располагал - стремился дать основу. Остальное будет правильнее изучить самостоятельно, вооружившись хорошей книгой, компилятором (хорошо бы, чтобы он выдавал ассемблерный листинг) и терпением. Вот если в книге попадутся непреодолимые места, тогда нужно звать на помощь "зал".Synergetik писал(а):1. А если ... оперативки впритык, да она ещё и фрагментирована
2. То есть увеличивая указатель на единицу ... компилятор сам перемещает указатель на то место, где находится следующий элемент, а не следующая ячейка в оперативке?
3. ...с точки зрения юзера и тот и другой вариант практически неразличимы
"Принцип" прост - адрес начала массива помещается в указатель, а чтобы компилятор понимал, как работать с этим указателем, приходится насильно приводить тип данных из двумерного массива в одномерный (ведь дальнейшая работа с данными будет вестись именно как с одномерным массивом).Synergetik писал(а):...буду очень благодарен, если объясните принцип работы этой строки