在宅ワークのリアルをベテランとビギナーにインタビュー>>

現在visual studio 2017を用いて、arduino unoとシリアル通信をしたいと思っております。
下記のサイトを参考に作成しているのですが、エラーが消えません。

http://monitorgazer.blogspot.jp/2013/06/carduino …

エラー内容は以下の通りです。

C4430 型指定子がありません-intと仮定しました。メモ:C++はintを規定値としてサポートしていません
C2146 構文エラー:';'が識別子'arduino'の前に必要です
C2065 ’BYTE’は定義されていない識別子です。

以下同じようなエラーが続いています。

もしよろしければ、アドバイスを頂けないでしょうか。
よろしくお願いいたします。
uino_example.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdafx.h"
//#include "WinNT.h"


HANDLE arduino;
bool Ret;

void main(void) {
BYTE data = 1;
//1.ポートをオープン
arduino = CreateFile("COM3", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。

if (arduino == INVALID_HANDLE_VALUE) {
printf("PORT COULD NOT OPEN\n");
system("PAUSE");
exit(0);
}
//2.送受信バッファ初期化
Ret = SetupComm(arduino, 1024, 1024);
if (!Ret) {
printf("SET UP FAILED\n");
CloseHandle(arduino);
system("PAUSE");
exit(0);
}
Ret = PurgeComm(arduino, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
if (!Ret) {
printf("CLEAR FAILED\n");
CloseHandle(arduino);
exit(0);
}
//3.基本通信条件の設定
DCB dcb;
GetCommState(arduino, &dcb);
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600;
dcb.fBinary = TRUE;
dcb.ByteSize = 8;
dcb.fParity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

Ret = SetCommState(arduino, &dcb);
if (!Ret) {
printf("SetCommState FAILED\n");
CloseHandle(arduino);
system("PAUSE");
exit(0);
}
//4.送信
DWORD dwSendSize;
DWORD dwErrorMask;

Ret = WriteFile(arduino, &data, sizeof(data), &dwSendSize, NULL);
if (!Ret) {
printf("SEND FAILED\n");
CloseHandle(arduino);
system("PAUSE");
exit(0);
}
printf("FINISH\n");
CloseHandle(arduino);
system("PAUSE");
}

「visual C++ でaruduino」の質問画像

質問者からの補足コメント

  • Win32コンソールアプリケーションを用い、追加のオプションでプリコンパイル済みヘッダーを用いました。プロジェクトの設定とは以下の画像のプロパティのことでしょうか?
    無知で申し訳ないですが、よろしくお願いいたします。
    あと、""を<>に直すと、include <stdafx.h>の部分でエラーが発生してしまいました。

    「visual C++ でaruduino」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2017/07/27 13:25

A 回答 (2件)

>あと、""を<>に直すと、include <stdafx.h>の部分でエラーが発生してしまいました。



失礼。
stdafx.hは””でOKでした。

https://msdn.microsoft.com/ja-jp/library/6sehtct …

ということで…
windows.h、stdlib.hはstdafx.hの方へ移動。
uino_example.cppにはstdafx.hのみでOKです。

さらに、プロジェクトに追加されているtargetver.hを編集。
元々の#include <SDKDDKVer.h>の前に
#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0A00
を追加。
# _WIN32_WINNTの値は対象の環境に合わせて変更してください。
http://qiita.com/hkuno/items/7b8daa37d9b68e390d7e
とか参考になるでしょう。

ココまでで…
1>error C2664: 'HANDLE CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE)': 引数 1 を 'const char [5]' から 'LPCWSTR' へ変換できません。
1>note: 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
となります。
エラーメッセージに従って変更するか、プロジェクトのプロパティの「全般」にある「文字セット」を「マルチ バイト文字セット~」に変更するとビルドが通るでしょう。
# "COM3"を_T("COM3")でもいい。
    • good
    • 0

>現在visual studio 2017を用いて



プロジェクトの設定は?
最初に作成するときのテンプレートはどれを選択しました?

>#include "windows.h"
>#include "stdio.h"
>#include "stdlib.h"
>#include "stdafx.h"

""ではなく、<>かと思いますが。
まぁ、ちゃんと設定されていれば読んでくれる…かな。
# オープンエラーにはなっていないようですし。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QC言語で、べき乗の計算をするプログラムについてです

X^8の計算を、掛け算を使わずに、足し算と引き算を使って計算するプログラムを作成するというものです。
足し算のみを使ってべき乗の計算をするプログラムは以下のソースコードの様にできたのですが、足し算と引き算の両方ともを使って計算するプログラムがわかりません。
べき乗の計算をどのように考えれば、足し算と引き算の両方を使って計算できるのか教えてください。
以下、足し算のみを使って計算するプログラムのソースコードです。
・・・ソースコード・・・
#include<stdio.h>

int main(void) {

int i, j, k;
i = 0; ///①Xの加算回数の値を保持する変数iを0に初期化する。///
j = 0; ///②X^2の加算回数の値を保持する変数jを0に初期化する。///
k = 0; ///③X^4の加算回数の値を保持する変数kを0に初期化する。///
double X, goukei1, goukei2, goukei3;
X = 0;
goukei1 = 0; ///④X^2の計算値を保持する変数goukei1を0に初期化する。///
goukei2 = 0; ///⑤X^4の計算値を保持する変数goukei2を0に初期化する。///
goukei3 = 0; ///⑥X^8の計算値を保持する変数goukei3を0に初期化する。///

printf("X=");
///数値Xを入力///
scanf_s("%lf", &X);

///⑦iがX以下か判定し、真ならば⑧~⑨を繰り返し、偽ならば繰り返しを終了する。///
for (i = 0; i < X; i++) { ///⑨iに1を加算する。///
goukei1 += X; ///⑧goukei1にXを加算する。///
}

///⑩jがgoukei1以下か判定し、真ならば⑪~⑫を繰り返し、偽ならば繰り返しを終了する。///
for (j = 0; j < goukei1; j++) { ///⑫jに1を加算する。///
goukei2 += goukei1; ///⑪goukei2にgoukei1を加算する。///
}

///⑬kがgoukei2以下か判定し、真ならば⑭~⑮を繰り返し、偽ならば繰り返しを終了する。///
for (k = 0; k < goukei2; k++) { ///⑮kに1を加算する。///
goukei3 += goukei2; ///⑭goukei3にgoukei2を加算する。///
}
///最終的な計算結果を出力///
printf("X^8=%f", goukei3);

return 0;
}

X^8の計算を、掛け算を使わずに、足し算と引き算を使って計算するプログラムを作成するというものです。
足し算のみを使ってべき乗の計算をするプログラムは以下のソースコードの様にできたのですが、足し算と引き算の両方ともを使って計算するプログラムがわかりません。
べき乗の計算をどのように考えれば、足し算と引き算の両方を使って計算できるのか教えてください。
以下、足し算のみを使って計算するプログラムのソースコードです。
・・・ソースコード・・・
#include<stdio.h>

int main(void) {
...続きを読む

Aベストアンサー

「引き算を使え」という問題の意図がよくわかりませんが、単純にfor文のカウンタ(質問文ではi, j, k)を加算ではなく減算でカウントするっていう意味だったりしないでしょうか。

ところで、X^8 = ((X^2)^2)^2 というアイデアは数学的には賢いやり方ですが、
足し算縛りのプログラムで作ると実は計算量は大きくなると思います。
X^8 = ((((((X*X)*X)*X)*X)*X)*X)*X の方が、実は計算回数が少なくて済みます。
X=10の場合、前者は10,110回、後者は70回の足し算になります。

QプログラミングC言語

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j++)
printf("%3d",y[i][j]);
putchar('\n');
}


printf("\nx*y=\n");

for(i=0; i<2; i++){
for(j=0; j<2; j++)
printf("%3d",z[i][j]);
putchar('\n');
}



return 0;
}

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]...続きを読む

