Отговори на тема  [ 26 мнения ]  Отиди на страница Предишна  1, 2
Айде да решим една задача 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
добре, тука вече съм много съгласен, но не се сетих как да укажа размер на масив с 256 елемента в един байт.... може би 0 трябваше да е 256 елемента, така или иначе няма масиви с 0 елемента........ аз затова и пуснах задачата тук, исках да видя решението на това, не как се местят елементи или се търси минимум и максимум, това е ясно че всеки го може, аз лично изходих от това да напиша програма която използва колкото може по малко на брой и по размер променливи, сметнах че това се търси в условието, като получа отговора ще ви го кажа...

относно С-то, за сега не мисля да минавам на него, но няма да се връщам и към basic :) , лично мое мнение е че специално за PIC няма значение на какъв език пишеш, никой не ти дава предимство пред другия, те ги направиха и трите еднакви само дето синтаксиса е различен, та нека всеки си пише на квото му допада, програмиста или е програмист и може да свърши работата или не.......


Да публикувам ли и втората задача?


Съб Май 26, 2007 2:21 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение 
Някак си много е мило да правиш такива умозаключения :D .
Иначе масив с 256 елемента е масив с индекс от 0 до 255, т.е. както и другите ти казаха побира се индекса в един байт и аз поне още не мога да зацепя защо ти трябва числото 256, което вече е два байта :) ?


Съб Май 26, 2007 3:45 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Цитат:
Да се направи функция която получава като параметър един байт размера на масива


И аз не разбирам какьв е проблемьт. Така формулирано заданието предполага, че ще работиш с масиви с максимална големина 255 елемента. Това е максималното число, което може да се кодира с един байт.
Но ако толкова дьржиш на масив с 256 елемента просто перефразираш заданието и като параметьр на функцията предаваш не размера на масива, а индекса на последния елемент. Както ти казаха вече масив с 256 елемента вьрви от 0 до 255.
С 1Byte можеш да кодираш 256 адреса.
Hяма проблеми просто тьлкувай заданието по друг начин. Дори функцията не трябва да променяш, ако логиката вьтре е да се работи с размер вместо с индекс на последния елемент, ами увеличи с 1 и си готов. Сега ако искаш да се придьржаш стриктно хем кьм заданието (което си е безсмисленa инициатива), хем да можеш да работиш с 256 елемента, е не може. Но не е и необходимо :)


Съб Май 26, 2007 9:47 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Dimitar написа:
Някак си много е мило да правиш такива умозаключения :D .
Иначе масив с 256 елемента е масив с индекс от 0 до 255, т.е. както и другите ти казаха побира се индекса в един байт и аз поне още не мога да зацепя защо ти трябва числото 256, което вече е два байта :) ?


ем щото ps66 каза че не трябва да подавам последния индекс на масива както правя, а размера.....
пък иначе мисля че почти всички тук още в 5-6 клас сме знаели колко се побира в един байт....... :)


Съб Май 26, 2007 11:46 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Какво значи колко се побира в еидн байт ? 1 байт си е еидн байт, той адресира ни по малко ни повече от 256 клетки памет ако го разглеждаш като адрес, и предава стойности от 0-255 ако говориш за данни.
След като функцията е с дефиниран вход от 1 байт и на главата си да застанеш няма как да предаваш повече от 255 като стойност или 256 адреса. Функцията ти има вход, това е променливата дефинирана като byte, така че да излизаш от презюнкцията че ще и подаваш с едно по малко е много некоректно, ти ще подаваш с едно, някой друг с две и т.н. това е абсолютно неправилно.
При условие че искаш да ползваш всичките 256 елемента от масива изрично трябва да укажеш че функцията работи с индекси, т.е. трябва да го слжиш като коментар. Това е и нормалния начин, в смисъл това е по подразбиране. В С когато се обръщаш към масив, нормлано е да очакваш че подаваш индекса на клетката която те интересува а не нейният номер. Ако работиш с номера, то самата функция би следвало да го намалява с 1 за да получиш днните които ти трябват, което е малко глупаво.


Съб Май 26, 2007 2:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
с две думи искате да кажете, че :

Код:
#include <stdio.h>
#include <conio.h>

unsigned char m[256], n, i;
unsigned int   x;

void init_array(unsigned char n);
void print_array(unsigned char n);
void invert_array(unsigned char n);


void main() {
  do {
    printf("Enter N = "); scanf("%d", &x);
  }
  while ((x == 0) || (x > 256));
  n = (char)(x);
  init_array(n);
  print_array(n);
  invert_array(n);
  print_array(n);

  printf("\n\nPress any key to end..."); x = getch();
}

void init_array(unsigned char n) {
  for (i = 0; i <= n-1;i++){
    m[i] = i;
  }
}

void print_array(unsigned char n) {
  printf("\n---------------------------------");
  for (i = 0; i <= n-1;i++){
    printf("\nm[%d] = %d", i, m[i]);
  }
  printf("\n---------------------------------\n");
}

void invert_array(unsigned char n) {
unsigned char temp;
  for (i = 0; i < n/2; i++) {
    temp = m[i];
    m[i] = m[n - i - 1];
    m[n - i - 1] = temp;
  }
  temp = n/2;
  if ((n & 0x01)) {
      m[temp] = 255;
    }
}


е по - правилно решение


Съб Май 26, 2007 2:46 pm
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 29, 2007 4:43 pm
Мнения: 2
Мнение 
relsys написа:
Код:

void init_array(unsigned char n) {
  for (i = 0; i <= n-1;i++){
    m[i] = i;
  }
}

void invert_array(unsigned char n) {
unsigned char temp;
  for (i = 0; i < n/2; i++) {
    temp = m[i];
    m[i] = m[n - i - 1];
    m[n - i - 1] = temp;
  }
  temp = n/2;
  if ((n & 0x01)) {
      m[temp] = 255;
    }
}


Приемайки, че предаваме размера на масива в първата функция бихме могли да спестим променливата i по следния начин:

Код:
void init_array(unsigned char n) {
     while (n--) m[n] = n;
}


освен това спестяваме пресмятането на n-1 на всяка итерация на цикъла.

Във втората функция можем да спестим променливата temp и пресмятането на n - i - 1 и на n/2 (което е важно, защото деленето отнема доста цикли на процесора):

Код:
void invert_array(unsigned char n) {

     for (i = 0, n--; i < n; i++, n--) {
         m[i] ^= m[n];
         m[n] ^= m[i];
         m[i] ^= m[n];
     }

     if (n == i) m[n] = 0xFF;
}


Вто Май 29, 2007 4:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
@stoianp Що не оставиш оптимизациите на компилатора...
Сорс кода трябва да е разбираем и преносим.
При варианта който предлагаш за втората функция не спестяваш нищо. Деленето на 2 всеки компилатор ще го направи с >>1 което не отнема толкова много цикли. А тези побитови XOR може да изглеждат оригинално, но я си представи че масивът m[] се намира в по-бавна памет ... Променливата temp най-вероятно компилатора ще я разположи в регистър и ще стане по-бързо.


Вто Май 29, 2007 10:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Абе дотолкова доколкото пише за PIC няма проблем с това което прави, а преносимоста е хубаво нещо, обаче при контролерите не е много задължителна, там лично аз предпочитам да оптимизирам кода за съответния процесор.


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

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
&ToHu Говорим в конкретния случай за една проста swap функция. Интересно ми е да видя асемблера, който генерира компилатора за PIC, с който работиш за единия и за другия предложен вариант. А аз продължавам да твърдя че сорс кода трябва да е разбираем и преносим пък макар и да пишеш за PIC. Това разбира се не означава че когато пиша на С не се съобразявам с конкретния процесор и не държа сметка за това как ще изглежда компилирания код.
Между впрочем темата не е обвързана с PIC и в случая по-важно е сорса да е разбираем, защото се обсъжда от няколко човека. И все пак ми е интересно да видя резултатите от компилатора за
void invert_array(unsigned char n);
За първата функция ми е ясно че се постига по-оптимизиран код, но за втората нещо не съм убеден.


Чет Май 31, 2007 6:50 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 29, 2007 4:43 pm
Мнения: 2
Мнение 
@Zdrav Напълно съм съгласен с теб, но в задачата не се казва нито какъв е процесора, нито какъв е компилатора - идеята ми беше да спестя променливи.


Чет Май 31, 2007 10:16 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 26 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

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


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

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