Interest の回答履歴
- volatile変数とROM領域について
volatile変数というのは「揮発性変数」という意味です。 「電源を切るとデータが消える」要するに「RAM」であると 考えられます。 しかし、実際、「volatile」が使われるのは、もっぱら 組み込み業界であり、EEPROMアドレス領域変数変数につける 指定子だったりします。 この矛盾について説明いただけないでしょうか。
- PIC16F877Aでのサーボモータ制御
PIC16F877Aでのサーボモータ(futaba S3003)を制御したいのですが、ネットでのソースが少なく難航しています。ちなみに言語はC言語を使っています。とくにパルス出力?のところがわかりません。どなたか教えていただきたいです。
- 超音波センサについて教えてください
超音波センサについてなのですが、パラレルポートを使って制御しようとしているのですがなかなかうまくいきません。 浅草ギ研さんからでているPING)))を使っているのですが、サンプルプログラムがPICを使用してのもので、 トリガをうってやれば、350マイクロ秒ホールドオフした後、音波を出して帰ってきた時の時間で距離を出すというものです。 プログラム全文 #include <12F675.h> #fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT //内部4MHzクロック指定 #use delay(clock=4000000) //delayを使えるようにする #use rs232(baud=9600,xmit=PIN_A5,rcv=PIN_A3,parity=N,bits=8) //シリアル設定 //(上の行説明)GP5を送信、GP3を受信に設定。 //12F675の場合は初期値がADCモードになっているので、デジタル入力を使う場合は事前にADCなどを切る必要がある。 //16F84などのPICはこの処理は不要。(初期値がデジタルIOだったり、ADCが無かったりする。) //コンパレータとADCを切るために特殊レジスタを操作します。とりあえずアドレスを割り当て。(アドレスはデータシートに書いてある) #byte CMCON=0x19 #byte GPIO=0x05 #byte ANSEL=0x9F void main(void){ set_tris_a(0x00); output_low(PIN_A0); //GP0をLowに(とりあえず。) //コンパレータなどを切って、デジタルIOピンにする処理 GPIO=0x00; //以下3行はデジタルIOに切り替える手順 CMCON=0x07; ANSEL=0x00; //タイマ0を設定(内部クロック使用の場合は4クロックで1カウントなので注意) setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128); delay_ms(1000); //PINGが正常に立ち上がるまで待つ printf("START\r\n"); while(1){ set_tris_a(0x00); //GP0を出力に //トリガパルス出力 output_high(PIN_A0); //トリガパルス立ち上げ delay_us(5); output_low(PIN_A0); //トリガパルス立ち下げ //GP0を入力に切り替え set_tris_a(0x01); //GP0を入力に //パルス幅測定 while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ printf("Dist=%u\r\n\r\n",get_timer0()); //結果出力 delay_ms(500); //0.5mSウェイト } } こんな感じです。 全体的にわからないんですが、 特に while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ この部分のlinuxのC言語への書き換え方がわからなくて苦労しています。 どなたか教えてもらえないでしょうか? OSはVine linuxです。言語はC言語です。
- 締切済み
- C・C++・C#
- sakisan907
- 回答数1
- volatile変数とROM領域について
volatile変数というのは「揮発性変数」という意味です。 「電源を切るとデータが消える」要するに「RAM」であると 考えられます。 しかし、実際、「volatile」が使われるのは、もっぱら 組み込み業界であり、EEPROMアドレス領域変数変数につける 指定子だったりします。 この矛盾について説明いただけないでしょうか。
- 点Qから最短距離の点Piを効率的に求めたい
平面上にP1,P2,...,Pnが与えられています。 このとき、任意の点Qを与えると、Qからの距離の最短の点(等距離の点が複数あれば、そのうちの任意の1点)を返す関数(任意といった時点で数学的には関数でなくなっていますが)が欲しいのです。 単純に考えれば、forループで、全てのPiとの距離を求め、最短のPiを返せば良いのですが、点Qが移動する場合、直前のQに対応するPiである可能性が高いので、もう少し賢いアルゴリズムがある気がします。しかし、具体的なアルゴリズムが思いつきませんので、お知恵をお貸しください。 プログラミングはCを想定しています。
- A/DデータをSCIを利用してPCに表示したいのですが
H8/3052Fとポテンショメータ(通信ケーブルはRS232-C)を利用して得られるA/DデータをPCに表示させようとしています。 SCIとPCに最初から入っているハイパーターミナルを利用してA/Dデータを得たいのですが上手く行きません。 参考にしている資料のサンプルプログラム(文字をPCに返す)が上手く行ったのでそれと、A/Dデータ変換プログラムを組み合わせて行いました。 ですが、結果として文字列が表示されるものの数値データが帰ってきませんでした。 組みなおしましたが、出てくるのは文字(プログラム変更で無限に出る場合あり)と無限スペース(改行?)で進展しません。 考えとしては、文字データを返すプログラム文とは別に数値データを返すプログラム文にしないといけないのかな?と、思って調べたのですがこの考えを裏づけるものはありませんでした。(着目点が違うのかもしれませんが・・・)
- 大規模データの処理について困っています
掲題の通り、大規模データの処理で悩んでおります。 行ベクトル150万、列ベクトル14のCSVファイルを読み込もうとしているのですが、データ数が10万以上になるとVisual C++が勝手に動作を停止してしまいプログラムを実行することができません。 具体的には、CSVファイル上の4列目に記載されている都道府県名のデータを配列で取り、画面に表示しようと、次のようなプログラムを書いているのですが、 #include<stdio.h> #include<string.h> #include<stdlib.h> #define FNAME "data.csv" #define NUM 10000 int main(void) { FILE *fp; char buf[256]; char *p_token; char dat[14][100]; int n; int i; long int j; char *place[NUM][15]; place[NUM][15]=(char*)malloc(sizeof(char)*NUM); fp = fopen(FNAME,"r"); if (fp == NULL) { printf("ファイルをオープンできませんでした\n"); return 0; } for(j=0;j<=NUM;j++){ fgets(buf,256,fp) !=NULL; p_token = strtok(buf, ","); strcpy(dat[0],p_token); n=1; while(-1) { p_token = strtok(NULL,","); if(p_token == NULL) { break; } strcpy(dat[n],p_token); n++; } if(j!=0) { place[j-1][10]=dat[3]; printf("%s \n",place[j-1][10]); } } fclose(fp); free(place[NUM][15]); return 0; } NUMの数を10万以上にすると、実行してもプログラムが勝手に停止してしまいます。書籍もネットも大分読み漁ったのですが、処置がまったくわからず途方にくれています。 どなたかこうした処理に詳しい方、アドバイスをいただけないでしょうか。よろしくお願い申し上げます。 追記:(1)都道府県名を二次元配列で取っているのは、都道府県名が「大阪府」などと、CSVファイル上で日本語で記載されているからです。 (2)プログラムを実行する際にデータ数を10万以上にすると、CSVファイルをフォルダ内においていなくてもプログラムが停止します(ただしコンパイルエラーはでません)。つまり、メモリの確保に問題があるということになるのでしょうか?
- 大規模データの処理について困っています
掲題の通り、大規模データの処理で悩んでおります。 行ベクトル150万、列ベクトル14のCSVファイルを読み込もうとしているのですが、データ数が10万以上になるとVisual C++が勝手に動作を停止してしまいプログラムを実行することができません。 具体的には、CSVファイル上の4列目に記載されている都道府県名のデータを配列で取り、画面に表示しようと、次のようなプログラムを書いているのですが、 #include<stdio.h> #include<string.h> #include<stdlib.h> #define FNAME "data.csv" #define NUM 10000 int main(void) { FILE *fp; char buf[256]; char *p_token; char dat[14][100]; int n; int i; long int j; char *place[NUM][15]; place[NUM][15]=(char*)malloc(sizeof(char)*NUM); fp = fopen(FNAME,"r"); if (fp == NULL) { printf("ファイルをオープンできませんでした\n"); return 0; } for(j=0;j<=NUM;j++){ fgets(buf,256,fp) !=NULL; p_token = strtok(buf, ","); strcpy(dat[0],p_token); n=1; while(-1) { p_token = strtok(NULL,","); if(p_token == NULL) { break; } strcpy(dat[n],p_token); n++; } if(j!=0) { place[j-1][10]=dat[3]; printf("%s \n",place[j-1][10]); } } fclose(fp); free(place[NUM][15]); return 0; } NUMの数を10万以上にすると、実行してもプログラムが勝手に停止してしまいます。書籍もネットも大分読み漁ったのですが、処置がまったくわからず途方にくれています。 どなたかこうした処理に詳しい方、アドバイスをいただけないでしょうか。よろしくお願い申し上げます。 追記:(1)都道府県名を二次元配列で取っているのは、都道府県名が「大阪府」などと、CSVファイル上で日本語で記載されているからです。 (2)プログラムを実行する際にデータ数を10万以上にすると、CSVファイルをフォルダ内においていなくてもプログラムが停止します(ただしコンパイルエラーはでません)。つまり、メモリの確保に問題があるということになるのでしょうか?
- スタックとキューについて
書籍やサイトに書かれている内容は分かる(見た目)のですが、 だから何なのでしょうか? どういったことに応用が効きますか? 難しい事はわからないので具体例を示していただけると助かります。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- hardtechno
- 回答数12
- PICマイコンのC言語について
とりあえずカテゴリーはここでいいのかな?・・・。 PICマイコンでC言語を使いたいと考えております。本を色々みるとCでも何種類かあるようです・・。そこでこれからC言語を勉強しようと思っていますがどれがいいのでしょうか?というよりそれぞれどう違うのでしょうか?将来的にはPIC以外でもH8も使いたいと考えていますので共通で使用できるものはあるでしょうか? 初歩的かもしれませんがまだまだ素人なのでよろしくお願いします。 どうもCは色々ありすぎて何がなにやら・・・・。
- スタックとキューについて
書籍やサイトに書かれている内容は分かる(見た目)のですが、 だから何なのでしょうか? どういったことに応用が効きますか? 難しい事はわからないので具体例を示していただけると助かります。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- hardtechno
- 回答数12
- 配列
1, 1,2, 3,2,1, 1,2,3,4, 5,4,3,2,1, . . . これらの数字を配列のvd[1~100]に順番に入れていきたいんですけどどうしたらいいでしょう。 あとその反対の 1, 2,1, 1,2,3, 4,3,2,1, 1,2,3,4,5, . . . をvm[1~100]に順番に入れたいのですが、 ループさせてうまく配列に入れられないでしょうか。 わかるかた教えてください。 お願いします。
- 締切済み
- C・C++・C#
- nyandafull
- 回答数1
- H8/3664FのA/D変換について
H8/3664Fを使ってA/D変換した信号を配列に一時的に格納し,その後その信号を処理する プログラムを作成したのですが,A/D変換を行ってくれません。 いろいろ試した結果,配列を定義するとA/D変換を行ってくれないようです。 どなたかこの現象の原因と対策方法についてご存じないでしょうか。
- H8/3664FのA/D変換について
H8/3664Fを使ってA/D変換した信号を配列に一時的に格納し,その後その信号を処理する プログラムを作成したのですが,A/D変換を行ってくれません。 いろいろ試した結果,配列を定義するとA/D変換を行ってくれないようです。 どなたかこの現象の原因と対策方法についてご存じないでしょうか。
- C#を勉強したいが・・・
C#をSTUDYしたいと思っているのですが・・・環境の整え方で困っております。 まず開発環境ソフトを見てみましたがマイクロソフトのHPとか見て「うひゃーこんなに値段するの?」と思いました。 無料のソフトとか無いものでしょうか・・・ あとパソコンのスペックです。 HDD30GBでメモリが256MBの低スペックです。 動かせるものはありますでしょうか? 教えてgoo!
- ベストアンサー
- C・C++・C#
- komarimono
- 回答数3
- H8/3664FのA/D変換について
H8/3664Fを使ってA/D変換した信号を配列に一時的に格納し,その後その信号を処理する プログラムを作成したのですが,A/D変換を行ってくれません。 いろいろ試した結果,配列を定義するとA/D変換を行ってくれないようです。 どなたかこの現象の原因と対策方法についてご存じないでしょうか。
- C言語 説明文
C言語(文字列のコピーについて) /* 文字列のコピーを行う関数の実現例 動作原理のコメントを書き入れる */ #include <stdio.h> /*-----文字列のコピー(1)-----*/ char *scpy1 (char *d, const char *s) { int i = 0; while ((d[i] = s[i]) != '\0') { i++; } return(d); } /*-----文字列のコピー(2)-----*/ char *scpy2 (char *d, const char *s) { char *p = d; while ((*d = *s) != '\0') { d++; s++; } return(p); } /*-----文字列のコピー(3)-----*/ char *scpy3 (char *d, const char *s) { char *p = d; while ((*d++ = *s++) != '\0') { ; } return(p); } /*-----文字列のコピー(4)-----*/ char *scpy4 (char *d, const char *s) { char *p = d; while (*d++ = *s++) { ; } return(p); } int main(void) { char astr[] = "ABC"; char bstr[8], cstr[8], dstr[8],estr[8]; scpy1 (bstr, astr); scpy2 (cstr, astr); scpy3 (dstr, astr); scpy4 (estr, astr); printf("astr = %s\n" , astr); printf("bstr = %s\n" , bstr); printf("cstr = %s\n" , cstr); printf("dstr = %s\n" , dstr); printf("estr = %s\n" , estr); return (0); } ----------------------- このプログラムに、この行で何をやっているのかわかるように 一言くらいの説明文を入れる問題です。 ところどころはわかるのですが、わからないところの方が多いです。 プログラムが長くて大変かとは思いますが、どうかよろしくお願いいたします。 このプログラム自体はちゃんとコンパイルでき、実行もできたので おそらく間違いないと思います。