Aベストアンサー

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j++)
printf("%3d",y[i][j]);
putchar('\n');
}


printf("\nx*y=\n");

for(i=0; i<2; i++){
for(j=0; j<2; j++)
printf("%3d",z[i][j]);
putchar('\n');
}



return 0;
}

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j+...続きを読む

Qfor文の部分を日本語で教えてください

for文の部分を日本語で教えてください

Aベストアンサー

> これだと2が素数として表示されなくないですか?

数 i が素数なのか判定する数 j は、1 より大きく自分自身より小さい数の全てです
→ i = 2 の場合、数 j は 1 より大きく 2 より小さい数の全て
→ つまり自然数の j は存在しません

数 i の約数に、数 j が含まれていたら、それは素数ではありません
→ i = 2 の場合、自然数 j が存在しないので、含まれているわけがない
→ ゆえに 2 は素数です

QC言語について質問お願いします まだ勉強中なのでご指導よろしくお願いします str1=big str

C言語について質問お願いします

まだ勉強中なのでご指導よろしくお願いします

str1=big
str2=city
str3=bigcity

という結果にしたいのですが下のような結果になり困っております(´;Д;`)

もっといい書き方もあるかもしれませんが、今書いてあるコードを活かして訂正して結果通りになるにはどうすればいいでしょうか?!

その他アドバイスありましたら先輩方よろしくお願いしますm(_ _)m

Aベストアンサー

一つ訂正します
誤) char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
正) char str1[4]={"big"},str2[5]={"city"}, str3[1]={0};

ベテランでもこういう単純な間違いをすることがあります。
間違えもいいんです。それに気付いて直せれば。

ダメなときは、どこでダメになっているかを調べ、何故ダメになるかを調べ、どうすればダメじゃなくなるかを考えます。
これはベテランでも初心者でも変わりません。



原因は str3[1],str3[2] ...と範囲外に書き込んだことです。
例えるなら、「子供に紙とクレヨン渡したら、調子にのって床にまで絵を描いてしまった」状態です。
よって、対策は
・これらに書きこまないようにする。つまり、配列に収まる大きさの文字列にする
 (例えるなら「紙の外に描かないような小さな絵にする」)
・これらが書き込まれても問題ない状態にする。つまり、配列の大きさを十分に大きくする
 (例えるなら「絵が入るくらいの大きな紙にする」)
のどちらか、となります。

今回の場合、書き込みたい文字列が決まっているので、前者の「収まる文字列にする」という方法は使えません。
よって、後者の「文字列が収まる配列にする」が正解になります。

配列の大きさの指定方法はわかりますね?

一つ訂正します
誤) char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
正) char str1[4]={"big"},str2[5]={"city"}, str3[1]={0};

ベテランでもこういう単純な間違いをすることがあります。
間違えもいいんです。それに気付いて直せれば。

ダメなときは、どこでダメになっているかを調べ、何故ダメになるかを調べ、どうすればダメじゃなくなるかを考えます。
これはベテランでも初心者でも変わりません。



原因は str3[1],str3[2] ...と範囲外に書き込んだことです。
例えるなら、「子供に紙とクレヨン渡...続きを読む

QC言語 a * b / c の計算

特に困っているわけではないのですが、エレガントな方法が見つからないので質問します。

a,c は32ビット、bは8ビット、0<a≦c、0<b がわかっているとします。
このとき、8ビットの整数計算値 a * b / c を「最大32ビットの範囲」で計算する方法、教えてください。
一応C言語で考えていますので、以下の***の部分の具体的な計算方法がわかればうれしいです。

int a,c; // 32bit 符号付き整数
signed char b,d; // 8bit 符号付き整数
if(a<2^(32-8)) d = a * b /c;
else **** ← この部分のプログラム

Aベストアンサー

決してエレガントではありませんが、a, cは正でありしかし符号付の型だという前提で a * b / c の整数の商を求めるのであれば、最初にa - cを求めて一時変数に代入しておき、bの数だけループし、ループ中に一時変数にaを加え、それがc以上になったらdを1加えて一時変数からcを引き去ることを繰り返せば、間違いなくすべての数値は32ビット以内に収まると思います。CPUにALUしかない時代の発想で、歳がばれますね・・・

Q初歩的質問 C++

visualstudio2015 でC++のコードを作成しているのですが、
ヘッダファイル・メインのファイル(.cpp)をそれぞれ現時点のもの
(更新されないもの)として保存したいのですが、vsには既存の機能
としてこれに対応するものはあるのでしょうか?
どなたか教えてください。お願いします。

Aベストアンサー

もしかしたら、「構成管理」で検索してみると幸せになれるかもしれませ。

Qc言語がわかりません

c言語でピラミッドを作りたいんですけどfor文もしくはwhile文を二回までしか使えません。ほかの方法を教えてください

Aベストアンサー

// 何度もスミマセン! スマホからなので、全体が見えなくて...
// ↓(第2稿) だと、アドレス計算が間違っていて暴走します。
// 3度目の正直
//

// drawing isosceles triangle

#define NUMBER_OF_LAYERS 5
#define FILL_CHAR ('*')
#define PAD_CHAR (' ')

#include <stdio.h>
#include <string.h>

int main()
{
char line[2 *(NUMBER_OF_LAYERS + 1)];
unsigned int count;

for( count = 0; count < NUMBER_OF_LAYERS; count++)
{
memset(line, PAD_CHAR, sizeof(line)- 1);
line[sizeof(line)- 1]='¥0';
memset(&line[NUMBER_OF_LAYERS - 1 - count, FILL_CHAR, 2 * count + 1);

puts(line); putchar('¥n');
}

return 0;
}

// 何度もスミマセン! スマホからなので、全体が見えなくて...
// ↓(第2稿) だと、アドレス計算が間違っていて暴走します。
// 3度目の正直
//

// drawing isosceles triangle

#define NUMBER_OF_LAYERS 5
#define FILL_CHAR ('*')
#define PAD_CHAR (' ')

#include <stdio.h>
#include <string.h>

int main()
{
char line[2 *(NUMBER_OF_LAYERS + 1)];
unsigned int count;

for( count = 0; count < NUMBER_OF_LAYERS; count++)
...続きを読む

QC++を学ぶためにCの知識は必須ですか?

将来の就職と個人的興味のため、C++を勉強しようと思ったんですが(C++にはオブヘクト志向があるため)ネットでいろいろ調べていると「Cが基盤になっているためCから勉強を始めたほうがいい」とありました。
正確にはどこまでの知識と経験が必要ですか?
そもそもC++を学ぶためにCの知識は必須ですか?

Aベストアンサー

まあ、Cの言語仕様を一通り軽くやっといた方が良いかも。
ポインター、配列、構造体、整数演算、型の表記の仕方とかは
結構癖があるから、事前に知っといた方が良いでしょう。

Cの言語仕様ってC++に比べて驚くほど小さいので
そんなに時間はかからないと思う。
最初からクラスも大変だし、最初はベターCから
始めるのも良いのでは。

しかし就職にC++が役立つかというと、確かに
c++使いまくりのシステムもあるが
Javaの方が圧倒的に有利というのは
覚えておいた方が良いでしょう。

Q5人分の氏名と英語、国語、数学の各科目の点数を二次元配列で格納して、成績ファイルにCSV形式で保存す

5人分の氏名と英語、国語、数学の各科目の点数を二次元配列で格納して、成績ファイルにCSV形式で保存するプログラム何ですが、考えてみてもよくわかりません。どなたかわかる方詳しく教えてくださいませんか?
ちなみに、C言語です。

Aベストアンサー

//yahoo知恵袋の方でも同じ質問が上がってたので。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char name[5][128]; //名前用の二次元配列
char subject[3][5]={"英語", "国語", "数学"};
int sub[5][3]; //点数用の二次元配列
int i, j;
fp=fopen("sample.csv", "w"); //書き込みモードはしらべてください
if(fp==NULL){puts("error"); exit(1);} //エラー処理

//5人分の氏名と得点は入力で2次元配列へ格納
for(i=0; i<5; i++){
printf(" 氏名 --> ");
scanf(" %s", name[i]);
for(j=0; j<3; j++){
printf("%s --> ", subject[j]);
scanf("%d",&sub[i][j]);
}
}

//CSV形式で保存する
for(i=0; i<5; i++){
fprintf(fp," %s %d %d %d\n", name[i], sub[i][0], sub[i][1], sub[i][2]);
}

fclose(fp);
return 0;
}

//実行結果
>type sample.csv
uhi 32 43 54
uho 65 45 46
usa 65 43 45
usi 76 45 46
aha 76 54 43

//yahoo知恵袋の方でも同じ質問が上がってたので。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char name[5][128]; //名前用の二次元配列
char subject[3][5]={"英語", "国語", "数学"};
int sub[5][3]; //点数用の二次元配列
int i, j;
fp=fopen("sample.csv", "w"); //書き込みモードはしらべてください
if(fp==NULL){puts("error"); exit(1);} //エラー処理

//5人分の氏名と得点は入力で2次元配列へ格納
for(i=0; i<5; i++){
printf(" 氏名 --> ");
scanf(" %s", n...続きを読む

QVisual Studio C#

public decimal PlanPrice
{
get
{
int x = 0;
decimal a;
a = (decimal)x;
return Settings.Default.PlanPrice;
}
}
public decimal ResultPrice
{get;private set;}
public decimal SubtractPrice
{
get
{
return ResultPrice - PlanPrice;
}
}
public decimal TotalPrice
{
get
{
decimal p =
_previousModel == null ?
0 :
_previousModel.TotalPrice;
return p + SubtractPrice ;
}
}
public decimal PercentComplete
{
get
{
return ResultPrice / PlanPrice;
}
}

↑のコードで達成率をResultPrice / PlanPriceで出そうと思ったのですが1月のように値が出ないのと、decimal型で書いているのに少数が出ないのはどうしてでしょうか?

public decimal PlanPrice
{
get
{
int x = 0;
decimal a;
a = (decimal)x;
return Settings.Default.PlanPrice;
}
}
public decimal ResultPrice
{get;private set;}
public decimal SubtractPrice
{
get
{
return ResultPrice - PlanPrice;
}
}
public decima...続きを読む

Aベストアンサー

https://oshiete.goo.ne.jp/qa/9843253.html

doubleがdecimalになっても同じです。

「public decimal PercentComplete」自体は小数点以下まで計算した値を返しているはずです。
なので、この部分だけ見せられても、原因はわかりません。

・PercentCompleteは 比率であって、百分率にはなっていないように見えます。
これを 100倍にするような計算をしているはずです。
それが int p = PercentComplete * 100 ; みたいにintで受けたりしてませんか?

・その表を表示するのに、どんなコントロールを使っているかがわかりませんが、
Columns[達成率].Format ="#,###,###" ;
みたいな感じの書式設定されていたりしませんか?
(.Netの書式設定がそのまま使えるとして)
https://msdn.microsoft.com/ja-jp/library/0c899ak8(v=vs.110).aspx#SpecifierD
上記書式だと、 小数点以下は表示されないし、 #の機能により整数部が 0 の場合は表示されません
1月が空欄なのは、 小数点以下非表示、整数部の0も表示されない、という状態なのでは

https://oshiete.goo.ne.jp/qa/9843253.html

doubleがdecimalになっても同じです。

「public decimal PercentComplete」自体は小数点以下まで計算した値を返しているはずです。
なので、この部分だけ見せられても、原因はわかりません。

・PercentCompleteは 比率であって、百分率にはなっていないように見えます。
これを 100倍にするような計算をしているはずです。
それが int p = PercentComplete * 100 ; みたいにintで受けたりしてませんか?

・その表を表示するのに、どんなコントロールを使っているか...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング