Dodałem stronę zasoby, a w niej trochę przykładów do wxWidgets.
Grudzień 30, 2006
Grudzień 29, 2006
Porgram “find” z wykładu
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ą?
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
始める
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.