lapsus alumni

styczeń 12, 2007

Malinowa Kraina Jeża

Zaszufladkowany do: Ogólne, Studia, Wykłady — elmopl @ 4:34 pm

Poniżej zamieszczam efekt skumulowanych czynników:
– czwartkowej pobudki o 0800
– treningu w godzinach od 1900 do 2100 tegoż dnia
– pobudkę o 0700 dnia następnego
– otrzymania przez Agnieszkę nagrody za rebusy w postaci kredek i książeczek rozwijających intelekt dzieci do lat 3
– dania mi przez nią pomysłu na przejrzenie nagród i skorzystanie z otrzymanych przyborów
– obecności na mało porywającym wykładzie z logiki i teorii mnogości

Malinowa Kraina Jeża

Dopóki kolorowałem wszystko z ogólnie przyjętymi przez naturę normami osoby z najbliższego otoczenia patrzyły się na mnie jak na pięciolatka. Jak został mi już tylko trawnik i złapałem malinową (co by być politycznie poprawnym) kredkę i zacząłam ową barwić grunt od razu rozległo się pytanie: “Co Ty robisz!?”. Nie wiedzieć czemu spodziewałem się takiej reakcji.

grudzień 29, 2006

Porgram “find” z wykładu

Zaszufladkowany do: C, Programowanie, Studia, Wykłady — elmopl @ 4:46 pm

Na wykładzie został przedstawiony program w ramach tematu o obsłudze plików.
Skopiowane niezbędne minimum

#define MAXLINE 1000
#define MAXSEARCH 64
void search(FILE *file, char *searchstr, int ignore){
   char li_cpy[MAXLINE];
   char line[MAXLINE];
   long linum = 0;
   char *found;

   if(ignore) _strupr(searchstr);
   while( fgets(line, MAXLINE-1, file) ){
      ++linum;
      if(ignore)
         found = strstr(_strupr(strcpy(li_cpy, line)), searchstr);
      else
         found = strstr(line, searchstr);
      if( found != NULL ){
         if(number) printf("%8d: ", linum);
         printf("%s", line);
      }
   }
}

Błąd znajduje się w części merytorycznej nie związanej bezpośrednio z głównym tematem wykładu.

Rozważmy plik

aaabaa
baaaba
a...ab

W którym w ostatniej linii znajduje się 1000 znaków “a”. Funkcja zadziała poprawnie dla pierwszych dwu linii, ale dla ostatniej pominie wszystko po 999 ‘a’ włącznie.
Z tego przykładu idzie bardzo prosta nauka: trzeba uwzględniać, że dane użytkownika zawsze mogą być “złośliwe”.

Ogólnie od siebie mogę powiedzieć, że używanie zmiennych globalnych (w tym define’ów) przy większych (pisanych dłużej jak tydzień i z ewentualnymi potrzebami późniejszych zmian) projektach jest kiepskim pomysłem. Jak znajdę jakiś zwięzły i przejrzysty przykład to dokładniej opiszę czemu.

#define TEXT “jakiś tam napis”, a co z pamięcią?

Zaszufladkowany do: C, Programowanie, Studia, Wykłady — elmopl @ 1:15 pm

Na wykładach jednym z przykładów, który mnie zaintrygował były takie oto linijki kodu:

char *tab_w[5];
tab_w[0] = "To jest tekst na pozycji 0";
#define TKST1 "To jest tekst na pozycji 1";
tab_w[1] = (char *) malloc(strlen(TKST1)+1);
strcpy(tab_w[1], TKST1);

Zastanowiło mnie czy to aby nie zajmie dwa razy za dużo pamięci. Po krótkich testach w domu okazuje się, że (przynajmniej przy kompilacji gcc) jest to zgrabnie optymalizowane.
textAsMacro.c:

#include
#include
#include 

#define TEXT "aaa"

int main(int argc, char **argv){
   printf("%d\n", (int) TEXT);
   printf("%d\n", (int) TEXT);

   printf("%d\n", (int) "aaa");

   return 0;
}

Po wywołaniu:

$ gcc -o textAsMacro.e textAsMacro.c
$ ./textAsMacro.e
134513800
134513800
134513800

Działa to w obrębie tylko jednego pliku z dość oczywistych względów.

Blog na WordPress.com.