Customers Empty

プログラミングに関するメモ

Makefile : ヘッダファイルの更新を考慮する

1つのCソースファイルから1つの実行ファイルを作る ただしヘッダファイルの更新も考慮する

※ヘッダファイル中のヘッダファイルの変更などに対応なし

C=gcc
#CC=i686-w64-mingw32-gcc

CFLAGS=-O2 -g -lm

SRC=$(wildcard *.c)
TARGET=$(basename $(SRC))
DEP=$(addsuffix .d,$(TARGET))
OBJ=$(addsuffix .o,$(TARGET))


.PHONY: all
all:$(DEP) $(TARGET)
#  @rm -f $(DEP)
$(DEP):%.d:%.c
   @gcc -MM $^ | sed -e s/\.o// > $@
   @echo -e "\t$(CC) $(CFLAGS) -o $* $^" >> $@

-include *.d


.PHONY: clean
clean:
  rm -f $(TARGET)
  rm -f $(DEP)
  rm -f $(OBJ)

tex : algorithmパッケージで擬似コードを書く(for...do を for...do in parallel にする方法)

プリアンプルに以下のように書く

ただし, algorithmicと併用しないようにする(なんかおかしくなった)

\usepackage{algorithm}
\usepackage{algcompatible}
\algblockdefx{FORP}{ENDFORP}[1]%
  {\textbf{for}#1 \textbf{do in parallel}}%
  {\textbf{end for}}

以下の例の結果を見る

\begin{algorithm}[!h]                      
\caption{parallel substitution}
\label{alg1}                          
    \begin{algorithmic}[1]               
    \FORP{ $i\leftarrow 0$ to $n-1$}
        \STATE $A[i]\leftarrow i$;
    \ENDFORP
    \end{algorithmic}
\end{algorithm}

結果は以下のようになる f:id:hurou927:20150625143207p:plain

tex : Tableの等幅コラムの作り方

Latexにおいて, tableのコラムの幅を統一する方法(tabularx環境)

以下をプリアンプルに書く

  \usepackage{tabularx}
   \newcolumntype{C}{>{\centering\arraybackslash}X}
   \newcolumntype{L}{>{\raggedright\arraybackslash}X}
   \newcolumntype{R}{>{\raggedleft\arraybackslash}X}
\begin{tabularx}{100mm}{rclRCL}

で横幅100mmのテーブルをつくる

C,L,Rはそれぞれ等幅のコラムにしてくれる

tabular環境のcrlも使える

ただし, 等幅コラムにならない

つまり, 指定した長さのテーブルをL,{r,c,l}で指定したコラムの長さの総和をS, {R,C,L}指定のコラムの数をNとすると, 等幅コラムの横幅は, (L-S)/Nとなる(予想)

これつかって,

こんな感じでtableを書く

     \begin{table}[!h]
        \begin{center}
        \caption{世界の大学進学率(2012年)}
        \label{tab:univ}
        \begin{tabularx}{100mm}{rCr}
            順位&国名&大学進学率(\%)\\
            \hline
            1 & ギリシャ&113.98 \\
            2 & 韓国  & 98.38 \\
            3 & アメリカ & 94.28 \\
            \multicolumn{3}{c}{{\bf $\vdots$}}\\
            41&日本  &61.46 \\
            \multicolumn{3}{c}{{\bf $\vdots$}}\\
            89&メキシコ&28.99\\
            \hline
        \end{tabularx}
        \end{center} 
    \end{table}

以下のようになる f:id:hurou927:20150625141837p:plain これじゃ違いわからなくね?

まぁいいや

c : ポインタのcast [1]

gettimeofdayを用いた時間計測のメモも兼ねて

castによる初期化時間の差を見てみる.

char型80000要素の初期化

long long int型にキャストすると, 80000*(8bit/64bit)=10000回の代入操作が必要

ソース

#include <stdio.h>
#include <sys/time.h>


double get_time_sec(void){
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return((double)(tv.tv_sec)+(double)(tv.tv_usec)*0.001); //ms
}

int main(int argc,char **argv){
    int i;
    double time[3];

    char A[80000];
    long long int *p;
    p=(long long int *)A;


    time[0]=get_time_sec();
    for(i=0;i<80000;i++)
        A[i]=0;
    time[1]=get_time_sec();
    for(i=0;i<80000/8;i++)
        p[i]=0;
    time[2]=get_time_sec();
    
    printf("%f ms\n",time[1]-time[0]);
    printf("%f ms\n",time[2]-time[1]);

    return 0;
}

実行結果

0.181000 ms
0.024000 ms

7.6倍くらいはやい

辻褄はあう

c : ポインタのcast [0]

ポインタをcastしてみる

いざ...

//cast.c
#include<stdio.h>
int main(int argc,char **argv){
    int A[4];
    long long int *p;
    p=(long long int *)A;

    A[0]=1; A[1]=2; A[2]=3; A[3]=4;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);
    *p=0;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);
    *(p+1)=0;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]); 

    return 0;
}

実行結果

$ ./cast
1 2 3 4
0 0 3 4
0 0 0 0

エンディオンに注意!

1を代入するとどうなるかな...

    A[0]=1; A[1]=2; A[2]=3; A[3]=4;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);
    *p=1;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);
    *(p+1)=1;
    printf("%x %x %x %x\n",A[0],A[1],A[2],A[3]);

実行結果

$ ./cast
1 2 3 4
1 0 3 4
1 0 1 0

f:id:hurou927:20150531161238p:plain

python : 正規表現(re)のメモ

reの使い方メモ finditer さえ使えればなんとかなる

#re.py
import re

string=u"Hello, world!"

print u"pattern1"
pattern1 = re.compile(u"H(.*)l")
iterator1 = pattern1.finditer(string)
for match in iterator1:
    print u"   match.group( ) : "+match.group()
    print u"   match.group(1) : "+match.group(1)

print u"pattern2"
pattern2 = re.compile(u"H(.*?)l")
iterator2 = pattern2.finditer(string)
for match in iterator2:
    print u"   match.group( ) : "+match.group()
    print u"   match.group(1) : "+match.group(1)

実行結果

$ python re.py
pattern1
   match.group( ) : Hello, worl
   match.group(1) : ello, wor
pattern2
   match.group( ) : Hel
   match.group(1) : e

python 2.xと3.xの違いは勉強中...

Makefile : 1つのCソースファイルから1つの実行ファイルを作る

1つのCソースファイルから1つの実行ファイルを作る

そんなMakefile

CC=gcc
CFLAG=-g -Wall

SRC=$(wildcard *.c)

TARGET=$(basename $(SRC))

all: $(TARGET)
$(TARGET):%:%.c
  $(CC) $(CFLAG) -o $@ $^
#static pattern rule
#targets... : target-pattern : dep-patterns...

.PHONY: clean
clean:
  rm -f $(TARGET)