Отговори на тема  [ 31 мнения ]  Отиди на страница 1, 2, 3  Следваща
Използване на указатели в С 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Пет Мар 30, 2007 8:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами не виждам причина да не работи.
Прилича като компилатора да омазва нещо.
Виж така е по прегледно написано. Виж какво ще се получи.
Код:
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]


Пет Мар 30, 2007 9:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Пробвах и двата варианта - няма ефект


Пет Мар 30, 2007 9:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 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. 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;
....

:)


Пет Мар 30, 2007 9:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Пет Мар 30, 2007 10:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
:) :) :)
Задачка за наблюдателност. :)
Не мога да повярвам че не го видях :)


Пет Мар 30, 2007 10:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Одъртяваш :D .


Пет Мар 30, 2007 11:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ще се поправи това.
За лятото ще си хвана младо гадже :)


Пет Мар 30, 2007 11:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Крехката агнешка хапка е винаги за предпочитане пред старата пастърма ! :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];

}
Целта ми е да се науча са работя с указателите,но нещо малко баира е стръмен.Въпроса съм го написал на реда дето ме тормози и моля някой който има идея какво се получава с указателя *р да каже мнението си.


Съб Мар 31, 2007 9:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
for(i>=1;i<=7;i++) :?:


Съб Мар 31, 2007 10:29 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Проблема идва от към Майкрочипската боза - когато се компилира проекта и се изтрие паметта (clear memory) някой операции с масиви изобщо не се изпълняват 8O .При повторно компилиране се изпълняват.При мен версията е 7.42.Утре мисля да сложа 7.52(последната) и пак ще видим какво ще се получи


Съб Мар 31, 2007 11:07 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Вто Сеп 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
Профил ICQ WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Kато повдигна темата, на тази страница има нещо интересно относно пре- и постинкрементирането при работа с пойнтери. Може да представлява интерес за някой.
Частта е Pointer arithmetics

http://cplusplus.com/doc/tutorial/pointers.html


Съб Мар 31, 2007 11:52 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 31 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни