【初心者歓迎】C/C++室 Ver.102【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
2017/11/24(金) 17:05:28.65ID:ELoh0Abo
>>103
代入と比較は違う。
105デフォルトの名無しさん
垢版 |
2017/11/24(金) 17:07:52.77ID:QRhLqwOG
スーパー初心者か?
forでも書いてもいい。だが意味がないか低い。
「=」は代入だが「==」は代入でない。
2017/11/24(金) 17:08:50.74ID:L5ESShiZ
片山先生、ありがとうございました!
そういうことなのですね。理解できました、いつもありがとうございます!
2017/11/24(金) 17:38:47.92ID:lG8HVUMw
わかってる人にとってはクソみたいな質問だけど、
数学だと代入 (定義) するっていうのと等しいっていうのは区別がはっきりしないので、
そういうメンタルモデルで考えてると混乱しちゃうってのはわからんでもない。

とはいうものの、よっぽど出来の悪い入門書でもそこらへんわからんようなのは無いと思うんだが、
どういう学び方をしてるんだかちょっと疑問。
2017/11/24(金) 17:51:57.71ID:L5ESShiZ
なんかすみません
ネットで優しそうなサイトで進めてます
2017/11/28(火) 12:50:21.53ID:bi1wDt8X
数学のイコールには比較(の結果等しい)の意味しかないだろう
Pascalみたいに代入が:=なら良かったのに
2017/11/28(火) 12:57:44.05ID:cL+Re6N7
プログラムを記述する際、等しいかを比較するより、代入のほうが頻度が高いから
Cでは多く入力するであろう代入側を 1文字にして そうでない側を 2文字にした
って聞いたことがある
2017/11/28(火) 13:22:50.66ID:8wOk3LC1
Fortranだって代入は=だから、Cで採用されたのも仕方ない

とはいえ、文字数ごときにこだわらずに、:=を採用してくれていたらタラレバ
2017/11/28(火) 13:44:24.58ID:9QEYjjOS
力添えを頂きたい。
SunAwt系のソフト内で表示されているテキストを取得したいんだが、尻尾も掴めず困り果て、どうすれば良いか全く分からない状態。
何かヒントを頂けないだろうか。
2017/11/28(火) 13:50:31.60ID:1OfFiaid
>>112
別のプロセスから取得するって意味?
2017/11/28(火) 18:08:18.05ID:9QEYjjOS
>>113
YES。
別プロセスからテキストを取りたい。
他の例えばIEやハンドルが取れる様なソフト内の文字ならgettextやcom操作で取ったりできるがSun系のソフトは同じ様にはいかず、メモリを読むのかどうすればいいのか、知識が足りなくて検索も上手に出来ず...頭打ち状態。
何か足掛かりになる物を教えて頂きたい。
2017/11/29(水) 00:32:03.31ID:/GAULuFW
>>114
試したことないけどこれは?
http://www.oracle.com/technetwork/articles/javase/index-jsp-136191.html
2017/11/29(水) 13:08:28.50ID:GlJ85cMo
#include<stio.h>
int main(){
int i,num[5];

for(i=0;i<5;i++){
printf("***\n");
scanf("%*c%d"&num[i]);
}
}

実行し、num[]に、10、20,30,40,50と入力すると
num[0]の値は0、num[1]は20、その後50まで代入されてます
num[0]に10が代入されないのは何故なのでしょうか?
2017/11/29(水) 13:26:13.79ID:NrhyqkWd
>>116
"%*c"のせいじゃね
2017/11/29(水) 13:36:20.41ID:GlJ85cMo
>>117
そうでした。ありがとうございました。
2017/11/30(木) 14:49:53.66ID:t+LxFq0J
テフ?
2017/12/01(金) 03:20:07.32ID:VClmrWfc
boost::qiでマルチバイト文字を扱うにはどうすればいいんですかね
2017/12/01(金) 12:48:46.21ID:UzEJxhfp
5人の生徒に3教科のテストをし、その点数を入力する
入力後、
          テストA  テストB  テストC
 0点〜19点    0人    0人    0人
20点〜39点    0人    0人    0人
40点〜59点    2人    0人    1人
・・・
80点〜100点   1人    3人    2人

と集計する方法に悩んでいます。
どういう考え方が考えられますか?
2017/12/01(金) 13:06:08.20ID:p7Y4uOcI
>>120
char_に替わるパーサー書けばいいんじゃないかね
マルチバイトの最初の文字を認識する自作パーサーをmb1、マルチバイト文字のパーサーをmbcharとして
mbchar = (mb1 >> char_) || char_;
とか?
2017/12/01(金) 13:14:35.24ID:LYbXDWPH
>>121
宿題は自分で考えるのが原則。どこまで考えた?
2017/12/01(金) 13:21:20.74ID:UzEJxhfp
>>123
ありがとうございます。
入力された点数を3次元配列に格納するところまでです。
今は、繰り返し分を使い、配列に格納された数字が0でなかったら
その数字をカウントして人数を集計しようとしてるのですが、できていません
2017/12/01(金) 13:56:35.70ID:LYbXDWPH
>>124
なぜ3次元?生徒と教科がインデックスだから2次元では?
あと、表示さえすればいいだけなら、
効率度外視である教科のある得点範囲の人数をカウントするくらいできるでしょ。
効率考えるなら表示用に0で初期化した2次元配列を別に用意する。
2017/12/01(金) 14:01:47.55ID:UzEJxhfp
>>125
ありがとうございます。2次元です。
ten[5][3]で得点を格納したあとが進まないのです
得点範囲の人数のカウントについてもう少し考えてみます
127デフォルトの名無しさん
垢版 |
2017/12/02(土) 00:04:56.97ID:F3lbt2G4
中古本でプログラミング言語c++の3版が4000円で4版が6000円なんだが
やっぱり4版を買ったほうがいいのかな
2017/12/02(土) 00:18:15.85ID:4X8AnX6A
あんまり良い本じゃないから買わなくていい
129デフォルトの名無しさん
垢版 |
2017/12/02(土) 00:54:45.18ID:F3lbt2G4
>>128
そうなのか・・・聞いておいてよかった
ありがとう
2017/12/02(土) 09:08:29.93ID:XeWd0teH
>>125
昨日はありがとうございました
90行程度と長いプログラムになりましたが
人数をカウントし表示させることができました

カウントは、教科毎にfor文で呼び出し
20以下、20〜39、・・・80〜99、100とif文で条件指定し
各範囲で人数をカウントし、最後に表示させました

また分からないことがありましたらご指導お願いいたします。
2017/12/02(土) 14:58:42.41ID:XeWd0teH
ファイルを開いた回数を記録するというプログラムを作っています
int main(){
int count;
FILE *fp;

if((fp=fopen("log.txt","r"))==NULL){
count=0;
}else{
fscanf(fp,"log.txt",&count);
fclose(fp);
}

if((fp=fopen("log.txt","w"))==NULL){
printf("Error\n");
return -1;
}

count++;
printf("%d回目のプログラムを実行です\n",count);
fprintf(fp,"%d\n",count);
fclose(fp);
}
これを実行するたびに
2752513回目の・・・
3444737回目の・・・
2953217回目の・・・
となってしまい、ファイルを開いた数が記録されません

最初にlog.txtがない状態で実行したときの、一番最初だけ、countに1が代入され
log.txtにも1が記載されるのですが、2回目以降のcountには7桁の乱数みたいのが代入され記載されてしまいます
どうして不具合が出るのか分からなくなっております。よろしくご教授くださいませ
2017/12/02(土) 15:12:26.31ID:jpnrbmV1
fscanfで書式の指定ミス
2017/12/02(土) 15:16:24.33ID:XeWd0teH
>>132
さっそくありがとうございます。fscanf(fp,"%d",&count)と訂正しました。
初歩的なミスで申し訳ありませんでした、そしてありがとうございました。
2017/12/02(土) 15:18:37.18ID:Jd1ioDh8
>>131
> fscanf(fp,"log.txt",&count);
二番目の引数を再確認してみ
2017/12/02(土) 15:35:47.69ID:XeWd0teH
>>134
ありがとうございました。
おかげさまで正常にカウントされるよになりました。
確認不足でご迷惑おかけしました。ありがとうございます。
2017/12/02(土) 18:53:18.55ID:K6qIkKEG
超初心者です
c言語でGetPixelが動きません
どうすれば直るのか教えてください

COLORREF GetPixel (float 変数x, float 変数y); //指定座標の色取得。

if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行

//以下、実行するコード
2017/12/02(土) 19:09:54.54ID:4pmjT1Fk
>>136
>if float GetPixel(float 変数x, float 変数y == RGBCOLOR( 0, 0,255)) ; //指定座標のピクセルが青色ならコード実行

if (GetPixel(x, y) == RGBCOLOR( 0, 0,255)) {
条件が真のとき実行するコード
}
ではどうですか?
2017/12/04(月) 17:32:02.17ID:K3o+GgF3
boost::qiって読み方ブースト・チーでいいの?
2017/12/04(月) 18:32:18.36ID:m/Ygi57i
boostのパーサの使い方わかんね
2017/12/04(月) 21:33:58.20ID:K2rBoL+r
>>138
141デフォルトの名無しさん
垢版 |
2017/12/05(火) 04:28:16.53ID:NJ16QKFF
組み込みの場合例えばRs232Cのチャンネルが三つあるようなばあいにクラスに
するとIOの初期化がそれぞれ違う。しかもチャンネル1を初期化するとチャンネル3
にも影響する場合がある。こういう場合にはどんな風にクラスをつくったらいい?
2017/12/05(火) 10:59:54.97ID:BooJAJ3p
よろしくお願いします。

fp=fopen("out.txt","r");
while(fscanf(fp,"%d",&da2[i])!=EOF){
fscanf(fp,"%d",&da2[i]);
i++;
}
fclose(fp);

これを実行するとテキストファイルに記録されている整数を
一行飛ばしで読みだしてしまいます
どうして飛ばされる行ができてしまうのでしょうか?
2017/12/05(火) 11:22:39.33ID:tMsGMSrl
>>141
friend
2017/12/05(火) 11:42:25.43ID:x6DQdw1l
>>142
fscanf() を二箇所に書いているけれども、それでいいのですか?
2017/12/05(火) 11:54:34.95ID:GUcDlKUg
>>142
whileでのfscanfのあとでiを変更してないから次のfscanfで同じda2[i]に上書きしてる
2017/12/05(火) 12:02:08.68ID:BooJAJ3p
>>144>>145
そういう事だったのですね
ありがとうございました!
2017/12/05(火) 15:40:18.03ID:BooJAJ3p
再びよろしくお願いいたします。

int main(){
char ch1,ch2;
printf("二文字入力\n");
scanf("%c",&ch1);
 scanf("%c",&ch2);
printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2);
return 0;
}
これを実行すると、2回目のscanfを飛び越えてしまいます。
その理由と回避方法をご指南いただけませんでしょうか?
よろしくお願いいたします。
2017/12/05(火) 15:46:59.33ID:KBxdaLdg
再びよろしくお願いいたします。

int main(){
char buf[3], ch1,ch2;
printf("二文字入力\n");
fgets(buf, 3, stdin);
ch1 = buf[0];
ch2 = buf[1];
printf("ch1=[%c]\nch2=[%c]\n",ch1,ch2);
return 0;
}
2017/12/05(火) 16:20:49.08ID:BooJAJ3p
>>148
ありがとうございます
標準入力によって処理し、scanfを使わないということなのですね
文法を覚えて活用できるようにします
何度もありがとうございます
2017/12/05(火) 16:50:17.51ID:VZfNuCLu
>>147
改行文字を次のscanfで読込むから
回避方法は例えば
ttp://blog.unfindable.net/archives/604
2017/12/05(火) 16:59:28.01ID:BooJAJ3p
>>150
ありがとうございます
しっかり理解できるには時間がかかりますが
とりあえず、お礼申し上げます
改行文字を処理しないと次のscanfが改行文字を読んでしまうのですね
とても勉強になりますし、皆様のおかげで前進できます
ありがとうございます
2017/12/07(木) 00:17:29.58ID:fcKh4od9
皆すげーな
俺みたいなライブラリのインクルードが通せなくて
そもそもコンパイルって何だっけってところから調べるような奴には恐れ多いわ
2017/12/07(木) 12:53:50.82ID:4zvLzkC0
毎日すみません。ご教授お願いします。

out,txtに記録されている下記文字に対して
---------------
AAA BB
ababb
099
---------------
ファイルを開いて、文字列を読み出し
配列で一文字一文字を表示させようとしています

i=0;
fp=fopen("out.txt","r");
while(fscanf(fp,"%c",&c)!=EOF){
i++;
}
for(t=0;t<=i;t++){
printf("%c\n",c[t]);
}

これだと18行表示されますが
表示されたのは全く異なるものでした
どこが不適切なのか2日考えても分かりません
いつも申し訳ありません><よろしくご指導願います
2017/12/07(木) 13:10:52.74ID:dicAL8ON
>>153
c は大きさの十分ある char への配列と想定した前提で
fscanf の引数がおかしい

1文字毎に配列へ順繰りに読み込ますのなら
 fscanf(fp,"%c", &c[i]);
こうなってないと
2017/12/07(木) 13:39:27.89ID:4zvLzkC0
>>154
&が抜けていたのは恥ずかしいです
申し訳ありませんでした
しっかり覚えさせていただきます

プログラムもちゃんと動きました
いつも簡単なことばかりなのに理解が浅くてすみません
とても勉強になりました。ありがとうございました
2017/12/07(木) 16:08:02.33ID:dicAL8ON
書いてあることが違うけど(&が抜けていたのではなく [i] がない)
本当に分かっているのか不安になる返答だが、そのうち慣れてくるだろう。

(文字と文字列の違いと (f)scanf に渡すフォーマットの指示と 変数をどう渡すか
 の一連が整理されてないと、また繰り返すだろう)
2017/12/07(木) 16:29:02.63ID:4zvLzkC0
>>156
はい、ありがとうございます。
配列にして直してあります。
fscanf(fp,"%s",c)として読み込んだ後に
c[i]で一文字一文字表示させられると思い込んでいました

先ほどの156のおかげでfscanf(**** &c[i])を覚えられました
ありがとうございます!感謝してます
2017/12/08(金) 15:46:12.24ID:b0CgZ3o1
こんにちは。どうか本日もよろしくお願いいたします。
10人分の点数を入れて表示するプログラムです。
下記のように作成したのですが、main()内から関数を呼び出すところで
parameter names(without typesというエラーがでてしまいます。
どうかよろしくお願いします。

#include<stdio.h>
void da(int ten[10]){
int i;
for(i=0;i<10;i++){
printf("%d input ",i);scanf("%d",&ten[i]);
}
return;
}

void out(int ten[10]){
int i;
for(i=0;i<10;i++){
printf("%d人目 : %d点\n",i,ten[i]);
}
return;
}

int main(){
int ten[10];
void da(ten);
void out(ten);
return 0;
}
2017/12/08(金) 15:56:23.80ID:8LWGXCju
>>158

#include <stdio.h>
void da(int ten[10]){
int i;
for(i = 0; i < 10; i++){
printf("%d input ", i); scanf("%d",&ten[i]);
}
}

void out(int ten[10]){
int i;
for(i = 0; i < 10; i++){
printf("%d人目 : %d点\n", i + 1, ten[i]);
}
}

int main(void) {
int ten[10];
da(ten);
out(ten);
return 0;
}
2017/12/08(金) 16:02:05.10ID:C0Y4l8FE
そろそろうっとしいな
2017/12/08(金) 16:06:39.52ID:b0CgZ3o1
すみません、ここは質問するところじゃなかったのですね
他のC言語のスレから誘導されたので、こちらで質問していいかと思ったのですが
今後質問は控えます。自力で学習を進めようと思います。
ご迷惑をおかけしてすみませんでした。
片山先生、本日もありがとうございました。感謝です。
2017/12/16(土) 05:14:03.17ID:Nra/Nglb
#pragma pack(1)
struct {
char a;
short b;
int c;
} x;
Cでバイナリデータとかパディング除けに上のような感じに書いて読み書きしたりしますが(例は適当)、
C++ではpragmaを使用せず記述量も少ないスマートな記述方法はあるでしょうか?
2017/12/16(土) 09:10:24.00ID:67ZudMHx
ない
2017/12/16(土) 09:52:53.87ID:Nra/Nglb
ありがとうございます。やっぱりないですか。
pragmaがコンパイラ依存とか書かれてて非常に嫌なんですが慣れます。
2017/12/16(土) 16:18:44.15ID:2NfYNG63
#include <pshpack1.h>
...
#include <poppack.h>
2017/12/17(日) 02:47:22.67ID:T7tjmkgj
C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか?
167デフォルトの名無しさん
垢版 |
2017/12/18(月) 01:24:26.49ID:vrG0ZJDQ
>>164
そのような構造体で直接読み書きしないのがベスト
168デフォルトの名無しさん
垢版 |
2017/12/21(木) 16:50:57.91ID:FN6C0PcS
ここが適切かわかりませんが、

make の Makefile を Visual Studio や NetBeans 等の IDE の
プロジェクトファイルに変換するツールはありませんか。
2017/12/21(木) 16:54:33.43ID:fHSTQ7CK
makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。
170168
垢版 |
2017/12/21(木) 17:10:02.95ID:FN6C0PcS
>>169 そこまでは分ったのですが、
Makefile を CMakeLists.txt に変換するのはありますか?

見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、
Python のスクリプトだけでした。。
2017/12/21(木) 17:15:07.21ID:fHSTQ7CK
>>170
ない。
172168
垢版 |
2017/12/21(木) 17:25:55.41ID:FN6C0PcS
>>171 ありがとうございました。
CMake 勉強します。
2018/01/09(火) 19:29:59.07ID:cBwAL66C
ライブラリ作成の指南書みたいな本ってありますか。
2018/01/09(火) 22:23:30.03ID:9ubHCBZ8
環境によるんじゃ?
175デフォルトの名無しさん
垢版 |
2018/01/10(水) 01:19:44.15ID:CtX3Z92R
とりあえず
c++のためのapiデザイン
でも読んでみるといいと思う
2018/01/10(水) 02:59:55.08ID:QjjLPcN0
読んでみるわ
2018/01/13(土) 06:17:45.46ID:hj3TLdcf
定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの?
2018/01/13(土) 09:08:14.97ID:P3TI7O0+
趣味とか宗教とかの話であって、別に使って問題ない
ただ名前の先頭だったり、2回連続で使ったりすると
予約語に引っかかることがあるので注意(定数の場合も)
2018/01/13(土) 09:13:05.82ID:M+vRxjCB
その辺有名ライブラリのルール付けとか調べてみるのもいいかもね
2018/01/13(土) 09:23:55.53ID:M+vRxjCB
GoogleがC++のスタイルガイド公開してる
これも参考になりそう
2018/01/16(火) 10:54:12.13
C++で何つくんの?
GUIプログラムならC#のほうが圧倒的に簡単だし
2018/01/16(火) 11:06:50.90ID:E1MTmeKy
CAD
2018/01/16(火) 11:07:58.52
そんな上級者にしか用途がない言語か
2018/01/16(火) 11:24:35.41ID:/aUGqjlJ
個人的にC/C++は高級なアセンブラだと思っている
C#とは存在するレイヤが違うから、比較条件として用途を挙げるのはちょっと違うかなって
2018/01/16(火) 11:25:50.16
で、何つくんの?
高級アセンブリの用途は?
2018/01/16(火) 12:09:46.86ID:J2S5K16W
画像処理
大規模ゲーム開発
2018/01/16(火) 12:32:40.41ID:6i0TmEx8
GoogleChrome
2018/01/16(火) 13:22:26.10ID:6uwiuQcq
ゲームとか速度が必要な場面でまだまだ使われてるでしょ
2018/01/16(火) 15:46:42.36ID:e8xaSAkW
CPUパワーを必要とするようなまとまった処理は
C/C++のような低級な高級言語が適している
組み込み用の小規模マイコンもCがほとんど
2018/01/16(火) 19:09:30.75ID:Vb1E5r0O
Pythonのライブラリも結局はCで作ってたりするしな。
2018/01/17(水) 00:06:48.74ID:kWLOq5lU
GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。
2018/01/17(水) 01:07:00.24ID:X2mlxDcY
OpenGLもC#か大変そうだな
193愛知人
垢版 |
2018/01/17(水) 09:14:59.53
Unityでいいよね
2018/01/17(水) 11:15:20.21ID:X2mlxDcY
ライセンス料が只ならいいよ
2018/01/17(水) 11:23:31.36ID:4ILD3/U5
Unityでも速度が必要な場所はC++で書いて呼び出し
196愛知人
垢版 |
2018/01/17(水) 11:48:22.30
なんでC++ってendlいるの?
2018/01/17(水) 12:24:58.46ID:/z6RTYd5
ちょっと何言ってるかわかんないです
198愛知人
垢版 |
2018/01/17(水) 13:34:56.30
なんでprintf使わないの?
2018/01/17(水) 13:41:03.90ID:lhJfQamL
浪人と引き換えに無知を手に入れた男
200愛知人
垢版 |
2018/01/17(水) 13:43:22.44
で、返答は?
2018/01/17(水) 14:07:42.46ID:l2H41H1D
>>198
<cstdio>は正しくC++だからprintf使っても構わん 味噌 よ
後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね
endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?

愛知語は詳しくないけど察し手羽先
202愛知人
垢版 |
2018/01/17(水) 14:16:18.48
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w
2018/01/17(水) 14:19:41.37ID:l2H41H1D
言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て
「人生を無駄にした」と真顔で後悔してるところだから
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況