Częste błędy (mistakes) w kodowaniu

Częste błędy (mistakes) w kodowaniu
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Niedawna sytuacja w Pascalu:

Kopiuj
Procedure foo(Obj: Objekt);
Begin
 Zrób_coś(Obj.coś_tam_co_modyfikuje_także_obiekt);
End;

I wielkie WTF, czemu po wyjściu z procedury foo obiekt zostaje zmodyfikowany, skoro nie dałem var przed nazwą :P
Poza tym jeszcze od czasu do czasu zdarza mi się robić:

Kopiuj
obiekt_a := obiekt_b

lub

Kopiuj
tablica_a := tablica_b

I zapominam, że w tej chwili obie zmienne wskazują na ten sam adres w pamięci...


edytowany 1x, ostatnio: Patryk27
PO
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 10 lat
0

Zapomnienie średnika po definicji klasy w C++.

0

@pozytywista, skoro tak to chyba nigdy nie miałeś okazji korzystać z klas anonimowych i tworzyć ich instancji.

PO
Ależ miałem wielokrotnie. Nie bardzo rozumiem, skąd ten wniosek że nie?
bolson
  • Rejestracja:około 15 lat
  • Ostatnio:2 dni
  • Lokalizacja:Zielona Góra/Poznań
1

Notoryczne zapominanie " : " w pythonie :[

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:2 dni
  • Postów:2512
1
PS napisał(a):
Sterylizator napisał(a):

Już samym błędem, który karany powinien być obcinaniem jaj jest pisanie "var" zamiast konkretnego typu.

Ktoś tu nie dorósł do inferencji typów.

W przypadku jaki podał @Azarien używanie var jest słuszne, ale ja przywykłem do odczytywania typu po lewej stronie i jak widzę coś takiego:

Kopiuj
var aabbcc = GetSthFromAnotherThing();

to mnie krew zalewa. Owszem można sprawdzić definicję funkcji, albo też najechać na zmienną w VS, ale noż kurde czy np. 'string' zajmuje aż tyle miejsca? Jak jest 10 takich varów jeden pod drugim to staje się to mało wygodne.

KR
A jak masz GetSthFromAnotherThing().AndDoSomethingWithIt() to też Ci brakuje typu wyniku pośredniego? Zmienne i funkcje powinno nazywać się tak, aby wiadomo było o co chodzi.
Sarrus
Taaaaak. Jak być powinno to każdy wie, ale i tak potem brakuje czasu i się robi coś na szybko bo termin jest nieprzekładalny.
wasiu
Ale tez powinny byc latwe do debugowania i rozszerzania! Ja takie wywolania rozbijam na dwie linie i w debugerze wiem czy bledny wynik jest w pierwszym dzialaniu czy w drugim, a tak to powodzenia ze stepin'ami. No i jak w komentarzu wczesniej, brak szybkiego przejscia do definicji klasy jednym kliknieciem utwierdza we mnie to, ze var to zlo, ktore niepotrzebnie wydluza czas na poszukiwania.
3

Wiesz ze sa jezyki ktore nie maja wcale statycznego typowania? Polecam pobawienie sie takim jakims, zobaczymy co pozniej powiesz na temat pisaina typow wszedzie ;d

KR
Brak konieczności pisania typów wszędzie jest dobry - od tego jest IDE aby typy pokazywać. Natomiast brak sprawdzania typów przez kompilator to zła rzecz, dlatego nie lubię za bardzo języków dynamicznych.
Sarrus
Pisałem w PHP, PERLu i JS. Jakoś mnie to nie jara
msm
@Królik - co powiesz na Haskella? W pełni statyczne typowanie, możliwość zupełnego niepisania typów (chociaż zalecane dla top-level functions, dla czytelniejszych błędów kompilacji).
KR
Haskell jest u mnie najwyżej na liście języków do nauczenia. Obok JS, w którym wprawdzie trochę kiedyś pisałem, ale nigdy nie nauczyłem się porządnie.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
2

Mój ulubiony standardowy błąd popełniany systematycznie raz na pół roku niezależnie od języka, gdy potrzebny jest prawie identyczny fragment kodu, różniący się jakimiś detalami.
Robi się copy/paste i poprawia w odpowiednich miejscach. Problem w tym, że często zapomina się czegoś tam poprawić (jednej nazwy zmiennej, typu, itp) i potem marnuje się czas by znaleźć, gdzie się coś popsuło.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 4 godziny
  • Postów:2964
1

Ostatnio kilka razy złapałem się na czymś takim:

Kopiuj
def costam = {
  jakis kod 1
  jakis kod 2
  jakis kod 3
  if (warunek)
    wynik 1
  else
    wynik2
}

Teraz chcę zmodyfikować i dołożyć jeszcze jedną możliwość wyjścia z funkcji tak:

Kopiuj
def costam = {
  jakis kod 1
  if (nie mozna kontynuowac)
     jakis inny wynik
  jakis kod 2
  jakis kod 3
  if (warunek)
    wynik 1
  else
    wynik2
}

Oczywiście to jest źle, bo liczy się wynik ostatniego wyrażenia, a ten dodany wynik nie jest ostatnim wyrażeniem i program normalnie pójdzie sobie dalej zamiast wyjść z funkcji.
W Scali nie używa się return do zwracania wyników, tylko ostatnie wyrażenie jest zawsze wynikiem i nie trzeba pisać return. Stąd w pewnym momencie człowiek się przyzwyczaja i wydaje mu się, że jak napisze nieprzypisane do niczego wyrażenie nie na końcu, to że tam jest return. A tu zonk, bo wcale nie ma. :D

Żeby było ładnie, powinno być tak:

Kopiuj
def costam = {
  jakis kod 1
  if (nie mozna kontynuowac)
     jakis inny wynik
  else {
    jakis kod 2
    jakis kod 3
    if (warunek)
      wynik 1
    else
      wynik2
  }
}
Wibowit
piszesz w Scali komercyjnie?
KR
na razie nie, choć czasem używam sobie Scalowego REPLa do sprawdzania na szybko pewnych rzeczy
matek3005
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 5 lat
  • Postów:358
2

Mnie się zdarza "z automatu" napisać << zamiast >> przy strumieniach. Częstymi błędem początkujących programistów jest nieczytanie komunikatów kompilatora. Również niezdawanie sobie sprawy z różnicy między '\n', a "\n". Zapominanie o semantyce ścisłej własności przy użyciu auto_ptr.

xeo545x39
A czym się różni '\n' od "\n" poza tym, że to różne typy? Czy to o to chodzi?
matek3005
"\n" = 2 znaki - \n + \0 natomiast '\n' = 1 znak - w dzisiejszych czasach nie robi to dużej różnicy ale wiedzieć wypada ;p
Azarien
a pod Windows oba z nich po zapisaniu do pliku okazują się sekwencją \r\n
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
2

Kolejna rzecz, którą popełniają WSZYSCY CO NAJMNIEJ RAZ W ŻYCIU:

Kopiuj
public void initPerson(Person from){
   from = new Person();
}
//...
Person jaś;
initPerson(jaś);

przykrym dla Jasia jest fakt, że pomimo wywołania metody nadal nie istnieje.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Wrocław
11

Skończyłem pisać nową metodę, jestem z niej dumny, przechodzi wszystkie testy, jestem z niej jeszcze bardziej dumny, kompiluję, uruchamiam program i nowa metoda nie działa, nic się nie zmieniło... No tak, zapomniałem wywołać. :D

Wibowit
chyba masz jakiegoś cichego wielbiciela, albo i dwóch, bo każdy twój post dostaje plusy zaraz po napisaniu
somekind
Ta, ale najgorsze jest to, że połowa tych wielbicieli od razu komentarze dodaje. ;P
MVC
i co drugi jego post ląduje na bashu... ciekawe.. faktycznie chyba ma jakiś wielbicieli. :P
Wibowit
na pewno pieści się z demonicalem, ale chyba dm nie czituje i nie wbija mu kilku plusów naraz, no nie? somekind musi mieć jakieś multikonto...
MVC
Patrząc na ilość plusów to aż 3 konta + czwarte, którym wkleja swoje posty na basha przez co jest jeszcze bardziej sławny.
02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
1

C++:
std::string s;
char x = 'a';
...
s += x + "bcde";

edytowany 1x, ostatnio: 0x200x20
vpiotr
to w ogóle się kompiluje? fajnie by było (jakby działało), ale stringi w C/C++ to najsłabsze ogniwo
02
o tak kompiluje sie ;] Po prostu podajesz offset do swojego const char* ;) Najgorzej ze gdyby napisac s = s + x + "bcde" to nawet moglo by zadzialac.
MarekR22
niezłe, a tu dowód, że działa: http://ideone.com/ip138
02
http://ideone.com/r7mXt a to dziala i nawet daje oczekiwane rezultaty.
2

Rrrrwaa mać. Najczęstszy błąd to próba programowania w Javie jak w każdym normalnym języku. Tutaj wszystko indeksuje się od zera... poza argumentami format stringów. Ile razy muszę zrobić poprawki w javowej aplikacji to przy pierwszym bardziej rozbudowanym formatowaniu obowiązkowo obrywam NieLiczyszJakHumanistaException. Parszywe statycznie typowane PHP.

Zobacz pozostały 1 komentarz
UB
jakby nie patrzeć jest to dobrze zrobione. Zerowy argument to format
bogdans
To się wolno uczysz, jak bym raz oberwał wspomnianym wyjątkiem, to bym zapamiętał, że indeksuje się od jedynki. A już na pewno po drugim ciosie bym pamiętał.
KR
Nie tylko tu, w JDBC też się indeksuje od jedynki np. kolumny.
bogdans
Małą pułapką jest też indeksowanie dni od 1, a miesięcy od 0. new GregorianCalendar(1970,0,1) reprezentuje 1 stycznia 1970 roku.
iooi
new GregorianCalendar(1970, JANUARY, 1) też, i nawet lepiej wygląda
0
ubuntuser napisał(a)

jakby nie patrzeć jest to dobrze zrobione. Zerowy argument to format

Super, zawsze chciałem móc wypisać format stringa wypisując format stringa! Nie, to nie jest dobrze zrobione, wcale nie masz dostępu do formatu, po prostu składnia jest spierniczona po całości, to format stringi z C z dodaną pozycyjnością, po prostu 0 jako indeks kolidowałoby z zerowym paddingiem - http://ideone.com/yjD6y

