マイコンプラス

    二足歩行ロボットの制御やセンサの使い方、ロボットキット、ロボットの大会などについて紹介します

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。
    [ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

    [C++]CSVファイルの読み込み

     CSVファイルを読み込んで,カンマを除いたデータを配列に書き込むプログラムです.
     Split(string &src, string key)でカンマの読み飛ばし,readCSV(string filename, int* p)でファイルのOpenと文字列データの数値への変換,配列への書き込みを行います.

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    #include <vector>

    using namespace std;

    vector<string> Split(string &src, string key);
    bool readCSV(string filename, int* p);

    int main(void){
    int data[256];//ファイルから読み込んだ数値を入れる配列

    readCSV("data.csv", data);//ファイルから読み込み

    //最初の10個を表示させてみる
    for(int i = 0; i < 10; ++i) {
    cout << data[i] << endl;
    }
    }

    bool readCSV(string filename, int* p) {
    fstream file;
    string str;

    file.open(filename.c_str(), ios::in);
    if(! file.is_open()) {
    return false;
    }

    while(getline(file, str)) {
    vector<string> str_line = Split(str, (string)",");
    int size = str_line.size();

    for(int i = 0; i < size; ++i) {
    stringstream sstr;
    sstr << str_line[i];
    sstr >> p[i];
    }
    p += size;
    }
    file.close();
    return true;
    }

    vector<string> Split(string &src, string key) {

    string str = src;
    vector<string> str_line;
    int str_len = str.length();
    int key_len = key.length();

    int index = 0;
    while(index < str_len) {
    int oldindex = index;
    index = str.find(key, index);
    index = (index == string::npos ? str_len : index);
    string tmp = str.substr(oldindex, index - oldindex);
    str_line.push_back(tmp);
    index += key_len;
    }
    return str_line;
    }

    スポンサーサイト
    [ 2012/11/30 02:15 ] C言語 | TB(0) | CM(0)

    [C++]1次元配列を3次元配列に整形する

     外部RAMなんかに書き込んでおいたデータを扱いやすくするために3次元配列の形にしたいことがありました.案外てこずったのでメモしておきます.
     3次元として持つための領域を動的に確保しているのでサイズが可変です.


    #include <iostream>
    using namespace std;

    int data[256]; //元となるデータ領域

    int main()
    {
    //データ領域への値の代入
    for(int i = 0; i < 256; ++i) {
    data[i] = i;
    }

    //3次元配列の大きさ
    char size_z = 3;
    char size_y = 4;
    char size_x = 5;

    //とりあえずポインタに元のデータ領域の先頭アドレスを代入
    int* p = data;

    //3次元配列arrayへの整形
    int*** array = new int**[size_z];
    for (int i = 0; i < size_z; ++i) {
    array[i] = new int*[size_y];
    for (int j = 0; j < size_y; ++j) {
    array[i][j] = p + size_x * j;
    }
    p += size_x * size_y;
    }

    //確認のため表示
    for (int i = 0; i < size_z; ++i) {
    for (int j = 0; j < size_y; ++j) {
    for (int k = 0; k < size_x; ++k) {
    cout << array[i][j][k] << endl;
    }
    }
    }

    //メモリの解放
        for (int i = 0; i < size_z; i++) {
    delete[] array[i];
    }
    delete[] array;

    }



    (sizeof int) * (1 + size_z)だけのメモリを消費します.
    [ 2012/11/16 01:15 ] C言語 | TB(0) | CM(0)

    C言語のポインタについてまとめ

    ポインタの宣言


    char *a;


    とする。間接参照演算子*とは別。

    間接参照演算子*


    char *a;
    について間接参照演算子*を使うとその型は

    aはcharのポインタ
    *aはchar型


    アドレス演算子&


    char a;
    についてアドレス演算子&を使うとその型は

    aはchar型
    &aはcharのポインタ


    ポインタと配列


    宣言の仕方による違い色々

    char a[5];//←配列(要素数5)
    char *b[5];//←ポインタの配列(要素数5)
    char (*c)[5];//←配列(要素数5)へのポインタ
    char (*d[6])[5];//←配列(要素数5)へのポインタの配列(要素数6)



    ポインタと構造体


    以下のような構造体test1、構造体ポインタtest2について考える。

    struct TEST
    {
    char a;
    char b[5];
    char *c;
    char *d[5];
    char (*e)[5];
    char (*f[6])[5];
    };
    struct TEST test1;
    struct TEST *test2;


    それぞれの構造体のメンバへの値アクセスの方法は

    test1.a=10;
    test1.b[0]=10;
    *(test1.c)=10;
    *(test1.d[0])=10;
    *(test1.e)[0]=10;
    *(test1.f[0])[0]=10;

    test2->a=10;
    test2->b[0]=10;
    *(test2->c)=10;
    *(test2->d[0])=10;
    *(test2->e)[0]=10;
    *(test2->f[0])[0]=10;

    [ 2011/04/14 22:54 ] C言語 | TB(0) | CM(0)


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。