Микроконтролери и електроника
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. 8O Някой може ли даде идея де бъркам щото втори час вече се мъча и издивявам а не мога да намеря нейде пример.Чета една книжка "Език за програмиране С" на Богданов и Мустакеров,чета и хелпа на CCS-a но нещо не мога да разбера де правя грешка
:(

Автор:  Nikola Kirov [ Пет Мар 30, 2007 9:25 pm ]
Заглавие: 

Ами не виждам причина да не работи.
Прилича като компилатора да омазва нещо.
Виж така е по прегледно написано. Виж какво ще се получи.
Код:
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;
}


Имам някакъв спомен за проблем с някой от компилаторите при който такъв запис нещо не се възприемаше правилно. Пробвай за всеки случай и така
Код:
p->(data[1][1])  = 1;
------------------
------------------
[/quote]

Автор:  Ки4о [ Пет Мар 30, 2007 9:38 pm ]
Заглавие: 

Пробвах и двата варианта - няма ефект

Автор:  ps66 [ Пет Мар 30, 2007 9:54 pm ]
Заглавие:  Re: Използване на указатели в С

Ки4о написа:
Пробвам се да правя матрично умножение на С за ПИК,но нещо не мога да разбера от къде ми идва грешката в следната програмка която съчиних:

#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. 8O Някой може ли даде идея де бъркам щото втори час вече се мъча и издивявам а не мога да намеря нейде пример.Чета една книжка "Език за програмиране С" на Богданов и Мустакеров,чета и хелпа на CCS-a но нещо не мога да разбера де правя грешка
:(


това да не ти е БЕЙСИК :)

масивите ти са [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}; :oops: По добре късно от колкото никога :wink:

Автор:  Nikola Kirov [ Пет Мар 30, 2007 10:16 pm ]
Заглавие: 

:) :) :)
Задачка за наблюдателност. :)
Не мога да повярвам че не го видях :)

Автор:  Dimitar [ Пет Мар 30, 2007 11:23 pm ]
Заглавие: 

Одъртяваш :D .

Автор:  Nikola Kirov [ Пет Мар 30, 2007 11:31 pm ]
Заглавие: 

Ще се поправи това.
За лятото ще си хвана младо гадже :)

Автор:  Ки4о [ Съб Мар 31, 2007 9:29 pm ]
Заглавие: 

Крехката агнешка хапка е винаги за предпочитане пред старата пастърма ! :D :D :D
И отново един въпрос от указателите :

#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) някой операции с масиви изобщо не се изпълняват 8O .При повторно компилиране се изпълняват.При мен версията е 7.42.Утре мисля да сложа 7.52(последната) и пак ще видим какво ще се получи

Автор:  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/