MarekR22
ja tu tej kolizji z zerowym paddingiem nie widzę: http://ideone.com/iXh45 , ale zgadzam się, że powinno indeksować od 0. Swoją drogą dziwne, że nie rzuca wyjątku dla 0.
iooi
Bo w ogóle zerowy index, tak samo jak pierwszy, działa dla pierwszego argumentu. Poza klasą Formatter jest jeszcze MessageFormat, która indeksuje normalnie.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 4 godziny
  • Postów:2964
0

Skończyłem pisać nową metodę, jestem z niej dumny, przechodzi wszystkie testy, jestem z niej jeszcze bardziej dumny, kompiluję, uruchamiam program i nowa metoda nie działa, nic się nie zmieniło... No tak, pewnie zapomniałem wywołać jak somekind. Sprawdzam w kodzie, nie, nie zapomniałem wywołać. Ustawiam breakpoint, odpalam unit testy pod debuggerem, zatrzymuje się we wskazanym miejscu. WTF? Jeszcze raz odpalam program bo może mi się coś przywidziało (późno było), ale nie, nadal nie działa. Patrzę w końcu do logów... a tam na samym początku "cannot bind to port 8080, port in use". W tle miałem uruchomioną starą wersję...

A innym razem miałem jeszcze taką wtopę, że nie wiedziałem, że nasz rozbudowany system skryptów odpalających aplikację jest wrażliwy na obecność różnych wersji jarów w katalogach build i lib, i wcale nie bierze najnowszej. I za każdym razem odpalało mi jakąś starą wersję, bo nie zrobiłem ant realclean (w odróżnieniu od ant clean, czyści wszystko razem ze ściągniętymi libami).

edytowany 2x, ostatnio: Krolik
vpiotr
Spróbuj "ant imsurerealfullclean" :)
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:2 dni
  • Postów:2512
2

Gdy początkujący programista bez podstawowych podstaw (np. tablice) bierze się za programowanie w obiektowym GUI (np. Windows Forms ).

