絶対アドレス指定したポインタを2次元配列で使う(C)

普通はまず無いですが、絶対アドレス指定したポインタを1次元配列で使うには以下になります。

int *hoge = (0x77777777);
hoge[0] = 0;
fuga(&hoge[0]);

この場合ポインタは int 分アドレスをインクリメントする事で各配列のアドレスを決める事になります。

ただ2次元配列を使用する場合は、配列の各要素を移動する間にどれだけアドレスをインクリメントするかを指定してやる必要があります。

int (*hoge)[8] = (0x77777777);
hoge[0][0] = 0;
fuga(&hoge[0][0]);

上記の例では、ポインタがインクリメントされる毎に32Byteアドレスが飛ぶ事になります。

テーマ : プログラミング
ジャンル : コンピュータ

2011-09-08 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

シェアードオブジェクト(.so)のリンク方法

gccでシェアードオブジェクト(.so)のリンク方法が分からずはまってしました。

ですが、環境変数「LD_LIBRARY_PATH」にシェアードオブジェクトのパスを通す事で解決できました。

テーマ : プログラミング
ジャンル : コンピュータ

2011-07-08 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

cygwinでsystemcを動作させた場合のメモ

まずインストール時にエラーが出たり、大きなプログラムがまともに動作しない場合があるため、以下のページを参考にします。

http://www10.atwiki.jp/bambooflow/pages/77.html

systemc-2.2.0/src/sysc/kernel/sc_constants.hの57行目修正。

const int SC_DEFAULT_STACK_SIZE = 0x50000; // default 0x10000

src/sysc/utils/sc_utils_ids.cpp の61行目あたりに共通ライブラリのインクルードが必要。

#include <cstring>
#include <cstdlib>

後、Makefileの雛形。


CC = g++ -O2

PROGRAM = hoge.exe
ARCH = cygwin
SYSTEMC = /usr/local/systemc-2.2.0

INCDIR = -I. \
-I$(SYSTEMC)/include/
LIBDIR = -L$(SYSTEMC)/lib-$(ARCH)/
LIBS = -lsystemc -lm

SRCS = hoge.cpp \
main.cpp
OBJS = $(SRCS:.cpp=.o)

all:$(PROGRAM)

$(PROGRAM):$(OBJS)
$(CC) -o $@ $^ $(LIBDIR) $(LIBS)

.cpp.o:
$(CC) $(INCDIR) -c $< -o $@

clean:
rm -fr $(PROGRAM) $(OBJS)

テーマ : プログラミング
ジャンル : コンピュータ

2011-04-12 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

レジスタのフィールドdefineを用意しておこう

if文評価するための "リード値&hoge"、値を設定するための "リード値|hoge"、値をクリアするための "リード値&~hoge" 等、使う場面は多いので、レジスタのフィールドdefineを用意しておきましょう。
2011-02-18 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

構造体ポインタの配列と関数ポインタの配列

Cでドライバー等を作成する場合に必要となるテクニックとして、構造体ポインタの配列と、関数ポインタの配列になります。

構造体ポインタの配列はこんな感じですね。


typedef struct {
...
} StrHoge;

static StrHoge *sh[NUM];


これにmain()等で定義した構造体のアドレスを引数経由で渡してやるわけです。メンバにポインタを使えばどんなデータもパッケージ化してやりとり可能です。


sh[0] = strptr;

sh[0]->...;


関数ポインタの配列はこんな感じですね。


static void (*FuncHoge[NUM])(...);


構造体と同じく、main()等で定義した関数のアドレスを引数経由で渡してやるわけです
とりあえず関数の中身は分かりませんが、割り込みハンドラの最後等でコールしておけば、擬似的なオーバーライドとなります。


FuncHoge[0] = funcptr;

(*FuncHoge[0])(...);


ちなみに両者ともヘッダーに書かず、隠蔽して直接触らせないようにしておきます。

テーマ : プログラミング
ジャンル : コンピュータ

2011-01-13 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

プログラミング本

自分にとって非常に影響を受けたプログラミング本をまとめておきます。

標準講座C++

CとC++が一冊で学べてしまう本。非常に分かりやすいです。自分はこれを何回も読んでプログラミングの基礎を固めました。今では改訂版が出ています。

初めてのPerl

スクリプト系のプログラミング言語といえばPerlですが、基本ルールがC/C++と異なるため、一度体系的に勉強する必要があると思い買った本。これも非常に分かりやすいです。今ではなんと5版が出ているようですね。

テーマ : ひとりごとのようなもの
ジャンル : 日記

2010-11-01 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

JDK6インストール

デフォルトのJavaコンパイラはgijですが、JDK6をインストールします。

以下のサイトに飛び、
http://java.sun.com/javase/ja/6/download.html

32bitLinuxの場合は次のファイルをダウンロードし、rootで実行します。
jdk-6u4-linux-i586-rpm.bin

gijのシンボリックリンクを、

/usr/bin/java -> /etc/alternatives/java
/usr/bin/javac -> /etc/alternatives/javac

JDK6に張り直します。

/usr/bin/java -> /usr/java/jdk1.6.0_04/bin/java
/usr/bin/javac -> /usr/java/jdk1.6.0_04/bin/javac

環境変数も設定しておきます(tcshの場合)。

setenv JAVA_HOME /usr/java/jdk1.6.0_04

以下のサンプルソースを実行します。

■ Sample.java

import javax.swing.*;

public class JFrameTest1{

public static void main(String[] args){
JFrame frame = new JFrame("Frame Title");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds( 10, 10, 300, 200);
frame.setVisible(true);
}
}

■ Execute
javac Sample.java
java Sample

テーマ : Java
ジャンル : コンピュータ

2008-03-02 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

コンテナ要素の表示、数挿入

コンテナ全ての要素に対して標準出力、インクリメント(デクリメント)数を挿入する関数です。
テスト等する際に便利なんで挙げておきます。

"The C++ Standard Library - A Tutorial and Reference"参照


/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference"
* by Nicolai M. Josuttis, Addison-Wesley, 1999
*
* (C) Copyright Nicolai M. Josuttis 1999.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#ifndef ALGOSTUFF_HPP
#define ALGOSTUFF_HPP

#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <iterator>
#include <functional>
#include <numeric>

/* PRINT_ELEMENTS()
* - prints optional C-string optcstr followed by
* - all elements of the collection coll
* - separated by spaces
*/
template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
typename T::const_iterator pos;

std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}

/* INSERT_ELEMENTS (collection, first, last)
* - fill values from first to last into the collection
* - NOTE: NO half-open range
*/
template <class T>
inline void INSERT_ELEMENTS (T& coll, int first, int last)
{
for (int i=first; i<=last; ++i) {
coll.insert(coll.end(),i);
}
}

#endif /*ALGOSTUFF_HPP*/

テーマ : プログラミング
ジャンル : コンピュータ

2007-09-20 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop

C++のthis

C++でthisって"."でなく、アロー演算子だったんだねぇ…


#include <iostream>;
using namespace std;

class thistest
{
private:
int val;
public:
thistest(int val)
{
this->val = val;
}

void print()
{
cout << val << endl;
}
};

int main()
{
thistest tt(777);

tt.print();

return 0;
}

テーマ : プログラミング
ジャンル : コンピュータ

2007-09-12 : Work-Linux-C/C++/Java : コメント : 2 : トラックバック : 0
Pagetop
ホーム  次のページ »

プロフィール

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター