Wrzucenie while do wnętrza funkcji

Wrzucenie while do wnętrza funkcji
Dzonzi
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 4 lata
  • Postów:132
0

Witam, mam taki kod w C na avr

Kopiuj
void send_a_character(unsigned char character);

char napis[] = "napis do wyswietlenia";


tak ją wywołuję:

while(napis[i]!=0)
	{
		send_a_character(napis[i]);
		i++;
	}



void send_a_character (unsigned char character)
{
	PORTD = character;
	PORTB|= (1<<RS);
	PORTB|= (1<<E);
	_delay_ms(50);
	PORTB&= ~(1<<E);
	PORTD = 0;
}

Funkcja ta wyświetla po 1 znaku stringu, aż dojdzie do jego końca, czyli 0. Funkcję wywoluje w pętli while, aby za każdą iteracją przekaż jej jeden znak.

Jak ją zmienić, żeby wywoływać ją tak:
send_charakter(napis); bez użycia pętli. Innymi słowy potrzebuję tego while wrzuć do wnętrza funkcji. Próbowałem to zrobić, ale były jakieś dziwne błędy.

Generalnie chyba chodzi o to, że przekazać całą tablicę do funkcji.

edytowany 1x, ostatnio: flowCRANE
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:8 minut
0

wysyłać wskaźnik do tablicy z charami i to tyle, a później tam sobie odczytywać.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
daniel1302
  • Rejestracja:ponad 16 lat
  • Ostatnio:10 dni
1
Kopiuj
void sendString(char *str) {
  while (str[i] != 0) {
    send_a_character(str[i]);
    i++;
  }
}

void send_a_character(unsigned char character) {
  PORTD = character;
  PORTB |= (1 << RS);
  PORTB |= (1 << E);
  _delay_ms(50);
  PORTB &= ~(1 << E);
  PORTD = 0;
}

int main(void) {
  char napis[] = "napis do wyswietlenia";
  sendString(napis);
  return 1;
}


Head of the pprof.
edytowany 2x, ostatnio: daniel1302
Zobacz pozostałe 3 komentarze
Dzonzi
No bo kto tak robi? Chyba tylko jakiś Pan Miecio.
daniel1302
@elwis dokładnie, na kolanie pisałem :(
elwis
Co na dwie funkcje? Tak jest lepiej, bo nie zaciemniasz prostej funkcji niskopoziomowym kodem zależnym od platformy. Jak się boisz o wydajność to użyj inline :p
Patryk27
@Dzonzi: huh? Przecież kod wyżej jest jak najbardziej prawidłowy, czytelny i czegoś takiego właśnie spodziewanym się w produkcyjnym, rzeczywistym kodzie. Bonus: żyjemy w XXI wieku, żadnego ręcznego inline nie trzeba robić.
elwis
Z zasady separuje się kod zależny od platformy od logiki. Dla porządku. O tym, że kiedyś możesz chcieć wypisać jeden znak nie wspomnę. Z punktu widzenia czytelności jak ktoś nie jarzy. W tym przypadku może to jeszcze nie robi, bo włożenie tego w pętle jeszcze nic nie zaciemnia. Ale potem dorzucisz drugie i trzecie i zrobi się bajzel. Polecam na przykład kod coreboota. Bardzo fajny projekt i tam tak robią za każdym razem. Dobrze się z tym kodem pracuje. Z resztą w EDK2 jest to samo.
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:4 dni
0
Kopiuj
void napisz(const char *napis) {
    while(napis[i]!=0)
    {
        send_a_character(napis[i]);
        i++;
    }
}

xD


edytowany 1x, ostatnio: elwis
Dzonzi
nie śmieszkujcie sobie
elwis
Jak nie chcesz śmieszkowania to nie zadawaj takich pytań tylko przeczytaj co to jest funkcja i jak działa. Choć i tak jak byłem brzdącem i się uczyłem takich rzeczy to książek nie czytałem bo nie miałem, ale jakoś takie rzeczy zawsze były jasne.
daniel1302
  • Rejestracja:ponad 16 lat
  • Ostatnio:10 dni
1
Kopiuj
void sendString(char *str) {
  while (str[i] != 0) {
    PORTD = (unsigned char)str[i];
    PORTB |= (1 << RS);
    PORTB |= (1 << E);
    _delay_ms(50);
    PORTB &= ~(1 << E);
    PORTD = 0;
    i++;
  }
}

void send_a_character(character) {}

int main(void) {
  char napis[] = "napis do wyswietlenia";
  sendString(napis);
  return 1;
}

Head of the pprof.
Dzonzi
Działa! Robiłem bardzo podobnie, tylko miałem błędy z typami, bo już mi się wszystko pokiełbasiło. Dzięki temu nie muszę za każdym razem przy wywoływaniu funkcji robić tej pętli.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.