adf88
Jest to kwestia co najmniej dyskusyjna. Wiem, że irytującym jest np. jeśli noob do przechowywania tekstu używa Memo zamiast stringa. Nie mniej jednak jeśli taki noob zaczyna od klikania komponentów to szybko dochodzi do pozornie zadziwiających efektów. Takie coś wzmaga zainteresowanie programowaniem bardziej niż np. widok szeregu posortowanych liczb w konsoli. Jeśli wciąga go bardziej to podstaw łyknie z większą zaciekłością.
Sarrus
Jeżeli kogoś na prawdę jara programowanie, to będzie się cieszył z wypisania tabliczki mnożenia w konsoli. A tak najpopularniejszym problemem newbe jest: jak przekazać zmienną z okna do okna.
adf88
A jeśli nie jara (jeszcze nie)? Chodzi o start i o to aby zaczęło jarać... zresztą jak coś może kogoś jarać jeśli jeszcze tego nie poznał chociażby w minimalnych stopniu...
S3
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 11 lat
  • Postów:61
5

"Po co mi dokumentacja, jestem pewny, że ta funkcja działa tak i tak ... "

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Wrocław
3

A ile razy było tak, zwłaszcza przy początku nauki, że poprawiało się kod nie w tym pliku, który się potem kompilowało/uruchamiało. :D

nerf
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 11 lat
0

Najczęściej to:
= zamiast ==
brak ";" na końcu instrukcji
1 zamiast !
if(x) zamiast if(x != 0) -> Dlaczego nie może być jak w c++? Czy to ustawienia IDE?;d
zong gdy przy teście jakiejś metody nie działa a po prostu zapomniałem ją wywołać ;p
PS: Wie ktoś jak utworzyć swój skrót klawiszowy w visualu pro 2010? Chce by zaznaczało cała linie w której aktualnie jestem. Gdy używam override czy automatycznie ide coś wpisuje to wrzuca wyjątek throw new wyjątek coś tam i muszę sięgać po myszkę ;(

edytowany 3x, ostatnio: nerf
Zobacz pozostałe 5 komentarzy
RE
@vpiotr nikt czegoś takiego nie napisał.
vpiotr
@Rev: OK, nie zrozumiałem, w piątek za bardzo jestem już w weekendzie, za szybko odpowiadam. Wywaliłem to co było bez sensu.
msm
@vpiotr - jasne że nie wymusza, bool w C# jest normalny. Nie ma po prostu niejawnej konwersji bool->int, czyli NIE zadziała if (age-18) jako sprawdzenie czy użytkownik ma dokładnie 18 lat. I przy okazji nie zadziała if(age=18) co uważam za zaletę...
vpiotr
@Tezcatlipoca: tak, to jest progress w stosunku do C/C++ - także dla mnie.
somekind
Ad PS, czemu musisz po myszkę sięgać? Nie umiesz zaznaczyć tekstu klawiaturą, tak jak w każdym edytorze tekstu? Skróty klawiaturowe: Tools -> Options -> Environment -> Keyboard. Skrót do kasowania całej linijki: Ctrl + L.
aurel
Moderator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 12 godzin
3

if(x) zamiast if(x != 0) -> Dlaczego nie może być jak w c++? Czy to ustawienia IDE?

Ja akurat jak pierwszy raz napotkałam się na taki błąd, odetchnęłam z ulgą i zakrzyknęłam: nareszcie!!!

x nie jest typu bool. Takie to proste i sensowne. Dlaczego niby miałby zwracać true lub false?

Za to jest z tym związany inny popularny babol - użycie if (x) tam, gdzie miało się na myśli if (x > 0)....

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
0

C++ niewirtualny destruktor, gdy stosuje się polimorfizm. To dopiero potrafi generować dziwne błędy w zupełnie innym miejscu. Zwłaszcza, gdy to nie ty odpowiadasz za klasę bazową, ale jakiś ciołek z drugiego końca świata.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
vpiotr
Już o tym napisałem - dla mnie to tragiczna niedoróbka języka, nawet jeśli w VS 2025 będzie wykrywana jako warning...
adf88
Niedoróbką tego bym nie nazwał. Po prostu C++ taki już jest, więcej pozostawia programiście. Zawsze można wybrać inny język o ciut wyższym poziomie abstrakcji...
matek3005
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 5 lat
  • Postów:358
0

Przy okazji destruktora wirtualnego wspomniało mi się jeszcze o pomyłkach przy redefiniowaniu metody wirtualnej. Obecne edytory pomagają unikać tego typu błędów ale przydałby się jakiś mechanizm samego języka, który w fazie kompilacji zgłaszałby takie sytuacje.

Zobacz pozostałe 5 komentarzy
KR
Nie widzę, żeby działało to tak jak w Scali. Nadal możesz się kropnąć przesłaniając nieświadomie.
vpiotr
@Krolik, nie jesteś centrum wszechświata (AFAIK) :)
Azarien
w Delphi skompiluje się, jest warning, można go w danym miejscu uciszyć jeśli się wie co się robi. zresztą w C# wygląda to tak samo.
KR
@vpiotr, cieszę się, że C++ w końcu obsługuje coś, co było w innych językach ponad 10 lat temu, ale jak już dodawali, to mogli się wzorować na najlepszych rozwiązaniach. A nie, nie mogli - kompatybilność wsteczna.
vpiotr
@Krolik: Niestety komitety standaryzacyjne C++ nie są skore do zmian. Pomysły takie lub podobne leżą i czekają na akceptację latami...
0

