Jak zadawać pytania na forum

W poście Najczęściej spotykane błędy w pytaniach na forum opisałem najczęstsze i najbardziej frustrujące problemy z pytaniami na forach. W tym postaram się przekazać kilka rad jak unikać błędów podczas zadawania pytań, co robić aby pytanie było dobre i jak pomóc innym pomóc Tobie.

W skrócie można powiedzieć: wykaż minimum chęci i zainteresowania. Jeśli nie widać, że Tobie zależy na rozwiązaniu problemu, to tym bardziej nie będzie na tym zależało kompletnie obcym ludziom.

Dodatkowo, podobnie jak w metodzie gumowej kaczuszki, często sam akt przygotowywania opisu problemu jest wystarczający, aby znaleźć jego przyczynę i ją zlikwidować.

Najczęściej spotykane błędy w pytaniach na forum

Dość sporo udzielam się na szeroko pojętych forach pomagając ludziom z C++, a czasem również z innymi językami. W związku z tym bardzo często spotykam się z fatalnie zadanymi pytaniami. W tym wpisie wyleję swoją frustrację na najczęstsze z nich, w kolejności nieuporządkowanej. Porady jak uniknąć tych błędów oraz jak zadawać pytania znajdują się we wpisie Jak zadawać pytania na forum.

Nie będę prezentował żadnych linków, aby nikogo konkretnego nie zawstydzać, ponieważ nie o to w tym wpisie chodzi. Ale jeśli dostałeś od kogoś linka do tego posta, to jest szansa, że wstydzić się powinieneś. Albo powinnaś.

Misja Gynvaela 004

MISJA 004            goo.gl/                     DIFFICULTY: ███░░░░░░░ [3/10]
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
Jeden z naszych agentów infiltruje siedzibę wrogiego syndykatu, i utknął pod 
drzwiami z elektronicznym zamkiem. Udało mu się dostać do elektroniki i zrzucić
krótki program, który sprawdza wprowadzony kod i otwiera drzwi.

Twoim zadaniem będzie wykonanie analizy poniższego programiku oraz znalezienie
poprawnego kodu.

      #include <stdio.h>
      int check(char*b){char*p;for(p=b;*p;p++);if(((p-b)^42)!=47)return(
      ~0xffffffff);unsigned long long ch=0x1451723121264133ULL;for(p=b;*
      p;p++)ch=((ch<<9)|(ch>>55))^*p;return!!(14422328074577807877ULL==
      ch);}int main(void){char buf[1234];scanf("%1233s",buf);puts("nope"
      "\0good"+check(buf)*(6-1));return 0;}

--

Odzyskaną wiadomość umieśc w komentarzu pod tym video :)
Linki do kodu/wpisów na blogu/etc z opisem rozwiązania są również mile
widziane!

P.S. Rozwiązanie zadania przedstawie na początku kolejnego livestreama.

Kod, jak widać, jest trochę bardzo nieczytelny. Ok, to jest C, ale i tak powinno być lepiej. Dlatego pierwszym krokiem ku rozwiązaniu zadania było jego poprawne sformatowanie. Do tego użyłem http://format.krzaq.cc, mojego webowego frontendu dla clang-format.

Lawful Evil #2 – Pilne Kolos z struktur

Treść prośby1 o pomoc wyglądała następująco:

Zadanie 1
Zdefiniuj strukturę opisującą książkę zawierającą pola (ilość stron, numer
biblioteczny, termin wypożyczenia) , oraz zdefiniuj strukturę opisującą datę. W
programie dynamicznie utwórz zmienną typu strukturalnego z polem typu
strukturalnego , następnie wczytaj z klawiatury wartości pól, po czym wczytane
informacje wydrukuj na ekranie. Przed zakończeniem programu zwolnij pamięć po
dynamicznie utworzonej zmiennej. (3 pkt)
Zadanie 2
Napisz funkcję, która zwraca jako wartość wskaźnik do zmiennej strukturalnej
opisującej książkę. Zadaniem funkcji jest zaalokowanie zmiennej oraz ustalenie
wartości jej pól (wartości pól zmiennej wczytujemy z klawiatury).
Napisz program testujący działanie funkcji.

Visual Studio

Wygląda na idealnego kandydata do tej kategorii.

1W sumie ciężko było powiedzieć czy to prośba, bo słowo “proszę” ani żadne podobne nie znajduje się w treści.

ZWI #1: Jak wykryć kontenery asocjacyjne w czasie kompilacji

Tym postem rozpoczynam kolejną serię – ZWI (Zapytane w Internecie). W planach jest co najmniej jeden wpis ;​) Posty będą przedstawiały pytania, na które odpowiedziałem na różnej maści forach, które (lub których odpowiedzi) uznałem za godne uwagi.

Na pierwszy ogień idzie następujące pytanie z forum 4programmers:

Mam prostą funkcję

template <typename Container, typename Value>
bool contains(const Container& container, const Value& value)
{
    return std::find(std::begin(container), std::end(container), value)
        != std::end(container);
}

Dla kontenerów asocjacyjnych (set, multiset, unordered_set, map itd.) można wykorzystać metodę find(), która jest szybsza niż globalne find(). Pytanie czy da się w prosty i elegancki sposób wykryć taką sytuację, żeby wywołać container.find(), bo nie uśmiecha mi się pisać specjalizacji dla każdego typu kontenera.

Lawful Evil #1 – kwadraty magiczne

Rozpoczynam nową serię: Lawful Evil. Jest to znana kategoria postaci z DnD, charakteryzująca się działaniem zgodnym z obowiązującym porządkiem, jednak zaprzeczającym jego duchowi.

W moim wykonaniu jest to wykonywanie zadań (domowych czy innych) zgodnie z literą zadania, ale w sposób taki, aby było jasne, że to parodia/żart. Zadania będą maksymalnie przekombinowane, mogą zawierać celowo rażące błędy i, w ramach możliwości, ich stopień skomplikowania uczyni je niemożliwymi do wytłumaczenia nauczycielowi/wykładowcy.

Misja Gynvaela 003

MISJA 003            goo.gl/ZPQvV0               DIFFICULTY: ██░░░░░░░░ [2/10]

Tym razem nie trzeba nic robić. Wystarczy uruchomić poniższy skrypt, chwilkę
poczekać, a hasło zostanie wypisane. No, taką dłuższą chwilkę...

#!/usr/bin/python
def magic1(a, b):
  o = 0
  i = 0
  while i < a:
    o += 1
    i += 1
  i = 0
  while i < b:
    o += 1
    i += 1
  return o
def magic2(a, b):
  o = 0
  i = 0
  while i < b:
    o = magic1(o, a)
    i += 1
  return o
n1 = int("2867279575674690971609643216365"
         "4161626212087501848651843132337"
         "3373323997065608342")
n2 = int("1240905467219837578349182398365"
         "3459812983123659128386518235966"
         "4109783723654812937")
n = magic2(magic1(n1, n2), 1337)
print hex(n)[2:-1].decode("hex").splitlines()[0]

Misja Gynvaela 002

MISJA 002                                        DIFFICULTY: ███░░░░░░░ [3/10]

Przechwyciliśmy fragment komunikacji pomiędzy dwoma podejrzanymi. Sądzimy, że
to hasło administratora do jednego z systemów, na których mogą znajdować się
kluczowe dla sprawy dane.

                 ╭┈┈                                     ┈┈╮  
                 ┊ QW== QT== QT== QQ== QU== Qd== QU== Qd== ┊
                   QX== QV== QW== Qe== QT== QR== QU== QT==
                   QT== QU== QX== QU== QT== QR== QT== QQ==
                 ┊ QW== Qe==               »goo.gl/4Iuxdi« ┊ 
                 ╰┈┈                                     ┈┈╯   

Niestety, pomimo, iż wiemy, że użyte zostało kodowanie Base64, nie jesteśmy w
stanie zdekodować ukrytej wiadomości. Nasi technicy uparcie twierdzą, że po
zdekodowaniu wychodzi „AAAAAAAAAAAAAAAAAAAAAAAAAA”, ale sądzimy, że nie mają
racji.

Zwracamy się więc do Ciebie z prośbą o pomoc - zrzuć okiem na powyższą
wiadomość i sprawdź czy nie ma czasem drugiego dna.