lapsus alumni

Grudzień 30, 2006

Przykłady wxWidgets

Filed under: Programowanie — elmopl @ 12:25 am

Dodałem stronę zasoby, a w niej trochę przykładów do wxWidgets.

Grudzień 29, 2006

Porgram “find” z wykładu

Filed under: 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ą?

Filed under: 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.

Grudzień 28, 2006

始める

Filed under: Sieć — elmopl @ 3:03 pm

Kolejna próba założenia osobistej strony. Tym razem na gotowym skrypcie – tak z lenistwa.
A na serwerze WordPress’a, bo:
- Mój osiedlowy jest głupio skonfigurowany (a nie chce mi się pisać po raz kolejny w tej samej sprawie do admina) i musiałbym edytować większość plików.
- Adminstratorzy serwera wydziałowego wypięli się na użytkowników chcących skorzystać z bazy danych. Zero informacji o tym czy, a jeśli to jak się połączyć z takową (z czystej życzliwości pominę estetykę stron zawierających informacje o kontach www dla studentów). Choć może to tylko ja jakiś ułomny jestem, że potrzebuję/nie umiem znaleźć tej informacji.

Theme: Shocking Blue Green. Blog na WordPress.com.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.