Ma sens, mnie szlag trafia jak cos co zwraca jakas metoda przypisywane jest do var'a. Chce skoczyc do tej klasy by ja rozszezyc i co? zamiast po prostu dac F12 na typie, to nie, klikaj se w inny plik i szukaj poprawnego typu. Obecnie w projekcie mam kilkaset plikow i takie zabawy w szukanego, zwlaszcza jak interfejs serwisu zwracajaca daną klase jest generyczny i nie ma jasno okreslonego typu, doprowadzaja mnie do szalu, bo komus sie chcialo napisac var zamiast dluzszej nazwy

Dokładnie. Już nic nie odpisałem na ten temat bo widziałem, że większość na tym forum to lamerzy, którzy dużo biadolą, a o czystości i estetyce kodu g**no wiedzą.
Jeśli ktoś pisze coś pod var-em to... skąd na Boga ktoś analizujący kod, albo go modyfikujący ma wiedzieć jakiego typu powinna być dana zmienna lub obiekt?

Ale pewnie... najlepiej jest biadolić na forum farmazony i myśleć, że jest się pr0 :)
Zmienne typu var używają tylko lamerzy, co nie wiedzą co tak naprawdę dzieje się w kodzie.

MarekR22
W Pytonie i innych językach tego typu w ogóle nie piesze się jakiego typu jest zmienna i jakoś nikomu to nie przeszkadza.
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
0

Jesteście idiotami, wystarczy najechać kursorem na odpowiadające var albo nazwę zmiennej. Gdziekolwiek w projekcie.

somekind
sterylizatorów jest więcej niż jeden?
msm
Imię ich jest legion.
wasiu
To teraz z tego popupu przejdz mi do deklaracji tej klasy jednym kliknieciem. Jak w kodzie masz kilkaset plikow, to nawet ctrl + f Ci szybko nie pomoze. No ale rozumiem, ze Ty tylko piszesz kod, a utrzymywac musi go ktos inny.
RE
Prawy na var i "go to definition" albo lewy i F12.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 3 godziny
0

Jeśli w Javie mam wywołanie typu o.a().b().c().d(); to robiąc ctrl+klik na dowolnej metodzie z łańcucha wywołań przenosi mnie do definicji tejże metody. Oczywiście jeśli pole o miało inny typ (wyżej w hierarchii) niż wskazywany obiekt, to IDE może przenieść też do klasy wyżej w hierarchii, ale taka już natura języków OOP. W VS na pewno jest tak samo.

Jeśli lokalna inferencja cię przerasta to ciężko z tobą. Musisz przesiąść się na Javę, tam jej na razie nie ma (oprócz inferencji genericsów, ale to w zasadzie nie zmniejsza ilości informacji widocznych na ekranie) :P

edit:
Albo nawet przesiądź się na czyste C - tam nawet nie ma metod, więc i łańcucha wywołań się nie da zrobić :P


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
4
sterylizator napisał(a):

Ale pewnie... najlepiej jest biadolić na forum farmazony i myśleć, że jest się pr0 :)
Zmienne typu var używają tylko lamerzy, co nie wiedzą co tak naprawdę dzieje się w kodzie.

Synek, sorry, ale co Ty za obietnice wyborcze płodzisz? Odpowiednie korzystanie z inferencji typów jest kluczowe nawet w C++, właściwe użycie cechuje wręcz profesjonalych programistów. Języki takie jak Scala, Haskell czy F# są od niej silnie zależne! Nikt przecież nie pisze, że var, auto czy brak jawnej deklaracji typu ma dotyczyć każdej zmiennej! Bezkrytyczne stosowanie dowolnego mechanizmu prowadzi do problemów, odpowiedzialne użycie cechuje dobrego programistę.

Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:11 miesięcy
0
sterylizator napisał(a):

Jeśli ktoś pisze coś pod var-em to... skąd na Boga ktoś analizujący kod, albo go modyfikujący ma wiedzieć jakiego typu powinna być dana zmienna lub obiekt?

IDE jest dla lamerów, use notepad dude.


Women were the reason I became a monk - and, ah, the reason I switched back...
KR
chyba notepad jest dla lamerów. ja używam haksiorskiego dev-c++
NA
proszę Was... IDE dla lamerów, a notepad dla noobów. ja tam wklepuję cały kod bezpośrednio do inputa kompilatora, pomijając lekser, parser itp. a jak się pomylę, to przepisuję program od nowa.. haha ;p
02
kompilator jest dla loserow, ja wklepuje bezposrednio binarki na zaszyfrowane dyski przy pomocy namagnesowanej igły
vpiotr
Real Programmers don't need all these abstract concepts to get their jobs done-- they are perfectly happy with a keypunch, a Fortran IV compiler, and a beer. / Real Programmers Don't Use Pascal /
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Czasami przy tworzeniu bibliotek DLL zapominam dodać funkcji do exports, a potem się dziwię czemu nie działa :P

Edit: no i jeszcze czasami uzywam typu string w komunikacji pomiędzy DLL a programem, bez dodania modulu ShareMem :P


edytowany 1x, ostatnio: Patryk27
RE
Na Windows dobrze jest zrobić sobie makro TWOJABIBLIOTEKA_API, które jest __declspec(dllimport), jeżeli masz zdefiniowane makro "TWOJABIBLIOTEKA_STATIC", i __declspec(dllexport) w przeciwnym wypadku albo puste na innych systemach. exports.def jest dla mnie zbyt "daleko".
mto9
  • Rejestracja:około 14 lat
  • Ostatnio:około 10 lat
  • Postów:380
0

Może nie częsty ale dopiero co świeży: piszę sobie ładnie program, który wynik obliczeń zapisuje mi do pliku, no i tu nagle coś nie gra, co po chwilę otrzymuje takie same wyniki dla różnych danych, lekko poddenerwowany modyfikuje kod, szukam jakiś niestworzonych błędów, a tu wyniki te same.. Wkurwion* odchodzę od kompa, idę na kibel, przychodzę a tu mega zonk, program nie mógł nadpisać danych do pliku bo plik miałem uruchomiony w excelu :| no i teraz przyszło mi tylko podzielić się z wami moją głupizną :D

UB
klucz do rozwiązania problemu kryje się w stwierdzeniu "idę na kibel" ;D
bogdans
nie piszesz tego programu "ładnie" skoro on nie sygnalizuje, że zapisanie jest niemożliwe/nie powiodło się
mto9
ojj nie czepiaj się :D
no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:6 dni
0

ja na początku często popełniałem naprawdę drobne błędy w stylu: chciałem napisać zmienna += inna_zmienna a napisałem zmienna =+ inna_zmienna

albo jak robiłem 2 pętle for, jedna zagnieżdżona w drugiej i zmienne iteracyjne w tych pętlach tradycyjnie nazywałem i,j. Jak pętla robiła się trochę większa lub bardziej skomplikowana, to łatwo było pomylić i z j.


adf88
"łatwo było pomylić i z j" - dlatego licznikom pętli warto dawać bardziej wymowne nazwy zwłaszcza jeśli jest ich więcej niż jeden.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)