Funkcja zwracająca if

0

Cześć, jest jakiś sposób, aby funkcja zwracała warunek if?

Przykład, tego, co chciałbym osiągnąć:

 void Funkcja()
{
    if (a[y][x] == ' ')printw("OK");
}
0

Raczej chodzi Ci o zwracanie wartości bool lub też innej, która zostanie wykorzystana w warunku.

Funkcja może też zwracać cokolwiek, np. inną funkcję.

#include <iostream>
using namespace std;

auto fun(bool x){
	return x?
		[]{ cout << "Hello" << endl; }:
		[]{ clog << "World" << endl; };
}

int main() {
	fun(0)(), fun(1)();
	return 0;
}

Twój przykład nie mówi nic.

0

Faktycznie, źle to przedstawiłem. Chciałbym aby po wywołaniu funkcji, if zostawał automatycznie wywoływany. Tak jakbym poprzez funkcję, robił 'kopiuj-wklej' w kodzie.

0

Cześć, jest jakiś sposób, aby funkcja zwracała warunek if?

Nie - instrukcje warunkowe się wywołuje, a nie zwraca; Funkcja może zwrócić jakąś wartość, a nie konstrukcję języka;

Chciałbym aby po wywołaniu funkcji, if zostawał automatycznie wywoływany. Tak jakbym poprzez funkcję, robił 'kopiuj-wklej' w kodzie.

Ale co to ma znaczyć? Warunek zawsze wywołany zostanie automatycznie, bez względu na to gdzie i jak go zapiszesz; No i jakie "kopiuj-wklej"? Opisz problem dokładniej, bo raczej nikomu nie będzie się chciało zgadywać; A najlepiej to napisz co potrzebujesz zrobić, a rozwiązanie się dopasuje.

0

Ciężko powiedzieć o co chodzi, ale może chodzić o inlinowe funkcje? Tak, żeby wywolania było wstawiane w kod ciało funkcji?

0

To co napisales nie ma sensu. To brzmi mniej wiecej tak jakbys chcial napisac funkcje liniowa ktora zwraca dodawanie

0

Przepraszam za mało szczegółowy opis. A więc tak, w kodzie często powtarza się:

                    if (a_1[y][x] == ' ')printw(" ");
                    if (a_1[y][x] == 047)printw("'");
                    if (a_1[y][x] == ':')printw(":");
                    if (a_1[y][x] == ';')printw(";");
                    if (a_1[y][x] == ',')printw(",");

Zajmuje to sporo miejsca, ponieważ muszę opisywać każdą tablicę po kolei (zmieniają się tylko ich nazwy), doszedłem do wniosku, czy nie byłoby możliwe napisanie funkcji 'wklejającej' ww. fragment kodu, a jako argument funkcji użyć nazwę tablicy.

kaczus napisał(a):

Ciężko powiedzieć o co chodzi, ale może chodzić o inlinowe funkcje? Tak, żeby wywolania było wstawiane w kod ciało funkcji?

Tak, można powiedzieć że chodzi mi o funkcję inline, niestety przykłady zawarte w internecie są dość banalne i nie odpowiadają temu czego szukam.

krwq napisał(a):

To co napisales nie ma sensu. To brzmi mniej wiecej tak jakbys chcial napisac funkcje liniowa ktora zwraca dodawanie

Domyślam się że moje pytania mogą nie mieć sensu, ale właśnie dlatego pytam i szukam.

2

Jeśli chcesz funkcję inlinowe'ą, to taką tworzysz. Np może być taka:

inline void Funkcja(char *a, int x, int y)
{
    if (a[y][x] == ' ')printw("OK");
}

To jest jednak jedynie wskazanie i kompilator będzie się starał, że wstawi bezpośrednio w kod Twoją funkcję.
Możesz też zrobić sobie makro, ale to

  1. nieeleganckie
  2. zaśmiecisz sobie przestrzeń nazw
  3. podatne na błędy
0

Gdy wywołujesz funkcję, każdy if jest wykonywany(z tej funkcji).

Jeśli chcesz zwrócić jakąś wartość, to musisz napisać return i tu to co zwracasz.

Jeśli zależy Ci aby wartość była "tylko" wypisana na ekranie(Co jest różnicą) to starczy cout.

Załóżmy że chcesz obliczyć liczbę. Ta liczba może nam być potrzebna do dalszych obliczeń, albo możemy chcieć tylko ją wypisać. Jeśli chcesz tylko wypisać dajesz funkcję void, ona nic nie zwraca, co nie oznacza że nie wypisuje. Nie możesz się do niej odnieść. Załóżmy że chcesz ją zwrócić aby potem coś z nią zrobić. Wtedy zapisujesz zamiast void, int(dowolny typ jaki chcesz zwrócić).

0

Może zrób tablicę zawierająca dozwolone znaki i sprawdzaj, czy dany znak jest tam zawarty I jeśli tak, to go wyświetlaj. Jeśli to C++ to możesz użyć set

6

Dobre zadawanie pytan i opis problemu to jest jedna z wazniejszych rzeczy w byciu programista. W tym momencie masz zly sposob zadawania pytan, do stopnia, ze zupelnie nie wiadomo o co chodzi.

Na prostym przykladzie: zamiast spytac "jak dodac dwie liczby?" to pytasz: "jak przeniesc dziesiatki na kolejna cyfre" i nikt nie wie ze chodzi o dodawanie i ze probujesz zaimplementowac dodawanie pisemnie w kodzie zamiast uzyc operatora +.

Napisz co chcesz zrobic, a nie jak probujesz to rozwiazac i nie pros nas o dokonczenie rozwiazania ktore juz zaczales, bo nikt nie wie co chcesz rozwiazac.
Mam wrazenie ze robisz cos zupelnie pod gorke i probujesz zebysmy Ci w tym pomogli, a nikt nie wie o co chodzi.

Szczegoly typu co probujesz rozwiazac sa istotne w rozwiazaniu dowolnego problemu i nie mozesz ich pominac. Nie sugeruj swojego rozwiazania osobie ktora pytasz o pomoc, bo mozesz byc na zupelnej zlej drodze, a ta osoba nie ma wystarczajacego kontekstu zeby zrozumiec Twoj problem.

Odpowiedz na proste pytania:

  • jaki program piszesz? (co ma robic, do czego sluzyc)
  • co juz masz i dziala? (nie pisz o rzeczach ktore czesciowo dzialaja i pisz tresciwie)
  • ktora czesc programu probujesz zrobic?
  • co Ci nie wychodzi? (tutaj opisz co sie dzieje a co sie powinno dziac)

Sprobuj odpowiedz krotko i tresciwie bez zadnych historii zyciowych.

Przykladowo: Pisze gre platformowa, mam zrobiony modul grania (wyswietlanie postaci, fizyka, kolizje), chcialem zaimplementowac interaktywne menu tekstowe, w ktorym moglbym zapisac i wczytac gre, ale mi cos nie wychodzi: gdy probuje wypisac tekst na ekran to wszystkie literki wyswietlaja sie jedna na drugiej w tym samym punkcie, tutaj moj kod (korzystam z biblioteki XYZ wersja 123).

Jesli mozesz zalaczyc caly projekt to tez zalacz (w calosci, nie wklejaj kodu zrodlowego tylko spakuj i dolacz), jesli nie to sprobuj chociaz wkleic te kilka metod ktore sa zwiazane z Twoim problemem (jak wkleisz kilkaset linii kodu to nikt na to nie spojrzy, chyba ze dasz projekt ktory sie buduje to wtedy jest szansa).

Patrzac na Twoj kod mam wrazenie, ze moze Ci chodzic o cos takiego i nie potrzebujesz zadnego if-a:

printw("%c", a_1[y][x]);
0
krwq napisał(a):
printw("%c", a_1[y][x]);

Tak, to jest dokładnie to czego szukałem!

Ale obawiam się że to nie rozwiąże moich przyszłych problemów, więc chcę rozwiać wszelkie wątpliwości.
Tak jak radzisz rozwinę problem, a więc piszę bijatykę z dość zaawansowanymi animacjami, w całości działającą w konsoli.
Każda klatka musiała posiadać atrybut przypisany dla każdego znaku, co zostało rozwiązane kodem który podałeś.

Próbując rozwiązać ten problem 'pod górę', chciałem użyć funkcji inline w sposób jaki podsunął lightinside, czyli poprzez funkcję inline robić kopiuj-wklej (wiem, brzmi to mało profesjonalnie ale naprawdę nie wiem jak inaczej ubrać to w słowa) blok kodu.

Tak też przygotowałem funkcję:

 inline void ken_frame_name(char **name, int x, int y)
{
                    if (name[y][x] == ' ')printw(" ");
                    if (name[y][x] == 047)printw("'");
                    if (name[y][x] == ':')printw(":");
                    if (name[y][x] == ';')printw(";");
                    if (name[y][x] == ',')printw(",");
                    if (name[y][x] == '.')printw(".");
                    if (name[y][x] == '#')printw("#");
                    if (name[y][x] == 053)printw("+"); 
}

i użyłem jej w kodzie:

for (int y = 0; y <= 18; y++)  //wycinek z kodu, całość byłaby zbyt długa
    {
 for (int x = 0; x <= width; x++)
         {
          ken_frame_name("ken_knee_01", x,  y);
      }
} 

W wyniku czego otrzymywałem error
error: cannot convert 'const char*' to 'char**' for argument '1' to 'void ken_frame_name(char**, int, int)'|

Wiem że to nie do końca związane z moim głównym problemem (a raczej ze wskaźnikami), ale nie chcę zaśmiecać forum kolejnymi wątkami.
Tak też jak powinienem poprawnie oznaczać argument char w funkcji, dodam że z int nie ma problemu.

Dziękuję za pomoc i cierpliwość.

1

No ale ty w funkcji chcesz przyjąć wskaźnik na wskaźnik charów a przekazujesz tylko pojedynczy wskaźnik (gdzieś tu niżej wisi pytanie kogoś czym sie różni * od **, poszukaj i poczytaj).
Zrób tak

void ken_frame_name(const char *name, int x);
{
                    if (name[x] == ' ')printw(" ");
                    if (name[x] == 047)printw("'");
                    if (name[x] == ':')printw(":");
                    if (name[x] == ';')printw(";");
                    if (name[x] == ',')printw(",");
                    if (name[x] == '.')printw(".");
                    if (name[x] == '#')printw("#");
                    if (name[x] == 053)printw("+"); 
}

Jakbyś chciał żeby ta twoja funkcja chodziła musiałbyś sobie zaalokować dwuwymiarową tablice.
btw, czemu posługujesz sie tym brzydaśnym 8-emkowym systemem? Hex jest fajniejszy :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1