Jestem początkującym programistą i obecnie uczę się języka C.

Wpadł mi do głowy sposób jak szyfrować dane i napisałem program implementujący szyfrowanie i deszyfrowanie. (Siłą szyfru jest raczej tylko nieznajomość jego działania.)

Główna funkcjonalność programu (kodowanie i dekodowanie) powinna działać poprawnie.

Oto
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Wina_Segmentacji w main.c olalbym instrukcje warunkową i zastapilbym ja switch-case'm. goto zamienilbym na "case fallthrough". w stack.c w funkcji stack push zwiekszalbym stos np. wykladniczo zamiast arbitralnie o 10kB.

edit:
zapomniałem pochwalić! wygląda na dobrą robotę!

edit 2:
gdzie testy? ;)
  • Odpowiedz
@Wina_Segmentacji:
wykładnicze zwiększanie stosu ma tę zaletę, że rozsądniej gospodaruje się pamięcią. teraz co każde
zwiększenie stosu zabierasz 10kB. nawet jeśli ktoś zaalokował stos na np 50B, to kolejna alokacja będzie na 10050B. w systemach z małą ilością pamięci (myślę głównie o jakichś mikrokontrolerach) może to powodować problemy.
lepiej jest np. zwiększać alokację dwukrotnie za każdym razem. dla podstawy 50B będzie to kolejno: 100B, 200B, 400B itd.

tak sobie wyobrazalem
  • Odpowiedz
#programowanie #jezykc #heheszki
"I don’t think C gets enough credit. Sure, C doesn’t love you. C isn’t about love–C is about thrills. C hangs around in the bad part of town. C knows all the gang signs. C has a motorcycle, and wears the leathers everywhere, and never wears a helmet, because that would mess up C’s punked-out hair. C likes to give cops the finger
  • 1
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@wieczniezielony:

return *tablica;

w ten sposób zwrócisz wartość pierwszego elementu tablicy, a nie wskaźnik na tę tablicę.

tablica = stworziwypelnij_tablice(tablica)

tu natomiast obchodzisz się z tą zwróconą wartością jak ze wskaźnikiem.
  • Odpowiedz
Pytanie z #programowanie, #jezykc
W pliku A.c mam zadeklarowaną tablicę danych TAB i chcę aby jej elementy były widoczne w pliku B.c

Tablica jest oznaczona jako #extern w pliku A.h, który jest zaincludowany do pliku B.c, ale dostaję błąd, "unresolved symbol TAB from B.o"

Dlaczego dostaję taki błąd?
  • 19
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Spojler22: kawałek zdekompilowanego do C kodu jakiejś większej aplikacji. Nie jest zbytnio bardziej czytelne od assemblera. To co widzimy na ekranie liczy "coś". Może jakiś hash, może manipuluje obraz, ciężko powiedzieć. Mnie rozbawiło, że bohater widział tam facebooka, linked-ina, chany i jeszcze firewalla. No ale ja spaczony jestem, więc nie oczekuję zrozumienia.
  • Odpowiedz
Mam prostą implementację stosu. Dodaję do dwóch stosów losowe liczby i problem jest taki, że nie zawsze się one dodają. Gdy próbuję je wypisać nic się nie pojawia. W dodatku czasem przy kolejnym uruchomieniu programu, na stos wlatują identyczne wartości jak przy poprzednim odpaleniu. Nie wiem jak to możliwe, skoro dałem srand(time(NULL)). Metoda main() od 65 linijki.
Jak się kilka razy poklika przycisk run, to wtedy pięknie widać o co mi
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Matt23: srand(time(NULL)) ustawia ziarno według czasu w sekundach, jeśli dwukrotnie odpalisz program w tej samej sekundzie to będziesz miał takie same rezultaty.

Dodatkowo pamiętaj, że NULL jest zdefiniowany jako 0. "tmp->data = NULL;" i przede wszystkim "if (s->data == NULL) return 1;" nie działa tak, jak zakładasz - pamiętaj że data to typ prosty int, a nie wskaźnik. Przez tę drugą linijkę jeśli na górze stosu pojawi się wartość 0
  • Odpowiedz
@Analityk: Mam za zadanie napisać stos strukturalnie i to w dodatku w języku C, niestety. Metody które stworzyłem mają znaleźć się w implementacji, takie wymaganie. W dodatku program ma obsługiwać wiele stosów, dlatego zrobiłem to w ten a nie inny sposób.

Jakie są twoje intencje wobec tego stact** t

Jeśli chcę z poziomu funkcji zmienić pamięć na którą wskazuje pointer, to muszę w deklaracji użyć dwóch gwiazdek. Tak przynajmniej wyczytałem
  • Odpowiedz
Mirki taka zagwozdka. Pewnie dla wykopowych specow od C/C++ to nie bedzie zaden problem.
extern volatile int i;
extern volatile int j;
void f()
{
int x = i + j;
  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@simia: well defined
Wartości i i j są losowe. Wynik jest losowy. volatile odpowiada za brak optymalizacji użycia zmiennych (a raczej za odwoływanie się pod konkretne adresy bez względu na to co kompilatorowi się wydaje).
  • Odpowiedz
jak zamienić wskaźnik na strukturę na wskaźnik na void?

note: expected 'int (*)(void *)' but argument is of type 'int (*)(struct Exam *)
#programowanie #jezykc
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@CichyGlosZTyluGlowy: variant się liczy ? Sens był taki, że potrzebowałem rozszerzyć obiekt o klucze do tabel:
- id
- 2 id
- id + date.
...
Poliformizmu (dynamicznych alokacji) nie mogłem użyć, bo trzeba to było osadzić w legacy code, gdzie lecą memcpy i memsety.
  • Odpowiedz
Poprawny uint64_t* zawiera adres podzielny przez 8.


@mmmk: Mogę być w błędzie tutaj, ale mówisz o aligned address? Zdaje się że to nie jest wymóg na x86, ale sięganie do adresu który jest aligned powinno być szybsze, zwłaszcza przy load w instrukcjach SIMD.
Jak dobrze kojarzę to SPARC albo starsze ARM nie wspierały unaligned access.
  • Odpowiedz
napis = malloc(1000 * sizeof(char)); //brak obsługi nulla

q = strlen(napis); // pomiar smieci


@wieczniezielony: @wytrzzeszcz:

"A gdy oni kodowali, Kompilator wziął pamięć i widząc calloc zaalokował i dał programistom mówiąc:

Bierzcie i używajcie tego wszyscy, to jest bowiem blok pamięci, która dla was i dla waszego programu będzie wyzerowana."
  • Odpowiedz
* 3 linia: zamiast tych #define z opcode, walnij jakiegoś enum

teraz też tak uważam, ale to akuratwymagało by przebudowy całej aplikacji

* 88 linia, ten switch bez sensu (tym bardziej jak zrobisz już enuma)

niby jo ale są rozkazy do mutowania kodu podczas pracy

*
  • Odpowiedz
Co jest? W #mingw pod Windows 10 dostaję taki komunikat:

||=== Build: Debug in GLtest (compiler: GNU GCC Compiler) ===|
||Warning: resolving _VirtualQuery@12 by linking to _VirtualQuery|
||Warning: resolving _VirtualProtect@16 by linking to _VirtualProtect|
||Warning: resolving _EnterCriticalSection@4 by linking to _EnterCriticalSection|
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach