| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
 Използване на указатели в С
Пробвам се да правя матрично умножение на С за ПИК,но нещо не мога да разбера от къде ми идва грешката в следната програмка която съчиних:
#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.  Някой може ли даде идея де бъркам щото втори час вече се мъча и издивявам а не мога да намеря нейде пример.Чета една книжка "Език за програмиране С" на Богданов и Мустакеров,чета и хелпа на CCS-a но нещо не мога да разбера де правя грешка

|
| Пет Мар 30, 2007 8:56 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Ами не виждам причина да не работи.
Прилича като компилатора да омазва нещо.
Виж така е по прегледно написано. Виж какво ще се получи.
Имам някакъв спомен за проблем с някой от компилаторите при който такъв запис нещо не се възприемаше правилно. Пробвай за всеки случай и така [/quote]
|
| Пет Мар 30, 2007 9:25 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Пробвах и двата варианта - няма ефект
|
| Пет Мар 30, 2007 9:38 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
 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.  Някой може ли даде идея де бъркам щото втори час вече се мъча и издивявам а не мога да намеря нейде пример.Чета една книжка "Език за програмиране С" на Богданов и Мустакеров,чета и хелпа на 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;
....

|
| Пет Мар 30, 2007 9:54 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
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};  По добре късно от колкото никога 
|
| Пет Мар 30, 2007 10:13 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
|
| Пет Мар 30, 2007 10:16 pm |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Одъртяваш  .
|
| Пет Мар 30, 2007 11:23 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Ще се поправи това.
За лятото ще си хвана младо гадже 
|
| Пет Мар 30, 2007 11:31 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Крехката агнешка хапка е винаги за предпочитане пред старата пастърма !
И отново един въпрос от указателите :
#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];
}
Целта ми е да се науча са работя с указателите,но нещо малко баира е стръмен.Въпроса съм го написал на реда дето ме тормози и моля някой който има идея какво се получава с указателя *р да каже мнението си.
|
| Съб Мар 31, 2007 9:29 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
for( i>=1;i<=7;i++) 
|
| Съб Мар 31, 2007 10:29 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
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); // е те тука каква аджеба остава стойността на *р ???
има се в предвидведнага след този ред
|
| Съб Мар 31, 2007 10:44 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Проблема идва от към Майкрочипската боза - когато се компилира проекта и се изтрие паметта (clear memory) някой операции с масиви изобщо не се изпълняват  .При повторно компилиране се изпълняват.При мен версията е 7.42.Утре мисля да сложа 7.52(последната) и пак ще видим какво ще се получи
|
| Съб Мар 31, 2007 11:07 pm |
|
 |
|
tropper
Ранг: Новодошъл
Регистриран на: Вто Сеп 20, 2005 10:01 pm Мнения: 128 Местоположение: София
|
Какво прави:
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-то не е много различно.
_________________късото съединение прави силата ------------------------------- http://www.zahranvane.com/
|
| Съб Мар 31, 2007 11:31 pm |
|
 |
|
lz
Ранг: Новодошъл
Регистриран на: Пет Фев 02, 2007 2:57 pm Мнения: 139 Местоположение: София
|
(*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++)
_________________ LZ
|
| Съб Мар 31, 2007 11:43 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Kато повдигна темата, на тази страница има нещо интересно относно пре- и постинкрементирането при работа с пойнтери. Може да представлява интерес за някой.
Частта е Pointer arithmetics
http://cplusplus.com/doc/tutorial/pointers.html
|
| Съб Мар 31, 2007 11:52 pm |
|
|