| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Използване на указатели в С http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3971 |
Страница 1 от 3 |
| Автор: | Ки4о [ Пет Мар 30, 2007 8:56 pm ] |
| Заглавие: | Използване на указатели в С |
Пробвам се да правя матрично умножение на С за ПИК,но нещо не мога да разбера от къде ми идва грешката в следната програмка която съчиних: #include <18F448.H> #include <stdio.h> #include <math.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=10000000) struct record { int data [2][2]; int data1 [2][2]; }m,n; struct record *p; struct record *q; void main() { p=&m; q=&n; (*p).data[1][1]=1; (*p).data[1][2]=2; (*p).data[2][1]=3; (*p).data[2][2]=4; (*q).data1[1][1]=((*p).data[1][1]+2); (*q).data1[1][2]=((*p).data[1][2]+2); (*q).data1[2][1]=((*p).data[2][1]+2); //това не се изпълнява (*q).data1[2][2]=((*p).data[2][2]+2);//това -//- } Първия масив data си приема стойностите,втория data1 се изпълняват само първите 2 реда тези които не ми се изпълняват в тези клетки се получава стоиност 2( и във двете),вместо 5 и 6. |
|
| Автор: | Nikola Kirov [ Пет Мар 30, 2007 9:25 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Ами не виждам причина да не работи. Прилича като компилатора да омазва нещо. Виж така е по прегледно написано. Виж какво ще се получи.
Имам някакъв спомен за проблем с някой от компилаторите при който такъв запис нещо не се възприемаше правилно. Пробвай за всеки случай и така
|
|||||||||||||||||||
| Автор: | Ки4о [ Пет Мар 30, 2007 9:38 pm ] |
| Заглавие: | |
Пробвах и двата варианта - няма ефект |
|
| Автор: | ps66 [ Пет Мар 30, 2007 9:54 pm ] | |||||||||
| Заглавие: | Re: Използване на указатели в С | |||||||||
това да не ти е БЕЙСИК масивите ти са [2] .. те. индексите ти трябва да са [0] и [1] (*p).data[0][0]=1; (*p).data[0][1]=2; (*p).data[1][0]=3; (*p).data[1][1]=4; .... |
||||||||||
| Автор: | Ки4о [ Пет Мар 30, 2007 10:13 pm ] |
| Заглавие: | |
void main() { p=&m; q=&n; (*p).data[0][0]=1; (*p).data[0][1]=2; (*p).data[1][0]=3; (*p).data[1][1]=4; (*q).data1[0][0]=(*p).data[0][0]+2; (*q).data1[0][1]=(*p).data[0][1]+2; (*q).data1[1][0]=(*p).data[1][0]+2; (*q).data1[1][1]=(*p).data[1][1]+2; } Да това вече работи ! 10х ps66 Сега се усетих че data[3]={0,1,2}; |
|
| Автор: | Nikola Kirov [ Пет Мар 30, 2007 10:16 pm ] |
| Заглавие: | |
Задачка за наблюдателност. Не мога да повярвам че не го видях |
|
| Автор: | Dimitar [ Пет Мар 30, 2007 11:23 pm ] |
| Заглавие: | |
Одъртяваш |
|
| Автор: | Nikola Kirov [ Пет Мар 30, 2007 11:31 pm ] |
| Заглавие: | |
Ще се поправи това. За лятото ще си хвана младо гадже |
|
| Автор: | Ки4о [ Съб Мар 31, 2007 9:29 pm ] |
| Заглавие: | |
Крехката агнешка хапка е винаги за предпочитане пред старата пастърма ! И отново един въпрос от указателите : #include <18F448.H> #include <stdio.h> #include <math.h> #include <stddef.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=10000000) struct period { int data [7];}m; struct period *p; struct period1 { int data1 [7];}n; struct period1 *q; int i,j; int8 value_1; void main() { value_1=0x42; p=&m; q=&n; j=((int)(value_1/0x09)); // правим закръгление (*p).data[0]=j; // указваме че 0-вата стойност е j // и от 1 до седма правим цикъл for(i>=1;i<=7;i++){ (*p++).data[i]=(((*--p).data[i-1])+j); // е те тука каква аджеба остава стойността на *р ??? }; (*q).data1[0]=(*p).data[0]; (*q).data1[1]=(*p).data[1]; (*q).data1[2]=(*p).data[2]; (*q).data1[3]=(*p).data[3]; (*q).data1[4]=(*p).data[4]; (*q).data1[5]=(*p).data[5]; (*q).data1[6]=(*p).data[6]; (*q).data1[7]=(*p).data[7]; } Целта ми е да се науча са работя с указателите,но нещо малко баира е стръмен.Въпроса съм го написал на реда дето ме тормози и моля някой който има идея какво се получава с указателя *р да каже мнението си. |
|
| Автор: | HCL [ Съб Мар 31, 2007 10:29 pm ] |
| Заглавие: | |
for(i>=1;i<=7;i++) |
|
| Автор: | Ки4о [ Съб Мар 31, 2007 10:44 pm ] |
| Заглавие: | |
for(i>=1;i<=7;i++) ->for(i>=1;i<8;i++) Това го коригирах,но не е грешката дето ме мъчи. ако след (*p++).data[i]=(((*--p).data[i-1])+j);се добави (*p++); май има надежда да се получи,но въпроса си остава: (*p++).data[i]=(((*--p).data[i-1])+j); // е те тука каква аджеба остава стойността на *р ??? има се в предвидведнага след този ред |
|
| Автор: | Ки4о [ Съб Мар 31, 2007 11:07 pm ] |
| Заглавие: | |
Проблема идва от към Майкрочипската боза - когато се компилира проекта и се изтрие паметта (clear memory) някой операции с масиви изобщо не се изпълняват |
|
| Автор: | tropper [ Съб Мар 31, 2007 11:31 pm ] |
| Заглавие: | |
Какво прави: for(i>=1;i<=7;i++) в мястото за инициализация? Според мен ... нищо особено /повтарям HCL/ При положение че имаш следната декларация: struct period { int data [7];}m; struct period *p; struct period1 { int data1 [7];}n; struct period1 *q; .... p=&m; ..... с операторите: --p p++ има смисъл да работиш ако сочат към част от масив от структури period. Такъв не виждам да имаш. Има опасност да пишеш където не трябва. p++ ти мести поинтера със sizeof(period) Тук: (*p++).data=(((*--p).data[i-1])+j); ще се изпълни първо дясната част, поитера "п" ще се намали преди всичко останало и ще отиде на майната си в адресното пространство. След изпълнението на присвояването, т.е. на края на израза, ще се увеличи и ще се върне в изходна позиция. Самият израз ще се извърши с клетки от намелното "п" (--p). [i]Ако бъркам, извинете ме. Програмирам на PC, но все пак си мисля че C-то не е много различно. |
|
| Автор: | lz [ Съб Мар 31, 2007 11:43 pm ] |
| Заглавие: | |
(*p++).data=(((*--p).data[i-1])+j); стойноста на 'p' след този израз няма да се промени for(i>=1;i<=7;i++) и тук има нещо гнило i>=1 ще даде като резултат 0 или 1, но няма да промени, т.е. да инициализира 'i' предполагам е мислено да е for(i=0;i<=7;i++) |
|
| Автор: | HCL [ Съб Мар 31, 2007 11:52 pm ] |
| Заглавие: | |
Kато повдигна темата, на тази страница има нещо интересно относно пре- и постинкрементирането при работа с пойнтери. Може да представлява интерес за някой. Частта е Pointer arithmetics http://cplusplus.com/doc/tutorial/pointers.html |
|
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|